Android 5.0(Lollipop)以降のWebView
Android 4.4 (KitKat)までは、WebViewがOSに組み込まれていたので、
Chromiumのバグがあった場合、その修正や機能追加などは、
OS自体のアップデートをする必要がありました。
Android 5.0(Lollipop)以降では、ここにもあるとおり、
WebViewがOSから切り離され、Google Play ストア経由で
「Android System WebView」としてアップデートできるようになりました。
クラッシュレポート
今までWebViewを使っているアプリでは、
デバイス ✕ OSのバージョン
上記のパターンでバグの再現条件の調査を行うことができましたが、今後は
デバイス ✕ OSのバージョン ✕ Chromiumのバージョン
上記のようにChromiumのバージョンも考慮しなければならない可能性があります。
Androidアプリのクラッシュレポートを取得するサービスとして有名なCrashlyticsでは、
標準でデバイスやOSのバージョンなどを取得することはできますが、
WebViewで用いられているChromiumのバージョンを取得することはできません。
Crashlyticsはカスタムキーを設定してログを残すことができるので、これを使って
クラッシュ時にWebViewのUserAgentを合わせてCrashlyticsに投げるようにします。
実装
WebViewのUserAgentをパースするために、
gradleを使って導入できたので、Wootheeを使います。
準備はbuild.gradleのdependenciesに
compile 'is.tagomor.woothee:woothee-java:1.0.0'
を追加してbuildするだけです。
たとえば下記のようなクラスを用意して、
package com.example.log;
import com.crashlytics.android.Crashlytics;
import java.util.Map;
import is.tagomor.woothee.Classifier;
public class CrashlyticsUtils {
public CrashlyticsUtils() {
throw new AssertionError();
}
private static final String NAME = "name";
private static final String OS_VERSION = "os_version";
private static final String CATEGORY = "category";
private static final String OS = "os";
private static final String VENDOR = "vendor";
private static final String VERSION = "version";
public static void setUserAgent(final String userAgentString) {
Map<String, String> userAgent = Classifier.parse(userAgentString);
Crashlytics.setString(NAME, userAgent.get(NAME));
Crashlytics.setString(OS_VERSION, userAgent.get(OS_VERSION));
Crashlytics.setString(CATEGORY, userAgent.get(CATEGORY));
Crashlytics.setString(OS, userAgent.get(OS));
Crashlytics.setString(VENDOR, userAgent.get(VENDOR));
Crashlytics.setString(VERSION, userAgent.get(VERSION));
}
}
それをWebViewをもつクラスから実行すれば、クラッシュした際に
WebViewのUserAgentを合わせて取得することができます。
String userAgentString = webView.getSettings().getUserAgentString();
CrashlyticsUtils.setUserAgent(userAgentString);