在没有 Gradle 的情况下构建微基准测试

本页面介绍了在使用 Microbenchmark 库时如何配置非 Gradle 构建系统。

尽管 Microbenchmark 库附带了一个 Gradle 插件,可以直接与 Android Gradle 插件集成,但您也可以在其他构建系统中使用它,例如 BazelBuck

插桩

使用 AndroidBenchmarkRunner 或其子类作为您的插桩运行程序,方法是在测试清单的插桩块中指定它

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

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

为了获得准确的测量结果,基准测试不得可调试。如果您未正确设置可调试标志,库会抛出错误,而不是报告无效结果。您可能需要在本地运行期间切换此设置以用于 Android Studio 分析器,因为它们需要 debuggable=true

您可以通过两种方式构建微基准测试以运行:在自插桩 APK 中,或使用一个测试 APK 插桩另一个 APK。

自插桩 APK

对于自插桩 APK(如 Gradle 从 com.android.libraryandroidTest 目录输出的),您必须在单个 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 和一个测试 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 进行微基准测试。这是因为支持额外的测试目录的复杂性,该目录依赖于 APK 的不可调试、优化或精简变体,但又不能因为精简而中断基准测试对应用代码的调用。

编译

我们建议在运行测试之前编译您的微基准测试 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 库,请参阅微基准测试插桩参数