Firebase Performance Monitoring for Android を使ってみる

このガイドでは、アプリで Firebase Performance Monitoring を使用する方法を次の手順に沿って説明します。

  1. 前提条件
  2. Android プロジェクトに Firebase を追加する
  3. Performance Monitoring をアプリに追加する
  4. (オプション)カスタム トレースと 1 つ以上のカウンタをアプリに定義する
  5. (オプション)特定のメソッドをトレースするために @AddTrace アノテーションを追加する
  6. (オプション)Android Vitals で Performance Monitoring を使用する
  7. Firebase コンソールで Performance Monitoring の結果を確認する
  8. アプリをデプロイし、Firebase コンソールで結果をレビューする

Performance Monitoring は現在ベータ版です。

前提条件

事前に次の環境を準備しておく必要があります。

  • Android 4.0(Ice Cream Sandwich)以降、および Google Play 開発者サービス 15.0.0 以降が搭載された端末
  • Android SDK マネージャーで利用可能な Google レポジトリにある Google Play 開発者サービス SDK
  • Android Studio の最新バージョン(バージョン 2.2 以降)

Android プロジェクトに Firebase を追加する

他の Firebase 機能を使用している場合には、Firebase Assistant を使用して Android Studio からアプリに Firebase を追加できます。

Android Studio で Firebase Assistant を開く方法:

  1. [ツール] > [Firebase] をクリックし、[Assistant] 画面を開きます。
  2. リストにある機能のいずれかをクリックして詳細を表示(例: Analytics)してから、チュートリアル リンクをクリックします(例: Analytics イベントを記録する)。
  3. [Firebase へ接続] ボタンをクリックして Firebase に接続し、必要なコードをアプリに追加します。

他の Firebase 機能を使用していない場合には、アプリに手動で Firebase を追加できます。

Performance Monitoring をアプリに追加する

  1. プロジェクト レベルの build.gradle ファイルを開き、次を追加します。
    1. buildscript -> repositories セクション:
      jcenter()
    2. buildscript -> dependencies セクションで、Firebase 依存関係を追加します。
      • Android Studio 2.x の場合:
        classpath 'com.google.firebase:firebase-plugins:1.1.1'
      • Android Studio 3.x の場合:
        classpath 'com.google.firebase:firebase-plugins:1.1.5'
  2. アプリレベルの build.gradle ファイルを開き、次を追加します。
    1. apply plugin: 'com.android.application' の下に次の行を追加します。
      apply plugin: 'com.google.firebase.firebase-perf'
    2. dependencies セクションに次を追加します。
      compile 'com.google.firebase:firebase-perf:15.0.0'
    3. アプリで他の Firebase SDK を使用している場合は、SDK のバージョンも 15.0.0 に変更する必要があります。
  3. アプリを再コンパイルします。 自動トレースと HTTP/S ネットワーク リクエストがモニタリングされるようになりました。

(オプション)カスタム トレースと 1 つ以上のカウンタをアプリに定義する

カスタム トレースは、アプリ内の特定のコードに関連付けられたパフォーマンス データのレポートです。カスタム トレースの詳細については、Performance Monitoring の概要を参照してください。アプリには複数のカスタム トレースを設定でき、一度に複数のカスタム トレースを実行できます。各カスタム トレースには、アプリ内のパフォーマンス関連のイベントをカウントする 1 つ以上のカウンタを設定でき、これらのカウンタは、それぞれを作成するトレースに関連付けられています。

  1. .java ファイルの先頭で、これらの Performance Monitoring クラスをインポートします。

    Android

    import com.google.firebase.perf.FirebasePerformance;
    import com.google.firebase.perf.metrics.Trace;

  2. アプリのトレースを開始するコードの直前に、次のコード行を追加して、test_trace というトレースを開始します。

    Android

    Trace myTrace = FirebasePerformance.getInstance().newTrace("test_trace");
    myTrace.start();
  3. アプリで発生するパフォーマンス関連のイベント(キャッシュのヒットやミスなど)をカウントするには、イベントが発生するごとに次のようなコード行を追加します。異なる種類のイベントをカウントするには、item_cache_hit または item_cache_miss 以外の文字列を使用してイベント名を指定します。

    Android

    Item item = cache.fetch("item");
    if (item != null) {
        myTrace.incrementCounter("item_cache_hit");
    } else {
        myTrace.incrementCounter("item_cache_miss");
    }
  4. トレースを停止するコードの直後に次のコード行を追加します。

    Android

    myTrace.stop();

(オプション)特定のメソッドをトレースするために @AddTrace アノテーションを追加する

アプリ内のメソッドに @AddTrace アノテーションを追加すると、結果のトレースを識別する文字列を設定できます。これにより、このメソッドの先頭でトレースを開始し、メソッドの完了時にトレースを停止できます。この方法で作成されたトレースにはカウンタはありません。

たとえば、onCreate() メソッドの呼び出し時に実行される onCreateTrace というトレースを作成するには、次のようなコードを使用します。

Android

import com.google.firebase.perf.metrics.AddTrace;
...
@Override
@AddTrace(name = "onCreateTrace", enabled = true/\*Optional\*/)
protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ...
        ...
}

(オプション)Android Vitals で Performance Monitoring を使用する

Performance Monitoring を使用すると、Play Developer Console の Android Vitals ダッシュボードで提供される情報の詳細を確認できます。Android Vitals ダッシュボードに表示された問題の原因がアプリのどの部分にあるのかわからない場合、Performance Monitoring は役立ちます。

