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”build)时的稳定性非常有用。您可以使用库的源代码中提供的 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
  • 默认为空列表

androidx.benchmark.profiling.mode

  • nonemethodsampled 中的一项
  • 默认设置为 none
  • 如需了解详情,请参阅性能剖析

additionalTestOutputDir

  • 配置在设备上保存 JSON 基准报告和性能剖析结果的位置
  • 默认为测试 APK 的外部下载目录