Microbenchmark ライブラリには Android Gradle プラグインと直接統合される Gradle プラグインが付属していますが、Bazel や Buck などの他のビルドシステムでもこのライブラリを使用できます。
このトピックでは、Microbenchmark ライブラリを使用する場合に Gradle 以外のビルドシステムを構成する方法について説明します。
インストルメンテーション
テスト マニフェストのインストルメンテーション ブロックで AndroidBenchmarkRunner
またはサブクラスを指定することにより、それをインストルメンテーション ランナーとして使用します。
<manifest package="com.example.library.test" ...> <instrumentation android:name="androidx.benchmark.junit4.AndroidBenchmarkRunner" /> ... </manifest>
正確な測定値を得るには、ベンチマークがデバッグ可能であってはなりません。デバッグ可能フラグが正しく設定されていない場合、ライブラリは無効な結果をレポートするのではなく、エラーをスローします。なお、debuggable=true
を必要とする Android Studio プロファイラを使用する場合は、ローカルでの実行時にこの設定を切り替える必要があります。
マイクロベンチマークは 2 つの実行方法に応じてビルドできます。一つは自己インストルメント化 APK 内で実行する方法であり、もう一つは別の APK をインストルメント化するテスト APK で実行する方法です。
自己インストルメント化 APK
シンプルな自己インストルメント化 APK(com.android.library
の androidTest
ディレクトリに対する Gradle の出力)では、単一の APK の Android マニフェストはデバッグ可能が無効にされている必要があります。
<manifest package="com.example.library.test" ...> <instrumentation android:name="androidx.benchmark.junit4.AndroidBenchmarkRunner" android:targetPackage="com.example.library.test"/> <application android:debuggable="false"/> </manifest>
テスト APK によってインストルメント化されるアプリ APK
ビルドがアプリ APK とテスト APK という 2 つの APK を出力する場合(com.android.app
の androidTest
ディレクトリに対する Gradle の出力)、アプリ APK を debuggable=false
に設定する必要があります。Android OS は、テスト APK のデバッグ可能フラグを無視します。
<!-- test manifest --> <manifest package="com.example.android.app.test" ...> <instrumentation android:name="androidx.benchmark.junit4.AndroidBenchmarkRunner" android:targetPackage="com.example.android.app"/> <!-- debuggable here ignored by OS! --> </manifest> <!-- app being tested --> <manifest package="com.example.android.app" ...> <application android:debuggable="false"/> </manifest>
なお、Android Studio または Gradle は、アプリ モジュール APK に対するマイクロベンチマークをサポートしていません。これは、ベンチマークからの呼び出しをアプリコードに分割する軽量化なしで、APK のデバッグ不可の最適化済みまたは軽量化済みバリアントに依存する追加のテスト ディレクトリをサポートすることの複雑さが原因です。
軽量化と最適化
リリース版に近いパフォーマンスを実現するには、ベンチマークに対して軽量化と最適化を使用することをおすすめします。コード例については、ベンチマーク サンプル プロジェクトをご覧ください。
コード カバレッジ
ベンチマークは、JaCoCo などのツールによるライブラリまたは DEX のマングリングを行わずに、カバレッジを無効にして実行する必要があります。
したがって、ベンチマークは、他のインストルメンテーション テストから完全に独立したソースセットとして作成し、リリースの依存関係を使用して個別にビルドすることをおすすめします。そうすれば、カバレッジの有無にかかわらず、テストを何度もビルドする手間を省くこともできます。
なお、ベンチマークが依存するライブラリ(特にローカルでビルドされたもの)のデバッグ バリアントは、カバレッジを有効にしてビルドできます。
実行
コマンドラインからテストを実行できます。実行するクラスを指定することもできます。
adb shell am instrument -w com.example.benchmark/androidx.benchmark.junit4.AndroidBenchmarkRunner
Gradle を使用しないで実行時に Microbenchmark ライブラリを構成する場合は、インストルメンテーション引数をご覧ください。