Macrobenchmarkで起動時間を計測する

Photo by Alexander Schimmeck on Unsplash

AndroidX Macrobenchmarkでアプリの起動時間を計測する方法について書いていきます。

基本はドキュメントを見れば大丈夫だとは思いますが、少し分かりにくいものもあるので、丁寧に手順を説明しようと思います。

https://developer.android.com/studio/profile/macrobenchmark-intro

環境

  • Android Studio Bumblebee Beta 4

ベンチマーク用のモジュール作成

まずはベンチマーク用のモジュールを作成します。 作成するには通常のマルチモジュールと同じです。1点注意としてはminSdkは23以上にする必要があります。

build.gradle設定

先程作ったモジュールの build.gradle を編集していきます。

Gradle Pluginの変更

com.android.librarycom.android.test に変更します。

android { } に設定を追加

いくつか設定を android { } のブロックに追加していきます。

説明はコメントに記載しています。

不要なbuildTypeを無効にする

先ほど作成した benchmark のbuildType以外は使用しないので、無効にします。

dependencies に必要なものを追加

Macrobenchmarkのライブラリを追加します。 testImplementationandroidTestImplementation は使わないので注意です。

appモジュールのbuildTypeを追加

先程ベンチマーク用のモジュールに benchmark というbuildTypeを追加したので、それに合わせてappモジュールにも追加しておく必要があります。

このときの設定内容ですがリリースビルドと同じような内容にします。debbugableを無効にして、R8を有効にしておくと良いと思います。署名に関しては何でも良いのでdebugのもを使っています。

AndroidManifest.xml

appモジュール側のAndroidManifestに設定を追加します。プロファイルを可能にする設定になります。

先程つくった、 benchmark のbuildTypeでだけ有効になるように app/src/benchmark/AndroidManifest.xml に設定します。

テストコード

benchmarkのモジュールでテストを書いていきます。テストコードですが、記述する場所は src/main/java の箇所になります。

コードの細かい解説はしませんが、Cold start での起動を計測しています。

他にもRecyclerViewのスクロールなども計測できます。サンプルを参考にしてみてください。

実行

実行するには普通のテストと同じ感じです。

いくつか方法ありますが、benchmarkモジュールを右クリックして Run 'All Tests' などから実行できます。

実行すると、対象アプリを設定したbuildTypeでビルドしてインストールしてから、計測してくれます。

結果

実行すると以下のような感じで結果が表示されます。ちょっと分かりにくいですが、右側の領域の Benchmark タブで計測結果が確認できます。

最小、最大、平均の値とリンク、各イテレーションのリンクが表示されています。

このリンクをクリックをすると、Profilerツールで詳細が確認できるようになっています。

この例はわざと極端に大きい画像ファイルを読み込んでいます。そのため decodeBitmap の処理に時間がかかってるのが分かると思います。

tracing

androidx.tracing を使うといろんな箇所の時間を計測することができます。

以下のように計測したい処理を trace で囲い引数にラベルを設定します。例として2つの画像のBitmapを取得しています。

この状態でMacrobenchmarkを実行してProfilerで確認すると以下のようにラベルが表示され、計測ができるようになります。

参考

https://developer.android.com/studio/profile/macrobenchmark-intro

Programmer / Gamer / Google Developers Expert for Android, Kotlin / @STAR_ZERO