Android Vitals ダッシュボードに、フレームを生成して画面に表示するまでに時間がかかりすぎていることが示されている場合、Performance Monitoring を使用して、この問題の原因がアプリのどの部分にあるのかを分析できます(たとえば、ホーム画面またはコンテンツ画面に使用される特定の Activity など)。次のように、API レベル 24 以上を実行している端末では、アプリで表示の遅いフレームとフリーズしたフレームの両方をカウントできます。

  1. ユーザーと Activity のやり取りが開始したときに myTrace.start() を呼び出し、カスタム トレースを開始します。
  2. FrameMetricsAggregator() を呼び出し、各フレームの TOTAL_DURATION 指標をキャプチャするオブジェクトを作成します。
  3. myTrace.stop() を呼び出してカスタム トレースを停止する直前に、次の処理を行います。
    1. FrameMetricsAggregator.stop() を使用して、FrameMetricsAggregator オブジェクトから TOTAL_DURATION の値を取得します。
    2. frames カウンタをインクリメントして、フレームの総数を取得します。また、16ms を超える TOTAL_DURATION 値の slow_frames カウンタをインクリメントし、700ms を超える TOTAL_DURATION 値の frozen_frames カウンタをインクリメントします(または、レンダリングの遅延が発生しない場合には、これらのカウンタを 0 に設定します)。
  4. Firebase コンソールで、最も遅いフレームまたはフリーズ フレームのある端末を探し、アプリでレンダリングの遅延が発生するケースを切り分けます。

Android Vitals ダッシュボードでレンダリングが遅いフレームを検出する方法については、レンダリング遅延をご覧ください。

Firebase コンソールで Performance Monitoring の結果を確認する

  1. Android Studio でアプリを作成します。
  2. 最新のイメージと Google Play 開発者サービス 15.0.0 以降を含む Android エミュレータを使用するか、Google Play 開発者サービス 15.0.0 以降のテスト端末を使用して、アプリをテストします。
  3. Firebase コンソールに Performance Monitoring の結果が表示されていることを確認します。結果は 12 時間以内に表示されます。

アプリをデプロイし、Firebase コンソールで結果を確認する

1 台以上のテスト端末を使用して Performance Monitoring を検証したら、アプリのアップデート バージョンをユーザーにデプロイし、Firebase コンソールを使用してパフォーマンス データをモニタリングできます。

(オプション)特定のネットワーク リクエストのモニタリングを追加する

Performance Monitoring はネットワーク リクエストを自動的に収集します。アプリのほとんどのネットワーク リクエストが対象となりますが、一部のリクエストは報告されない可能性があります。Performance Monitoring に特定のネットワーク リクエストを含めるには、アプリに次のコードを追加します。

Android
HttpMetric metric =
    FirebasePerformance.getInstance().newHttpMetric("https://www.google.com",
    HttpMethod.GET);
final URL url = new URL("https://www.google.com");
metric.start();
HTTPURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setDoOutput(true);
conn.setRequestProperty("Content-Type", "application/json");
try {
  DataOutputStream outputStream = new DataOutputStream(conn.getOutputStream());
  outputStream.write(data);
} catch (IOException e) { }
metric.setRequestPayloadSize(data.length);
metric.setHttpResponseCode(conn.getResponseCode());
printStreamContent(conn.getInputStream());

conn.disconnect();
metric.stop();

この方法で個別にキャプチャした HTTP/s ネットワーク リクエストは、Performance Monitoring で自動的にキャプチャされたネットワーク リクエストとともに Firebase コンソールに表示されます。

既知の問題

  • Firebase Plugin バージョン 1.1.0 で、Guava の依存関係が一致せず、次のエラーが発生する可能性があります。

    Error:Execution failed for task ':app:packageInstantRunResourcesDebug'.
    > com.google.common.util.concurrent.MoreExecutors.directExecutor()Ljava/util/concurrent/Executor;

    このエラーが表示された場合は、バージョン 1.1.1 にアップグレードするか、プロジェクト レベルの build.gradle ファイルの buildscript -> dependencies セクションで、上記の classpath ステートメントを以下に置き換えてください。

    classpath ('com.google.firebase:firebase-plugins:1.1.0') {
                exclude group: 'com.google.guava', module: 'guava-jdk5'
    }
  • Performance Monitoring がモニタリングするのは、OkHttp HTTP クライアント バージョン 3.x.x で作成された HTTP/S ネットワーク リクエストだけです。
  • Performance Monitoring は、HTTP content-length ヘッダーの値に基づいて HTTP/S ネットワーク リクエストのペイロード サイズの合計を報告します。この値は正確とは限りません。
  • Performance Monitoring は、マルチプロセスの Android アプリのメインプロセスのみをサポートしています。
  • com.google.firebase.firebase-perf Gradle プラグインは、自動トレースと HTTP/S ネットワーク リクエストのモニタリングを無効にする DexGuard と互換性がありません。アプリで DexGuard を使用している場合、SDK で追加したカスタム トレースは正常に動作します。
  • com.google.firebase.firebase-perf Gradle プラグインには、非推奨となった Jack との互換性はありません。

統合のデバッグ

以下のように、アプリの AndroidManifest.xml ファイルの <application> 要素に <meta-data> 要素を追加することで、ビルド時に Performance Monitoring のデバッグ ロギングを有効にすることができます。

<application>
   ...
<meta-data android:name="firebase_performance_logcat_enabled" android:value="true" />
   ...
</application>

logcat フィルタリングを使用して、トレースと HTTP/S ネットワーク リクエストのロギングを表示できます。Performance Monitoring のログメッセージには FirebasePerformance のタグが付けられており、次のコマンドを使用してフィルタできます。

adb logcat -s FirebasePerformance

次のステップ

フィードバックを送信...

ご不明な点がありましたら、Google のサポートページをご覧ください。