Gradle を使用せずにマイクロベンチマークをビルドする

Microbenchmark ライブラリには Android Gradle プラグインと直接統合される Gradle プラグインが付属していますが、BazelBuck などの他のビルドシステムでもこのライブラリを使用できます。

このトピックでは、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.libraryandroidTest ディレクトリに対する 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.appandroidTest ディレクトリに対する 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 ライブラリを構成する場合は、インストルメンテーション引数をご覧ください。