Get Started with Firebase Performance Monitoring for Android


[Get Started with Firebase Performance Monitoring for Android](https://firebase.google.com/docs/perf-mon/get-started-android)のメモです。

<div align="center"><img src="https://qiita-image-store.s3.amazonaws.com/0/33505/beff7fef-87a8-ffc4-cf98-6dad75cd19c2.jpeg" width=60%></div>

## 1. 前提条件
* Android 4.0（Ice Cream Sandwich）以降の端末
* Google Play Service 11.0.1以降
* Android Studio 2.2以上

## 2. Android projectに Firebase を追加
Android Studio の Tools -> Firebase -> Assistant からインストールするサービスを選んでもいいけど、Android Studio 2.2.3 では Firebase Performance はなかったので、次の通りにする。

```
app/build.gradle

        Add Firebase plugin for Gradle
        apply plugin: 'com.google.gms.google-services'
```

## 3. Performance Monitoring を追加する
1. プロジェクト単位で build.gradle を開く
a. In the buildscript -> repositories section:

    ```
    jcenter()
    ```
b. In the buildscript -> dependencies section:

    ```
    classpath 'com.google.firebase:firebase-plugins:1.1.0'
    ```

1. アプリケーション単位で build.gradle を開く
a. Below apply plugin: 'com.android.application', add the following line:

    ```
    apply plugin: 'com.google.firebase.firebase-perf'
    ```
b. Add the following to the dependencies section:

    ```
    compile 'com.google.firebase:firebase-perf:11.0.1'
    ```
c. 他のFirebase SDKを使用している場合は、それらのSDKのバージョンも11.0.1に変更する必要があります。

1. 再コンパイルすれば、自動的にトレースとHTTP/Sネットワークが監視されるようになります。


## 4. （Optional）カスタムトレースと1つ以上のカウンターをアプリに定義する
カスタムトレースは、コード内で指定できるレポートです。
複数のカスタムトレースを持つことができ、一度に複数のカスタムトレースを実行することができます。
各カスタムトレースには、アプリ内のパフォーマンス関連のイベントをカウントする1つ以上のカウンタがあり、これらのカウンタはそれらを作成するトレースに関連付けられています。

1. Performance Monitoring クラスを .java ファイルにインポート

    ```Java
    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();
    ```

3. アプリケーションで発生するパフォーマンス関連のイベント（キャッシュのヒットやミスなど）をカウントするには、イベントが発生するたびに item_cache_hit または item_cache_miss 以外の文字列を使用して、次のような行を追加します。

    ```Java
    Item item = cache.fetch("item");
    if (item != null) {
        myTrace.incrementCounter("item_cache_hit");
    } else {
        myTrace.incrementCounter("item_cache_miss");
    }
    ```

4. トレースを停止するコードの直後に、次のコード行を追加します。

    ```Java
    myTrace.stop();
    ```

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

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

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

## 6. （Optional）Androidバイタルでパフォーマンスモニタリングを使用する
パフォーマンスモニタリングを使用すると、PlayデベロッパーコンソールのAndroid vitalsダッシュボードで提供される情報をより詳細に把握できます。
パフォーマンスモニタリングは、Android vitalsのダッシュボードに表示される問題の原因となっているアプリのどの部分がわからない場合に特に役立ちます。

たとえば、Android vitalsのダッシュボードに、フレームを生成して画面に表示するのに時間がかかりすぎていることが示されている場合は、パフォーマンスモニタリングを使用して、アプリのどの部分が遅いレンダリングで問題があるかを分析できます。

APIレベル24以上を実行する端末では、アプリの遅いフレームとフリーズしたフレームの両方をカウントできます。

1. ユーザーのアクティビティとのやり取りの開始時にmyTrace.start（）を呼び出して、カスタムトレースを開始します。

2. [FrameMetricsAggregator()](https://developer.android.com/reference/android/support/v4/app/FrameMetricsAggregator.html#FrameMetricsAggregator()) を呼び出して、各フレームのTOTAL_DURATIONメトリックを取得するオブジェクトを作成します。

3. myTrace.stop（）を呼び出してカスタムトレースを停止する直前に次をおこなう

    a. FrameMetricsAggregatorオブジェクトからTOTAL_DURATIONの値を取得するには、[FrameMetricsAggregator.stop()](https://developer.android.com/reference/android/support/v4/app/FrameMetricsAggregator.html#stop()) を使用します。
    b. 総フレーム数を取得するには、フレームカウンタをインクリメントします。 また、各TOTAL_DURATION値のslow_framesカウンタを16msより大きくし、700msより大きいTOTAL_DURATION値ごとにfrozen_framesカウンタをインクリメントします（または、低速レンダリングが発生しない場合はこれらのカウンタを0に設定します）。

4. Firebaseコンソールで、最も遅いフレームまたはフリーズフレームを表示するデバイスを探して、アプリで低速レンダリングが発生するケースを切り分けます。

Android vitalsダッシュボードを使用して低速のレンダリングフレームを検出する方法の詳細については、「 [Slow Rendering](https://developer.android.com/topic/performance/vitals/render.html) 」を参照してください。

## 7. Firebaseコンソールでパフォーマンス監視の結果を確認する
1. Android Studioでアプリを作成します。
2. 最近の画像とGoogle Playサービス11.0.1以降のAndroidエミュレータ、またはGoogle Playサービス11.0.1以降のテストデバイスを使用してアプリをテストします。
3. FirebaseコンソールにPerformance Monitoringの結果が表示されていることを確認します。 結果は12時間以内に表示されます。

## デバッグ方法
次のように、アプリケーションのAndroidManifest.xmlファイルの<application>要素に<meta-data>要素を追加することで、ビルド時にパフォーマンス監視用のデバッグログを有効にすることができます。

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

logcatフィルタリングを使用して、トレースおよびHTTP/Sネットワーク要求ログを表示できます。
パフォーマンスモニタリングログメッセージにはFirebasePerformanceタグが付けられ、次のコマンドを使用してフィルタリングできます。

```
adb logcat -s FirebasePerformance
```