コンソールへ移動

Android 向け Performance Monitoring を使ってみる

始める前に

まだ追加していない場合は、Firebase を Android プロジェクトに追加します

ステップ 1: Performance Monitoring をアプリに追加する

  1. モジュール(アプリレベル)の Gradle ファイル(通常は app/build.gradle)で、次の操作を実行します。

    • Performance Monitoring Gradle プラグインを追加します。
    • Performance Monitoring Android ライブラリの依存関係を追加します。
    apply plugin: 'com.android.application'
    // Apply the Performance Monitoring plugin to enable instrumentation
    apply plugin: 'com.google.firebase.firebase-perf'
    
    dependencies {
        // ...
    
        implementation 'com.google.firebase:firebase-core:16.0.9'
    
        // Add the dependency for the Performance Monitoring library
        implementation 'com.google.firebase:firebase-perf:17.0.0'
    }
    
  2. ルートレベル(プロジェクト レベル)の Gradle ファイル(build.gradle)に、Performance Monitoring プラグインを含めるためのルールを追加します。

    buildscript {
    
        repositories {
          // Add the following repositories:
          jcenter()  // Bintray's repository
          google()   // Google's Maven repository
        }
    
        dependencies {
          // ...
    
          classpath 'com.google.gms:google-services:4.2.0'  // Google Services plugin
    
          // Add the dependency for the Performance Monitoring plugin
          classpath 'com.google.firebase:perf-plugin:1.2.1'  // Performance Monitoring plugin
        }
    }
    
  3. アプリを再コンパイルします。

これで、Firebase が自動トレースHTTP/S ネットワーク リクエストをモニタリングするようになります。

ステップ 2: Firebase コンソールで Performance Monitoring の結果を確認する

  1. Android Studio でアプリをビルドします。

  2. 次のいずれかでアプリをテストします。

    • 最新のイメージと Google Play 開発者サービス 15.0.0 以降を含む Android エミュレータ

    • Google Play 開発者サービス 15.0.0 以降のテストデバイス

  3. Firebase コンソールに Performance Monitoring の結果が表示されていることを確認します。

    結果は通常 12 時間以内に表示されます。

ステップ 3: (省略可)カスタム トレースとカスタム指標を追加する

カスタム トレースは、アプリ内の特定のコードに関連付けられたパフォーマンス データのレポートです。カスタム トレースの詳細については、Performance Monitoring の概要を参照してください。

アプリには複数のカスタム トレースを設定し、一度に複数を実行できます。各カスタム トレースには、アプリ内のパフォーマンス関連のイベントをカウントする 1 つ以上の指標を設定でき、これらの指標は、指標を作成するトレースに関連付けられています。

カスタム トレースと指標の名前には制限があります。先頭または末尾が空白でなく、先頭がアンダースコア(_)でない 32 文字以下の名前にする必要があります。

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

    import com.google.firebase.perf.FirebasePerformance;
    import com.google.firebase.perf.metrics.Trace;
    
  2. カスタム トレースの開始と停止には、トレース対象のコードを次のようなコード行で囲みます(この例ではカスタム トレース名を test_trace としています)。

    Java

    Trace myTrace = FirebasePerformance.getInstance().newTrace("test_trace");
    myTrace.start();
    
    // code that you want to trace
    
    myTrace.stop();
    

    Kotlin

    val myTrace = FirebasePerformance.getInstance().newTrace("test_trace")
    myTrace.start()
    
    // code that you want to trace
    
    myTrace.stop()
    
  3. カスタム指標を追加するには、イベントの発生ごとに次のようなコードを追加します。たとえば、このカスタム指標は、キャッシュのヒットやミスなど、アプリで発生するパフォーマンス関連のイベントをカウントします(例として、イベント名を item_cache_hititem_cache_miss、増分単位を 1 としています)。

    Java

    Trace myTrace = FirebasePerformance.getInstance().newTrace("test_trace");
    myTrace.start();
    // code that you want to trace (and log custom metrics)
    Item item = cache.fetch("item");
    if (item != null) {
        myTrace.incrementMetric("item_cache_hit", 1);
    } else {
        myTrace.incrementMetric("item_cache_miss", 1);
    }
    
    myTrace.stop();
    

    Kotlin

    val myTrace = FirebasePerformance.getInstance().newTrace("test_trace")
    myTrace.start()
    // code that you want to trace (and log custom metrics)
    val item = cache.fetch("item")
    if (item != null) {
        myTrace.incrementMetric("item_cache_hit", 1)
    } else {
        myTrace.incrementMetric("item_cache_miss", 1)
    }
    
    myTrace.stop()
    

