无需 Gradle 构建 Microbenchmark

此页面介绍在使用 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

您可以构建 Microbenchmark 以两种方式运行:在自检测 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 操作系统会忽略测试 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 库,请参阅 微基准测试检测参数