虽然基准库随附的 Gradle 插件可直接与 Android Gradle 插件集成,但您也可以使用其他构建系统(例如 Bazel 或 Buck)中的基准。
本主题介绍在使用基准库时如何配置非 Gradle 构建系统。
AndroidBenchmarkRunner
通过在测试清单的插桩代码块中指定 AndroidBenchmarkRunner
或子类,可将其用作插桩测试运行程序:
<instrumentation android:name="androidx.benchmark.junit4.AndroidBenchmarkRunner" ... />
可调试
为了获得准确的测量结果,基准不可设置为可调试。如未正确设置可调试标记,基准库会抛出错误,而不会报告无效的结果。请注意,在本地运行期间,此设置可能需要切换为 debuggable=true
,才能与 Android Studio 性能剖析器搭配使用。
可将基准构建为通过以下两种方式运行:在自插桩 APK 中运行,或使用一个测试 APK 对另一个 APK 进行插桩测试。
自插桩 APK
如果使用一个简单的自插桩 APK(作为 Gradle 针对 com.android.library
的 androidTest
目录的输出),就必须在单个 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.app
的 androidTest
目录的输出),则必须将应用 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 的情况下在运行时配置基准库,请参阅在持续集成环境中运行基准。