アプリの強制終了の報告はGoogle Playのデベロッパーコンソールでも確認できますが、ユーザに送ってもらわなければなりません。
この1クッションの手順が結構面倒なため、デベロッパーコンソールにはなかなか送ってもらえません。
そのため、GoogleAnalyticsを使用して自動的に送ってもらうようなサンプルを紹介します。
サンプルコードは以下のとおりです。
Androidのバージョン、端末名、エラー内容を送信します。
/** * 原文のスタックトレースを送信します。 * * @author yoshihide-sogawa * */ public class AnalyticsRetracableUncaughtExceptionHandler implements UncaughtExceptionHandler { /** {@link Context} */ private Context mApplicationContext; /** Androidのデフォルトの{@link UncaughtExceptionHandler} */ private UncaughtExceptionHandler mExceptionHandler; /** 改行の代用文字(Analyticsで改行文字が使用できないため) */ private static final String BR = "="; /** * コンストラクタ * * @param applicationContext * {@link Context} */ public AnalyticsRetracableUncaughtExceptionHandler(final Context applicationContext) { mApplicationContext = applicationContext; mExceptionHandler = Thread.getDefaultUncaughtExceptionHandler(); } /** * {@inheritDoc} */ @Override public void uncaughtException(final Thread thread, final Throwable ex) { // 非同期でアナリティクストラックを実行 new AsyncTask<Void, Void, Void>() { @Override protected Void doInBackground(final Void... voids) { try { // トラックイベントを生成 doTrackEvent(ex); } catch (Exception e) { // エラーがあってもクラッシュを防止 } finally { // 強制終了 mExceptionHandler.uncaughtException(thread, ex); } return null; } }.execute(); } /** * トラックイベントを実行します。 * * @param ex * {@link Throwable} */ private void doTrackEvent(final Throwable ex) { final StringBuilder actionBuilder = new StringBuilder(); // バージョン情報 actionBuilder.append("versionCode:"); actionBuilder.append(AppUtils.getVersionCode(mApplicationContext)); final StringBuilder errorMessageBuilder = new StringBuilder(); // OS errorMessageBuilder.append("os:"); errorMessageBuilder.append(Build.VERSION.SDK_INT); errorMessageBuilder.append(BR); // モデル errorMessageBuilder.append("model:"); errorMessageBuilder.append(Build.MODEL); errorMessageBuilder.append(BR); errorMessageBuilder.append(Log.getStackTraceString(ex)); // アナリティクスに送信 final GoogleAnalyticsTracker tracker = GoogleAnalyticsTracker.getInstance(); tracker.startNewSession("UA-XXXXXXXX-X", mApplicationContext); tracker.trackEvent("error", actionBuilder.toString(), errorMessageBuilder.toString(), 1); } }
あとは、アプリケーションクラス等で以下の記述をすると準備完了です。
Thread.setDefaultUncaughtExceptionHandler(new AnalyticsRetracableUncaughtExceptionHandler(this));
ちなみにGoogleAnalyticsのV2からは、どういうエラーでアプリが強制終了したかを自動的に送信してくれます。
詳細はV2の記事を参考にしてください。
0 件のコメント:
コメントを投稿