Edited at

AndroidのWebViewのバージョンをCrashlyticsに投げる

More than 3 years have passed since last update.


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するだけです。

たとえば下記のようなクラスを用意して、


CrashlyticsUtils.java

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を合わせて取得することができます。


MainActivity.java

String userAgentString = webView.getSettings().getUserAgentString();

CrashlyticsUtils.setUserAgent(userAgentString);

qiita.png