在不使用 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
None
、MethodTracing
或StackSampling
其中之一(不区分大小写)- 默认设置为
None
- 如需了解详情,请参阅性能分析
androidx.benchmark.profiling.sampleFrequency
- 在
StackSampling
性能分析模式下,每秒要捕获的堆栈样本数。 - 默认为每秒
1000
个样本。 - 如需了解详情,请参阅性能分析
androidx.benchmark.profiling.sampleDurationSeconds
- 要在
StackSampling
性能分析模式下运行的基准测试的运行时长。 - 默认为
5
秒。 - 如需了解详情,请参阅性能分析
additionalTestOutputDir
- 配置在设备上保存 JSON 基准报告和性能剖析结果的位置
- 默认为测试 APK 的外部下载目录