Gradle を使用せずにベンチマークを作成する

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

このトピックでは、ベンチマーク ライブラリを使用する場合の、Gradle 以外のビルドシステムの設定について説明します。

AndroidBenchmarkRunner

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

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

デバッグ可能

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

ベンチマークを実行する方法には、自己インストルメント化 APK によるものと、別の APK をインストルメント化するテスト APK によるものの 2 つがあります。

自己インストルメント化 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>

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

縮小化と最適化

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

カバレッジ

ベンチマークは、Jacoco などのツールでライブラリまたは DEX の修飾を行わずに、カバレッジを無効にして実行する必要があります。

このためベンチマークは、他のインストルメンテーション テストから完全に独立したソースセットとし、リリースの依存関係とは別にビルドすることをおすすめします。また、カバレッジの有無にかかわらず、テストを何度もビルドする必要はありません。

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

実行

Gradle を使用せず実行時にベンチマーク ライブラリを設定する方法については、継続的インテグレーションでベンチマークを実行するをご覧ください。