在不使用 Gradle 的情况下构建基准

虽然基准库随附的 Gradle 插件可直接与 Android Gradle 插件集成,但您也可以使用其他构建系统(例如 BazelBuck)中的基准。

本主题介绍在使用基准库时如何配置非 Gradle 构建系统。

AndroidBenchmarkRunner

通过在测试清单的插桩代码块中指定 AndroidBenchmarkRunner 或子类,可将其用作插桩测试运行程序:

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

可调试

为了获得准确的测量结果,基准不可设置为可调试。如未正确设置可调试标记,基准库会抛出错误,而不会报告无效的结果。请注意,在本地运行期间,此设置可能需要切换为 debuggable=true,才能与 Android Studio 性能剖析器搭配使用。

可将基准构建为通过以下两种方式运行:在自插桩 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 进行插桩测试

如果您的 build 会输出两个 APK,即应用 APK 和测试 APK(作为 Gradle 针对 com.android.appandroidTest 目录的输出),则必须将应用 APK 设为 debuggable=false。Android 操作系统会忽略测试 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。

因此,我们建议将基准作为与其他插桩测试完全隔离的源集,并使用发布版依赖项单独构建。我们还发现,在启用和不启用测试范围选项的两种情况下,这样可以避免多次构建测试的麻烦。

另请注意,基准所依赖的库的调试变体,尤其是在本地构建的调试变体,可能在构建时启用了测试范围选项。

运行

如需在不使用 Gradle 的情况下在运行时配置基准库,请参阅在持续集成环境中运行基准