欢迎参加我们将于 6 月 3 日举行的 #Android11:Beta 版发布会

在不使用 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.appandroidTest 目录的输出),就必须在单个 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(作为 Gradle 针对 com.android.appandroidTest 目录的输出)这两个 APK,则必须将应用 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 的情况下在运行时配置基准测试库,请参阅在持续集成环境中运行基准测试