Macrobenchmark ライブラリで測定を自動化する

Jetpack Macrobenchmark を使用してベースライン プロファイルが有効な場合のアプリの動作をテストし、その結果をベースライン プロファイルを無効したベンチマークと比較することをおすすめします。これにより、アプリの起動時間(初期表示からフル表示までの所要時間)を測定したり、実行時のレンダリング パフォーマンス(生成されたフレームによりジャンクが発生する可能性があるかどうか)を確認したりできます。

Macrobenchmark を使用すると、CompilationMode API を介して、測定前のコンパイルを制御できます。結果を測定するには、以下のスニペットに示すように、compilationMode パラメータを正しい値に設定する必要があります。

@RunWith(AndroidJUnit4ClassRunner::class)
class ColdStartupBenchmark {
    @get:Rule
    val benchmarkRule = MacrobenchmarkRule()

    @Test
    fun startupNoCompilation() = startup(CompilationMode.None())

    @Test
    fun startupBaselineProfile() = startup(CompilationMode.Partial())

    @Test
    fun startupFullCompilation() = startup(CompilationMode.Full())

    private fun startup(compilationMode: CompilationMode) = benchmarkRule.measureRepeated(
        packageName = "com.example.macrobenchmark.target",
        metrics = listOf(StartupTimingMetric()),
        compilationMode = compilationMode,
        iterations = 10,
        startupMode = StartupMode.COLD,
        setupBlock = {
            pressHome()
        }
    ) {
        // Waits for the first rendered frame, which represents time to initial display.
        startActivityAndWait()

        // Waits for content to be visible, which represents time to fully drawn.
        device.wait(Until.hasObject(By.res("my-content")), 5_000)
    }
}

Google Pixel 7 で実行された Now in Android サンプルアプリのスクリーンショットに示すように、結果は Android Studio に直接表示されます。この結果から、アプリの起動は、コンパイルなし(378.6 ms)と比べて、ベースライン プロファイルを使用した場合に最も速かった(275.1 ms)ことがわかります。フル AOT コンパイルは、ディスクからより大きいファイルを読み込む必要があるため、さらに時間がかかる(393 ms)可能性があります。

初期表示までの時間を示す ColdStartupBenchmark の結果(コンパイルなし = 393 ms、フルコンパイル = 393 ms、ベースライン プロファイル = 275 ms)

なお、上記の例は StartupTimingMetric でキャプチャしたアプリ起動の結果を示すものですが、FrameTimingMetric など、他にも検討すべき重要な指標があります。すべての種類の指標について詳しくは、指標をキャプチャするをご覧ください。