継続的インテグレーションでベンチマークを実行する

テストは、Gradle を使用せずに CI で実行するか、別のビルドシステムを使用している場合はローカルで実行するのが一般的です。このトピックでは、Gradle を使用せず実行時にベンチマーク ライブラリを設定する方法について説明します。

ベンチマークが CI で役立つ理由と、ベンチマーク データを使用して回帰を検出する方法については、Android デベロッパー ブログの CI のベンチマークによる回帰対策をご覧ください。

結果

ベンチマークは、テスト実行の結果とメタデータを含む JSON ファイルを出力します。この JSON ファイルは、デバイスの外部ストレージに書き込まれます。実行のたびにデバイスからファイルを pull する必要があります。

出力はデフォルトで無効になっていますが、次のインストルメンテーション引数を指定して am instrument コマンドに渡すことで、有効にできます。

-e androidx.benchmark.output.enable true

デフォルトで、レポートはテスト対象アプリの外部ストレージのダウンロード ディレクトリに保存され、次のクエリで検索できます。

adb shell content query --uri content://media/external/file --projection _data --where "\"_data LIKE '%Android'\""

次のインストルメンテーション引数を使用して、ベンチマークの書き込み先のパスを設定できます。

-e additionalTestOutputDir "device_path_you_can_write_to"

ストレージと Android 10

Android Gradle のように、テストをアンインストールする前にデバイスから出力データを pull することが困難な場合は、次のインストルメンテーション引数を渡すことができます。Android 10 以降を搭載しているデバイスでは、この引数を指定すると、アンインストール後もファイルが保持されます。

-e no-isolated-storage 1

API 29 以降も対象とする場合は、ベンチマークのマニフェストでレガシー ストレージ オプションを明示的に許可する必要もあります。

<application android:requestLegacyExternalStorage="true" ... >

詳細については、対象範囲別ストレージを一時的にオプトアウトするをご覧ください。

クロックをロックする

Benchmark Gradle プラグインには、ユーザーに root 権限のあるデバイスの CPU クロックをロックするコマンド ./gradlew lockClocks が用意されています。これは、「userdebug」ビルドなど、ユーザーに root 権限のあるデバイスにアクセスできる場合に安定性を確保するために役立ちます。ライブラリのソースにある lockClocks.sh シェル スクリプトを使用して複製できます。

Linux または Mac ホストからスクリプトを直接実行することも、いくつかの adb コマンドを使用してデバイスに push することもできます。

adb push path/lockClocks.sh /data/local/tmp/lockClocks.sh
adb shell /data/local/tmp/lockClocks.sh
adb shell rm /data/local/tmp/lockClocks.sh

シェル スクリプトをホスト上で直接実行すると、接続されたデバイスにこれらのコマンドがディスパッチされます。

インストルメンテーション引数

次のインストルメンテーション引数を指定して、ライブラリの動作を設定できます。

androidx.benchmark.startupMode.enable(試験運用版)

  • 起動時のベンチマーク コードをサポートするようにループ動作を再設定します
  • ウォームアップ ループを無効にします
  • 測定値を 10 個キャプチャします
  • ループ平均化を無効にし、マイクロ ベンチマークのオーバーヘッドを最小限に抑えます
  • デフォルトは false です

androidx.benchmark.output.enable

  • 結果の JSON ファイルを外部ストレージに書き込めるようにします
  • デフォルトは true です

androidx.benchmark.suppressErrors

  • DEBUGGABLE,LOW-BATTERY など、警告に変わるエラーのカンマ区切りのリスト
  • デフォルトは空のリストです

androidx.benchmark.profiling.mode

  • NoneMethodTracingStackSampling のいずれか(大文字と小文字を区別しない)
  • デフォルトは None です
  • 詳細については、プロファイリングをご覧ください。

androidx.benchmark.profiling.sampleFrequency

  • StackSampling プロファイリング モードのときの、1 秒あたりにキャプチャされるスタック サンプルの数。
  • デフォルトは 1000 サンプル/秒です。
  • 詳細については、プロファイリングをご覧ください。

androidx.benchmark.profiling.sampleDurationSeconds

  • StackSampling プロファイリング モードのときのベンチマークの実行時間。
  • デフォルトは 5 秒です。
  • 詳細については、プロファイリングをご覧ください。

additionalTestOutputDir

  • JSON ベンチマーク レポートとプロファイリング結果をデバイスに保存する場所を設定します
  • デフォルトはテスト APK の外部ダウンロード ディレクトリです