Google 致力于为黑人社区推动种族平等。查看具体举措

在持续集成中运行基准测试

在不使用 Gradle 的情况下,通常会在持续集成 (CI) 中运行测试;如果使用的是其他构建系统,则在本地运行。本主题介绍在不使用 Gradle 的情况下,如何在运行时配置基准测试库。

如需了解基准测试在 CI 中为何有用,以及如何使用基准测试数据来检测性能降低问题,请参阅 Android 开发者博客上的在 CI 中使用基准测试来解决回归

结果

基准测试会输出一个 JSON 文件,其中包含测试运行的结果和元数据。此 JSON 文件会写入到设备的外部存储中。每次运行测试后,您都必须从设备中提取该文件。

输出默认处于停用状态,但您可以通过向 am instrument 命令传递以下插桩参数来启用输出:

    -e androidx.benchmark.output.enable true
    

默认情况下,报告会保存到设备上被测应用的外部存储空间中的下载目录中,您可以通过以下查询找到:

    adb shell content query --uri content://media/external/file --projection _data --where "\"_data LIKE '%Android'\""
    

您可以使用以下插桩参数配置基准测试的写入路径:

    -e additionalTestOutputDir "device_path_you_can_write_to"
    

存储空间和 Android 10

和在 Android Gradle 中一样,如果在卸载测试之前无法从设备中提取输出数据,您可以传递以下插桩参数。在搭载 Android 10 或更高版本的设备上,此参数可让文件在卸载测试后保留下来:

    -e no-isolated-storage 1
    

如果您还以 API 29 及更高版本为目标,则还必须在基准测试的清单中明确允许旧的存储选项:

    <application android:requestLegacyExternalStorage="true" ... >
    

要详细了解如何选择停用分区存储,请参阅选择停用过滤视图

锁定时钟

Benchmark Gradle 插件提供 ./gradlew lockClocks 命令来锁定已取得 root 权限的设备的 CPU 时钟。这对于确保访问已取得 root 权限的设备(例如“userdebug”版本)时的稳定性非常有用。您可以使用库源文件中提供的 lockClocks.sh shell 脚本来复制此命令。

您可以直接在 Linux 或 Mac 主机上运行脚本,也可以使用几个 adb 命令将脚本推送给设备:

    adb push path/lockClocks.sh /data/local/tmp/lockClocks.sh
    adb shell /data/local/tmp/lockClocks.sh
    adb shell rm /data/local/tmp/lockClocks.sh
    

如果直接在主机上运行 shell 脚本,它会将这些命令发送给连接的设备。

插桩参数

您可以使用以下插桩参数配置库的行为:

androidx.benchmark.startupMode.enable

  • 在启动期间,重新配置循环行为来支持基准测试代码
  • 停用预热循环
  • 捕获 10 次测量
  • 停用循环平均功能,从而最大限度地减少微基准测试的开销
  • 默认设置为 false

androidx.benchmark.output.enable

  • 允许将 JSON 结果文件写入到外部存储中
  • 默认设置为 false

androidx.benchmark.suppressErrors

  • 要变成警告的错误的列表,错误之间用英文逗号分隔(例如 DEBUGGABLE,LOW-BATTERY
  • 默认为空列表

additionalTestOutputDir

  • 配置在设备上保存完整 JSON 基准测试报告的位置
  • 默认为测试 APK 的外部下载目录