2012年10月17日水曜日

GoogleAnalyticsを利用したエラー報告

チームEGGの曽川です。

アプリの強制終了の報告は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 件のコメント:

コメントを投稿