无需 Gradle 构建微基准测试

此页面介绍在使用 Microbenchmark 库时配置非 Gradle 构建系统。

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

检测

通过在测试清单的 instrumentation 块中指定 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 为 androidTest 目录(来自 com.android.library)输出),必须在单个 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 操作系统会忽略测试 APK 的 debuggable 标志。

<!-- 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 库,请参阅Microbenchmark 检测参数