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

このページでは、Microbenchmark ライブラリを使用する場合に Gradle 以外のビルドシステムを構成する方法について説明します。

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

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

テスト マニフェストのインストルメンテーション ブロックで AndroidBenchmarkRunner またはサブクラスを指定することにより、それをインストルメンテーション ランナーとして使用します。

<manifest
    package="com.example.library.test" ...>

    <instrumentation android:name="androidx.benchmark.junit4.AndroidBenchmarkRunner" />
    ...
</manifest>

正確な測定値を得るには、ベンチマークがデバッグ可能であってはなりません。デバッグ可能フラグを正しく設定しないと、ライブラリは無効な結果をレポートするのではなく、エラーをスローします。debuggable=true を必要とする Android Studio プロファイラで使用するには、ローカル実行時にこの設定の切り替えが必要になることがあります。

Microbenchmark を作成して実行する方法は 2 つあります。自己インストルメント化 APK 内で実行する方法と、1 つのテスト 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

ビルドが 2 つの APK(アプリ APK とテスト APK)を出力し、Gradle が com.android.app パッケージの androidTest ディレクトリに対して出力する場合は、アプリ 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"/>
    <!-- This debuggable is ignored by the OS. -->
</manifest>

<!-- App being tested. -->
<manifest
    package="com.example.android.app" ...>

    <application android:debuggable="false"/>
</manifest>

Android Studio と Gradle は、アプリ モジュール APK の microbenchmarking をサポートしていません。これは、追加のテスト ディレクトリのサポートに際して、ベンチマークからの呼び出しをアプリコードに分割して圧縮化することなく、最適化または圧縮されたデバッグ可能でない APK バリアントに依存することになり、複雑であるためです。

コンパイル

テストを実行する前に、 次のコマンドを実行します。

adb shell cmd package compile -f -m speed com.example.benchmark

軽量化と最適化

リリース版に近いパフォーマンスを実現するには、ベンチマークに対して軽量化と最適化を使用することをおすすめします。コード例については、ベンチマーク サンプル プロジェクトをご覧ください。

コード カバレッジ

ベンチマークは、JaCoCo などのツールによるカバレッジを無効にしてライブラリや DEX のマングリングを使用することなく実行することをおすすめします。

このため、ベンチマークを他のインストルメンテーション テストからソースセットとして分離し、リリース依存関係とは別にビルドすることをおすすめします。これにより、カバレッジの有無にかかわらず、テストを複数回ビルドする必要がなくなります。

なお、ベンチマークが依存するライブラリのデバッグ バリアント(特にローカルでビルドされたもの)は、カバレッジを有効にしてビルドできます。

テストの実施

次の例に示すように、コマンドラインからテストを実行し、実行するクラスを指定できます。

adb shell am instrument -w com.example.benchmark/androidx.benchmark.junit4.AndroidBenchmarkRunner

Gradle を使用しないで実行時に Microbenchmark ライブラリを構成する場合は、Microbenchmark インストルメンテーション引数をご覧ください。