ステップ 4: (省略可)@AddTrace を使用して特定のメソッドをトレースする

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

ただし、@AddTrace アノテーションによって作成されたカスタム トレースには、カスタム指標を追加できません。

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

Java

@Override
@AddTrace(name = "onCreateTrace", enabled = true /* optional */)
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
}

Kotlin

@AddTrace(name = "onCreateTrace", enabled = true /* optional */)
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
}

ステップ 5: (省略可)特定のネットワーク リクエストのモニタリングを追加する

Performance Monitoring ではネットワーク リクエストが自動的に収集されます。アプリのほとんどのネットワーク リクエストが対象となりますが、一部のリクエストは報告されない場合があります。

Performance Monitoring にカスタム ネットワーク リクエストを含めるには、アプリに次のコードを追加します。

Java

HttpMetric metric =
        FirebasePerformance.getInstance().newHttpMetric("https://www.google.com",
                FirebasePerformance.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 ignored) {
}
metric.setRequestPayloadSize(data.length);
metric.setHttpResponseCode(conn.getResponseCode());
printStreamContent(conn.getInputStream());

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

Kotlin

val metric = FirebasePerformance.getInstance().newHttpMetric("https://www.google.com",
        FirebasePerformance.HttpMethod.GET)
val url = URL("https://www.google.com")
metric.start()
val conn = url.openConnection() as HttpURLConnection
conn.doOutput = true
conn.setRequestProperty("Content-Type", "application/json")
try {
    val outputStream = DataOutputStream(conn.outputStream)
    outputStream.write(data)
} catch (ignored: IOException) {
}

metric.setRequestPayloadSize(data.size.toLong())
metric.setHttpResponseCode(conn.responseCode)
printStreamContent(conn.inputStream)

conn.disconnect()
metric.stop()

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

ステップ 6: アプリをデプロイして結果を確認する

1 つ以上のテストデバイスを使用して Performance Monitoring を検証したら、アプリのアップデート バージョンをユーザーにデプロイします。

Firebase コンソールでパフォーマンス データをモニタリングできます。

既知の問題

  • Performance Monitoring Gradle プラグイン v1.1.0 で、Guava の依存関係が一致せず、次のエラーが発生する可能性があります。

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

    このエラーが発生した場合は、次のいずれかを行います。

    • Performance Monitoring プラグインを v1.1.1 以降にアップグレードする(最新バージョンは v1.2.1)。

    • ルートレベル(プロジェクト レベル)の Gradle ファイル(build.gradle)で、Performance Monitoring プラグインの依存関係を記述している行を次のように置き換える。

      buildscript {
        // ...
      
        dependencies {
          // ...
      
          // Replace the standard Performance Monitoring plugin dependency line, as follows:
          classpath ('com.google.firebase:perf-plugin:1.1.0') {
                      exclude group: 'com.google.guava', module: 'guava-jdk5'
          }
        }
      }
      
  • Performance Monitoring は、OkHttp HTTP クライアント v3.x.x で作成された HTTP/S ネットワーク リクエストのみをモニタリングします。

  • Performance Monitoring は、HTTP content-length ヘッダーの値に基づいて HTTP/S ネットワーク リクエストのペイロード サイズの合計を報告します。この値は正確とは限りません。

  • Performance Monitoring は、マルチプロセスの Android アプリのメインプロセスのみをサポートしています。

  • Performance Monitoring Gradle プラグインは、次のものと互換性がありません。

    • DexGuard。これは、自動トレースと HTTP/S ネットワーク リクエストのモニタリングを無効にします。ただし、アプリで DexGuard を使用している場合、Performance Monitoring SDK で追加したカスタム トレースは正常に動作します。

    • Jack。これは非推奨です。

統合をデバッグする

ビルド時に Performance Monitoring のデバッグ ロギングを有効にするには、次のようにアプリの AndroidManifest.xml ファイルに <meta-data> 要素を追加します。

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

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

adb logcat -s FirebasePerformance

次のステップ