在持续集成系统中运行基准

在不使用 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 结果文件写入到外部存储空间
  • 默认设置为 true

androidx.benchmark.suppressErrors

  • 要转换为警告的错误(例如 DEBUGGABLE,LOW-BATTERY),以逗号分隔列表的形式列出
  • 默认为空列表

androidx.benchmark.profiling.mode

  • NoneMethodTracingStackSampling 其中之一(不区分大小写)
  • 默认设置为 None
  • 如需了解详情,请参阅性能分析

androidx.benchmark.profiling.sampleFrequency

  • StackSampling 性能分析模式下,每秒要捕获的堆栈样本数。
  • 默认为每秒 1000 个样本。
  • 如需了解详情,请参阅性能分析

androidx.benchmark.profiling.sampleDurationSeconds

  • 要在 StackSampling 性能分析模式下运行的基准测试的运行时长。
  • 默认为 5 秒。
  • 如需了解详情,请参阅性能分析

additionalTestOutputDir

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