クラッシュと例外

このドキュメントでは、Android 向け Google アナリティクス SDK v4 を使った クラッシュと例外の測定についての概要を説明します。

概要

クラッシュと例外の測定では、アプリで発生したクラッシュと例外(捕捉された例外と 捕捉されなかった例外)の数と種類を測定できます。 例外には次のフィールドがあります。

フィールド名 必須 説明
Description String いいえ 例外の説明で、最大 100 文字です。null を 指定できます。
isFatal boolean 必須 例外が致命的であったかどうかを示します。 true の場合は致命的です。

クラッシュと例外のデータは、主にクラッシュと例外レポートに 表示されます。

捕捉された例外

捕捉された例外とは、アプリの例外ハンドラのコードで定義 したエラーです(データのリクエスト時にネットワーク接続の タイムアウトが発生した場合など)。

捕捉された例外を測定するには、トラッカーの例外フィールドに値を設定し、 ヒットを送信します。次の例をご覧ください。

// Get tracker.
Tracker t =
    ((AnalyticsSampleApp) getActivity().getApplication()).getTracker(TrackerName.APP_TRACKER);

// Build and send exception.
t.send(new HitBuilders.ExceptionBuilder()
    .setDescription(getExceptionMethod() + ":" + getExceptionLocation())
    .setFatal(getExceptionFatal())
    .build());

getTracker メソッドの詳細については、高度な設定の説明をご覧ください。

捕捉されなかった例外

捕捉されなかった例外は、アプリの実行時に予期しない事態が発生した インスタンス(多くの場合は致命的でアプリがクラッシュしたインスタンス) を表します。捕捉されなかった例外は、Google アナリティクスに自動的に送信できます。 それには、ga_reportUncaughtExceptions の設定値を指定するか、 ExceptionReporter クラスを使用します。

自動設定

アプリで捕捉されなかった例外を Google アナリティクスへすべて 自動的に送るには、XML 設定ファイルに次の行を追加します。

<bool name="ga_reportUncaughtExceptions">true</bool>

自動例外測定を使って例外を送信すると、その例外はスレッド (Thread)のデフォルト例外ハンドラに 渡されます。

高度な実装

高度な実装を使っていて、ga_reportUncaughtExceptions の設定値を使っていない場合は、捕捉されなかった例外の自動測定を実装する際に ExceptionReporter クラスを使用します。

ExceptionReporter は、アプリ内の特定のスレッドやすべてのスレッドで、補足されなかった例外のデフォルト ハンドラとして機能します。ExceptionReporter クラスでは、Google アナリティクスに例外を送った後で、捕捉されなかった例外のハンドラ(ご自身で作成したハンドラ)に、オプションでその例外を渡すこともできます。

次のコードは、新しい ExceptionReporter オブジェクトを作成して、捕捉されなかった例外の新たなデフォルト ハンドラに設定しています。その結果、捕捉されなかった例外はすべて Google アナリティクスに送られて、捕捉されなかった例外の以前のハンドラに渡されます。ほとんどのアプリでは、デフォルト ハンドラがその例外をログに記録して、アプリを停止します。

Thread.UncaughtExceptionHandler myHandler = new ExceptionReporter(
    myTracker,
    Thread.getDefaultUncaughtExceptionHandler(),
    context);

// Make myHandler the new default uncaught exception handler.
Thread.setDefaultUncaughtExceptionHandler(myHandler);

自動例外測定を使う場合は、次の点にご注意ください。

  • 自動例外測定を使って送られた例外はすべて、Google アナリティクスで致命的な例外としてレポートされます。
  • Description フィールドは、例外の種類、クラス名、メソッド名、スレッド名を使ってデフォルトで自動的に設定されます。

例外説明の解析

SDK には、例外の説明を取得して Google アナリティクスへ送るプロセスを簡略化する StandardExceptionParser が用意されています。次の例をご覧ください。

// Get tracker.
Tracker t = ((AnalyticsSampleApp) getActivity().getApplication()).getTracker(
    TrackerName.APP_TRACKER);

// Using StandardExceptionParser to get an Exception description.
try {
    // Request some scores from the network.
    ArrayList<Integer> highScores = getHighScoresFromCloud();
} catch (IOException e) {
    t.send(new HitBuilders.ExceptionBuilder()
        .setDescription(new StandardExceptionParser(this, null)
            .getDescription(Thread.currentThread().getName(), e))
        .setFatal(false)
        .build()
    );

    ... // Display alert to user that high scores are currently unavailable.
}

また、独自のパーサーを実装するには、ExceptionParser インターフェース を実装し、Google アナリティクスに例外を送る際に、その setDescription メソッドを呼び出します。