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


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);