Benchmark

在 Android Studio 中准确衡量代码性能。
最近更新时间 稳定版 候选版 Beta 版 Alpha 版
2024 年 2 月 21 日 1.2.3 - - 1.3.0-alpha01

声明依赖项

如需添加 Benchmark 的依赖项,您必须将 Google Maven 制品库添加到项目中。有关详情,请阅读 Google 的 Maven 制品库

Macrobenchmark

如需在项目中使用 Macrobenchmark,请将以下依赖项添加到 macrobenchmark 模块build.gradle 文件中:

Groovy

dependencies {
  androidTestImplementation "androidx.benchmark:benchmark-macro-junit4:1.2.3"
}

Kotlin

dependencies {
  androidTestImplementation("androidx.benchmark:benchmark-macro-junit4:1.2.3")
}

Microbenchmark

如需在项目中使用 Microbenchmark,请将以下依赖项添加到 microbenchmark 模块build.gradle 文件中:

Groovy

dependencies {
    androidTestImplementation "androidx.benchmark:benchmark-junit4:1.2.3"
}

android {
    ...
    defaultConfig {
        ...
        testInstrumentationRunner "androidx.benchmark.junit4.AndroidBenchmarkRunner"
    }
}

Kotlin

dependencies {
    androidTestImplementation("androidx.benchmark:benchmark-junit4:1.2.3")
}

android {
    ...
    defaultConfig {
        ...
        testInstrumentationRunner = "androidx.benchmark.junit4.AndroidBenchmarkRunner"
    }
}

Microbenchmark 库还提供了一个可与 Microbenchmark 模块搭配使用的 Gradle 插件。此插件可设置模块的默认 build 配置,设置将基准输出复制到主机,并提供 ./gradlew lockClocks 任务

如需使用该插件,请在顶级 build.gradle 文件的“plugins”代码块中添加以下代码行:

Groovy

plugins {
  id 'androidx.benchmark' version '1.2.3' apply false
}

Kotlin

plugins {
  id("androidx.benchmark") version "1.2.3" apply false
}

然后,将该插件应用到基准模块的 build.gradle 文件

Groovy

plugins {
  id 'androidx.benchmark'
}

Kotlin

plugins {
    id("androidx.benchmark")
}

反馈

您的反馈将帮助我们改进 Jetpack。如果您发现了新问题,或对此库有任何改进建议,请告诉我们。创建新问题前,请先查看此库中的现有问题。您可以点击星标按钮,为现有问题投票。

创建新问题

如需了解详情,请参阅问题跟踪器文档

版本 1.3

版本 1.3.0-alpha01

2024 年 2 月 21 日

发布了 androidx.benchmark:benchmark-*:1.3.0-alpha01版本 1.3.0-alpha01 中包含这些提交内容

API 变更

  • 重命名了 MicrobenchmarkConfig 布尔值参数,以避免不必要的单词“should”(Ia8f00b/303387299
  • 添加了 BenchmarkRule.measureRepeatedOnMainThread,以便主线程基准测试(例如轻触视图或 Compose 界面的基准测试)可以避免触发 ANR,尤其是在 CI 环境中的大型套件期间。(I5c86d
  • 添加了 FrameTimingGfxInfoMetric,它是 FrameTimingMetric 的实验性替代实现,其测量结果直接来自平台,而不是从 Perfetto 轨迹中提取。(I457cbb/322232828
  • 添加了在单次 warmUp 迭代期间转储 ART 配置文件的功能。(I17923
  • TraceSectionMetric API 的以下变更:
    • 添加Mode.Min (Mode.Max)
    • 添加标签参数,以替换部分名称作为指标标签
    • 在输出中添加了模式名称,以阐明指标含义
    • 已将默认值更改为“sum”,因为此指标的大部分用途都用于重复事件。请注意 CI 使用情况中的这一变化,因为它可能会导致不连续或中断解析。(Ic1e82b/301892382b/301955938

bug 修复

  • 改进了当指定的受管设备不存在时,基准配置文件 Gradle 插件中的错误消息(Idea2bb/313803289
  • 修复了在 AGP 8.3.0-alpha15 之前的 AAR 中包含库基准配置文件的问题(I1d2afb/313992099
  • 修复了生成任务结束时的基准和启动配置文件输出网址(I802e5b/313976958
  • 调整了数据源超时,以尝试修复 java.lang.IllegalStateException: Failed to stop [ProcessPid(processName=perfetto, pid=...)]I8dc7db/323601788
  • 添加了两个插桩参数,以替换着色器丢弃行为,以便在对没有 ProfileInstaller 1.3 的应用进行基准测试时解决崩溃问题:
    • androidx.benchmark.dropShaders.enable=true/false:可用于跳过所有着色器丢弃(包括在 StartupMode.Cold 启动期间完成的丢弃),尤其是在对尚未使用 profileinstaller 1.3 的应用进行基准测试时
    • androidx.benchmark.dropShaders.throwOnFailure=true/false:可用于容忍尝试丢弃着色器时出现的失败情况,例如在对没有 profileinstaller 1.3 的应用进行基准测试时 (I4f573)
  • 如果预计会超过几秒钟,则在界面线程上跳过方法跟踪,并在抛出方法时清理方法轨迹。(I6e768
  • 当文件名长度超过 200 个字符时抛出,以避免写入或后处理文件时出现不明确崩溃。(I4a5ab
  • 修复了跟踪记录开头和末尾未终止的帧可能会配对在一起的问题,此问题会错误地报告为一个极长的帧。(I39353b/322232828
  • 在 API 30 及以上级别上重新安装软件包时,请在 API 30-33 上使用 --skip verification 清除用户 build 中的 ART 配置文件。这有助于绕过在某类设备上导致故障的 Play 保护机制警告。(Ic9e36
  • 使用 am force-stop 可终止不是系统应用(例如系统界面或启动器)的应用。(I5e028
  • Macrobenchmark 现在会等待 1 second,以便目标应用刷新 ART 配置文件(以前会等待 500 ms)。(I85a50b/316082056
  • 改进了未生成帧时的 FrameTimingMetric 错误,并在指标解析失败时始终输出跟踪记录链接,以帮助诊断问题。(I956b9
  • 修复了 FrameTimingMetric 中无法解析帧 ID 时发生崩溃的问题,尤其是在某些 OEM 设备上。(Ia24bcb/303823815b/306235276
  • 放宽了 FrameMetrics 中的检查严格程度,并为错误消息添加了更多详细信息。(Iadede)

版本 1.2

版本 1.2.3

2024 年 1 月 24 日

发布了 androidx.benchmark:benchmark-*:1.2.3版本 1.2.3 中包含这些提交内容

bug 修复

  • 从基准配置文件 Gradle 插件中移除了当 AGP 版本为 8.3.0 或更高版本时的异常。
  • 修复了 AGP 8.3.0-alpha15 之前的版本,在 AAR 中添加库基准配置文件的问题。

版本 1.2.2

2023 年 12 月 1 日

发布了 androidx.benchmark:benchmark-*:1.2.2版本 1.2.2 中包含这些提交内容

基准配置文件

版本 1.2.1

2023 年 11 月 15 日

发布了 androidx.benchmark:benchmark-*:1.2.1版本 1.2.1 中包含这些提交内容

新功能

版本 1.2.0

2023 年 10 月 18 日

发布了 androidx.benchmark:benchmark-*:1.2.0版本 1.2.0 中包含这些提交内容

自 1.1.0 以来的重要变更

基准配置文件

  • 新的 Baseline Profile Gradle 插件会自动捕获基准配置文件,并在测试和构建工作流中加入基准配置文件。
  • BaselineProfileRule.collect 现已稳定,是先前实验性 BaselineProfileRule.collectBaselineProfile API 的简化版本
    • 只需指定 packageName,即可驱动您的应用
  • 对于生成基准配置文件的库,您现在可以过滤在代码中(BaselineProfileRule.collect 参数)中生成的规则,甚至可以直接在 Gradle 插件中过滤生成的规则
  • 修复

Macrobenchmark

  • 编译
    • 现在,Macrobenchmark 可针对每次编译正确完全重置编译状态 - 这需要重新安装在 Android 14 之前版本的 APK,因此如果您想要在所衡量对象中保留状态(例如用户登录),强烈建议您在 Android 14 及更高版本中进行基准测试。
    • 您也可以通过单独控制应用编译,并使用 CompilationMode.Ignore()插桩参数跳过编译来解决此问题
  • 插桩参数

    • 支持 androidx.benchmark.dryRunMode.enable 插桩参数(已在 Microbenchmark 中提供),以加快验证运行速度(例如,在创建基准时或提交前)
    • 支持 androidx.benchmark.profiling.mode=StackSamplingMethodTracing
    • 添加了 androidx.benchmark.enabledRules,以允许运行时过滤基准配置文件与 Macrobenchmark 规则测试
    • 添加了 androidx.benchmark.perfettoSdkTracing.enable 参数,用于使用 tracking-perfetto 启用跟踪,例如 Compose 重组跟踪。请注意,如果与 StartupMode.COLD 一起使用,时间将受到显著影响,因为在应用启动期间加载并启用跟踪库。
  • 要求

    • Macrobenchmark 现在要求在目标应用中使用 ProfileInstaller 1.3.0 或更高版本,以启用配置文件捕获 / 重置以及着色器缓存清除功能。
  • 全新的实验性 Metric API

    • 添加了实验性 TraceSectionMetric,可用于从应用中的 trace("") {} 块提取简单的时间;或者,您也可以添加 TraceMetric,以利用 Perfetto TraceProcessor 的完整查询功能。
    • 添加了实验性 PowerMetric,用于捕获耗电量信息
    • 添加了实验性 MemoryCountersMetric,用于统计页面故障数
    • 添加了实验性 PerfettoTraceProcessor API,该 API 在内部用于从系统跟踪记录(也称为 Perfetto 跟踪记录)中提取指标
  • 修复

    • 修复了通过多个 APK(例如,从 app bundle)安装的应用安装或提取配置文件时发生崩溃的问题。
    • 修复了 FrameTimingMetric 忽略帧 ID 不一致的帧(通常是 API 31 及更高版本上出现涟漪效果的帧)的问题(I747d2b/279088460
    • 修复了大小超过 64MB 的跟踪记录的解析错误(Ief831b/269949822
    • 澄清了设备(尤其是模拟器)操作系统映像未正确配置为进行跟踪或编译时出现的错误
    • 对于没有电池的设备,跳过电池电量检查(微型和微距型)
    • 改进了文件输出,针对无效输出目录提供了更明确的错误,并提供了更安全的默认设置
    • 通过不断丢弃着色器缓存(也通过 MacrobenchmarkScope.dropShaderCache 公开),提高了 StartupMode.COLD 的稳定性
    • 修复了 startActivityAndWait 的 leanback 回退。

Microbenchmark

  • 功能
    • 性能分析已移至单独的阶段(在其他指标之后),因此一次测试运行可以同时显示准确的时间和性能分析结果。
  • 实验性 API
    • 添加了实验性 MicrobenchmarkConfig API,用于定义自定义指标以及配置跟踪和分析。可用于捕获方法轨迹,或捕获跟踪点(但请注意跟踪开销)。
    • 添加了用于在没有 JUnit 的情况下单独控制 BenchmarkStateBenchmarkRule 的实验性 API
    • 添加了实验性 PerfettoTrace 记录,以支持使用自定义配置捕获 Perfetto 跟踪记录,与基准 API 分开。
  • 修复
    • 解决了 Android Studio 基准输出中缺少前导空格的问题。
    • 修复了 Android Studio 基准输出中无法输出警告的问题。
    • 修复了 Android 13 (API 33) 及更高版本中的 SampledProfiling 崩溃问题。
    • 通过跳过 IsolationActivity 和 Perfetto 跟踪,大幅提升了 dryRunMode 的性能(在较旧的操作系统上,试运行模式速度可提升高达 10 倍)。

版本 1.2.0-rc02

2023 年 10 月 6 日

发布了 androidx.benchmark:benchmark-*:1.2.0-rc02版本 1.2.0-rc02 中包含这些提交内容

bug 修复

  • 修复了基准文件输出,现在不再中断 BaselineProfile 插件文件的复制。文件已生成并复制到设备以外,但已重命名,因此 Gradle 插件不会看到这些文件。(I8dbccb/303034735b/296453339
  • 更正了从 Macrobenchmark 模块注入目标应用时出现的 tracing-perfetto 加载错误消息。

版本 1.2.0-rc01

2023 年 9 月 20 日

发布了 androidx.benchmark:benchmark-*:1.2.0-rc01版本 1.2.0-rc01 中包含这些提交内容

bug 修复

  • 现在,当 Perfetto SDK 跟踪记录无法在基准中初始化时,系统会抛出异常(包含补救说明)。(I6c878b/286228781
  • 修复了在转换 ART 方法轨迹 -> perfetto 格式时出现 OOM 崩溃问题。(I106bdb/296905344
  • (Macrobenchmark) 阐明了在 Studio 测试输出中关联时的方法跟踪标签,并修复了方法跟踪文件名在设备/主机上具有唯一性,因此在运行多个基准测试时不会被覆盖。(I08e65b/285912360
  • 确保在捕获基准配置文件时设备处于唤醒状态。(I503fc

版本 1.2.0-beta05

2023 年 8 月 30 日

发布了 androidx.benchmark:benchmark-*:1.2.0-beta05版本 1.2.0-beta05 中包含这些提交内容。

新功能

  • 基准配置文件 Gradle 插件现在支持 Android Gradle 插件 8.3。(aosp/2715214)

版本 1.2.0-beta04

2023 年 8 月 23 日

发布了 androidx.benchmark:benchmark-*:1.2.0-beta04版本 1.2.0-beta04 中包含这些提交内容。

新功能

  • 基准配置文件 Gradle 插件现在支持 Android Gradle 插件 8.3。(aosp/2715214)

bug 修复

  • 通过进一步清理输出文件名称,避免输出文件名称中出现“=”和“:”,修复了写入/移动和拉取文件(尤其是参数化测试产生的文件)失败的问题。(I759d8)

版本 1.2.0-beta03

2023 年 8 月 9 日

发布了 androidx.benchmark:benchmark-*:1.2.0-beta03版本 1.2.0-beta03 中包含这些提交内容

API 变更

  • 添加了参数,以将 TraceSectionMetric 过滤为仅包含目标软件包,此参数默认处于启用状态(Ia219bb/292208786

bug 修复

  • fullTracing.enable 插桩参数重命名为了 perfettoSdkTracing.enable,以与工件名称和其他引用保持一致。fullTracing.enable 将继续作为后备参数运行。(I7cc00)
  • Benchmark 库内部跟踪点(包括微基准循环/阶段跟踪)现在将显示在 Studio 系统轨迹查看器中,并嵌套在 Perfetto 中的正确进程下。(I6b2e7b/293510459
  • 移除了 API 31+ 上的宏基准 NOT-PROFILEABLE 错误,并在运行 eng/userdebug 且已取得 root 权限的设备上跳过可分析检查。(I2abacb/291722507
  • 在使用 Dex 布局优化时,启动配置文件规则现在也被视为基线配置文件规则。(aosp/2684246b/293889189

版本 1.2.0-beta02

2023 年 7 月 26 日

发布了 androidx.benchmark:benchmark-*:1.2.0-beta02版本 1.2.0-beta02 中包含这些提交内容

API 变更

  • 添加了用于微基准自定义指标和配置(例如性能分析器和跟踪)的实验性 API。(I86101b/291820856

bug 修复

  • 当操作系统的跟踪配置错误时在宏基准中报告错误,正如最近在 API 26/28 ARM64 模拟器中修复的问题一样。(I0a328b/282191686
  • 为编译重置失败添加了详细信息,建议用户更新模拟器,因为某些模拟器最近修复了此问题。(I8c815b/282191686
  • 使 androidx.test.uiautomator:uiautomator:2.2.0 成为 api,而不是 implementation 依赖项。(I1981e)

版本 1.2.0-beta01

2023 年 7 月 18 日

发布了 androidx.benchmark:benchmark-*:1.2.0-beta01版本 1.2.0-beta01 中包含这些提交内容

bug 修复

  • 修复了 Studio 中的 Benchmark 输出有时会抑制警告的问题,并解决了 Studio 中不显示 Benchmark 输出的前导空格的问题。(Ia61d0b/227205461b/286306579b/285912360
  • 修正了 FrameTimingMetric 的注释。子指标的名称为 frameDurationCpuMs。(Ib097fb/288830934)。

版本 1.2.0-alpha16

2023 年 6 月 21 日

发布了 androidx.benchmark:benchmark-*:1.2.0-alpha16版本 1.2.0-alpha16 中包含这些提交内容。

API 变更

  • BaselineProfileRule.collectBaselineProfile() API 重命名为了 BaselineProfileRule.collect()。(I4b665)

bug 修复

  • Macrobenchmark 支持 androidx.benchmark.profiling.mode = MethodTracing。(I7ad37b/285912360
  • Microbenchmark 性能分析已移至单独的阶段,因此会在测量后按顺序发生,而不是取代测量。MethodTracing 轨迹部分现在也包含在捕获的 Perfetto 轨迹中(如果有)。(I9f657b/285014599
  • 通过 Mode.SumTraceSectionMetric 添加了数量测量功能。(Ic121ab/264398606

版本 1.2.0-alpha15

2023 年 6 月 7 日

发布了 androidx.benchmark:benchmark-*:1.2.0-alpha15版本 1.2.0-alpha15 中包含这些提交内容。

新功能

  • 添加了实验性 MemoryUsageMetric,用于跟踪目标应用的内存使用情况。(I56453b/133147125b/281749311
  • 通过 PerfettoTrace.record 添加了对完全自定义 Perfetto 配置的支持(If9d75b/280460183
  • 添加了用于跳过基准配置文件生成的属性。使用方法:./gradlew assemble -Pandroidx.baselineprofile.skipgeneration。(I37fdab/283447020

API 变更

  • collectBaselineProfile API 始终会生成稳定的基准配置文件。collectStableBaselineProfile API 已被移除,应改为使用 collectBaselineProfile。(I17262b/281078707
  • BaselineProfileRulefilterPredicate 参数改成了非 null 参数,并设置了等效的默认值,以使文档中的默认过滤器行为更加清晰。(I3816e)

bug 修复

  • dryRunMode 中禁用了 IsolationActivity 和 Perfetto 跟踪,以大幅提高性能,因为这些占据了大部分的运行时。(Ie4f7d)
  • 支持使用插桩测试参数 androidx.benchmark.profiling.mode=StackSamplingandroidx.benchmark.profiling.sampleFrequency 在 Macrobenchmark 中进行调用堆栈采样。(I1d13bb/282188489
  • 修复了在 Android U (API 34) 及模拟器上丢弃着色器时崩溃的问题。(I031cab/274314544

版本 1.2.0-alpha14

2023 年 5 月 3 日

发布了 androidx.benchmark:benchmark-*:1.2.0-alpha14版本 1.2.0-alpha14 中包含这些提交内容。

bug 修复

  • 修复了 FrameTimingMetric 在帧 ID 不一致时会忽略这些帧的问题。这个问题会导致最新平台版本 (API 31+) 上的一些动画在 RenderThread 进行动画处理时(例如在呈现涟漪效果期间)会忽略许多帧。(I747d2b/279088460
  • 修复了轨迹处理器解析大于 64Mb 的轨迹的问题。(Ief831b/269949822
  • 修复了由于 pm dump-profiles 命令输出不同而导致 Android U 上的基准配置文件生成失败的问题。(Id1392b/277645214
  • 修复了 GPU 时钟锁定脚本,以正确比较字符串。(I53e54b/213935715

版本 1.2.0-alpha13

2023 年 4 月 5 日

发布了 androidx.benchmark:benchmark-*:1.2.0-alpha13版本 1.2.0-alpha13 中包含这些提交内容

API 变更

  • 添加了生成基准配置文件时使用的配置文件类型参数,以支持即将推出的启动配置文件功能(Ie20d7b/275093123
  • 添加了新的实验性 TraceMetric API,用于根据 Perfetto 轨迹的内容定义完全自定义指标。(I4ce31b/219851406
  • 添加了一个实验性指标,用以确定基准运行期间的页面故障数。(I48db0)

版本 1.2.0-alpha12

2023 年 3 月 22 日

发布了 androidx.benchmark:benchmark-*:1.2.0-alpha12版本 1.2.0-alpha12 中包含这些提交内容。

新功能

  • 新的基准配置文件 Gradle 插件已发布 Alpha 版,简化了基准配置文件的生成,还能简化开发者工作流程。

API 变更

  • 移除了 API 21 和 22 上的 Perfetto 跟踪支持,其中包括 Microbenchmark 和实验性 PerfettoTrace API。在此版本之前,UiAutomation 连接在部分设备上不可靠。(I78e8c)
  • 针对 PerfettoTraceProcessor 添加了公共实验性 API,以启用轨迹内容解析。这朝着基于 Perfetto 轨迹数据的完全自定义指标迈进了一步。(I2659eb/219851406

版本 1.2.0-alpha11

2023 年 3 月 8 日

发布了 androidx.benchmark:benchmark-*:1.2.0-alpha11版本 1.2.0-alpha11 中包含这些提交内容

bug 修复

  • 修复了在具有多个 APK 的 app bundle 中重新安装配置文件或从中提取配置文件时 MacrobenchmarkRuleBaselineProfileRule 中出现崩溃的问题。(I0d8c8b/270587281

版本 1.2.0-alpha10

2023 年 2 月 22 日

发布了 androidx.benchmark:benchmark-*:1.2.0-alpha10版本 1.2.0-alpha10 中包含这些提交内容

新功能

  • 在 Android 14 及更高版本中,得益于新的平台功能,Macrobenchmark 不再重新安装目标应用来重置编译状态。以前,在每次运行基准测试之前,都必须有一个已取得 root 权限的设备,或者处理被删除的所有应用状态(例如用户登录)。(I9b08cb/249143766

bug 修复

  • 修复了 DryRunMode,使其不再因编译跳过而崩溃并出现空配置文件,而是会运行一次迭代并提取该配置文件,确保捕获到某些内容。(I2f05db/266403227
  • 修复了在旧 API 级别上检查是否存在 Powerstats 时出现的 PowerMetric 崩溃问题。(5faaf9b/268253898

版本 1.2.0-alpha09

2023 年 1 月 11 日

发布了 androidx.benchmark:benchmark-*:1.2.0-alpha09版本 1.2.0-alpha09 中包含这些提交内容

bug 修复

  • 允许将 None 传递给 androidx.benchmark.enabledRules 插桩,以停止生成所有基准/基准配置文件。(I3d7fdb/258671856
  • 修复了应用模块(即,非自插桩测试 APK)中的 PerfettoTrace 捕获问题 (I12cfc)
  • 修复了 Studio 输出中的基准配置文件 adb 拉取参数的顺序(I958d1b/261781624
  • 现在,当您尝试运行 Macrobenchmark 时,Arm 模拟器 API 33 能被正确识别,并可正确输出警告。(69133bb/262209591
  • 在 Macrobenchmark 测试中跳过无电池设备的电池电量检查(fe4114b/232448937

版本 1.2.0-alpha08

2022 年 12 月 7 日

发布了 androidx.benchmark:benchmark-*:1.2.0-alpha08版本 1.2.0-alpha08 中包含这些提交内容

API 变更

  • 在测试中添加了新的实验性 API PerfettoTrace.record {}PerfettoTraceRule,用于捕获 Perfetto 轨迹(也称为系统轨迹),以检查测试行为和性能。(I3ba16)
  • BaselineProfileRule 现在接受过滤器谓词,而不是软件包前缀列表。这样一来,测试将完全控制过滤。(I93240)
  • 添加了一个实验性 API BaselineProfileRule.collectStableBaselineProfile,该 API 会等待基准配置文件可稳定地用于 N 次迭代。(I923f3)
  • 添加了使用 BaselineProfileRule 生成基准配置文件时指定输出文件名前缀的功能。(I7b59fb/260318655

bug 修复

  • 提高了文件输出写入的安全性,这应该可以防止输出文件无法被静默地写入/附加,尤其是在 API 21/22 上。(If8c44b/227510293
  • 修复了 simpleperf 跟踪输出以正确创建并放置文件。这应该还可以更全面地解决 Gradle 无法成功拉取文件的问题。(I12a1cb/259424099
  • 改进了 profileinstaller 版本过旧时输出的 profileinstaller 错误消息。现在,此 API 会提醒您更新 profileinstaller 版本 (1.2.1) 以衡量 API 31 到 33 上的基准配置文件,而不是指明它不受支持。(Ia517fb/253519888
  • 修复了错误消息“Print 需要使用 API <=23”中的多个 shell 命令失败的问题,包括失败的 perfetto 捕获二进制文件设置和失败的轨迹捕获(Ib6b87b/258863685
  • 自动将生成的配置文件规则排序以尽可能减少随时间推移的变更次数(在将配置文件规则签入源代码控制系统时)。(Ie2509)
  • 修复了在 Android 13 (API 33) 之下未取得 root 权限的 build 上触发 Expected no stderr from echo 3 > /proc/sys/vm/drop_caches 消息时出现的崩溃问题(I6c245b/259508183

已知问题 - 由于 profileinstaller 清单中缺少广播注册表(尚未发布),MacrobenchmarkScope.dropShaderCache() 可能会崩溃。(I5c728b/258619948)如需解决 profileinstaller:1.3.0-alpha02 中的问题,请将以下内容添加到您的应用的(而非基准的)AndroidManifest.xml 中:

  <!-- workaround bug in profileinstaller 1.3.0-alpha02, remove when updating to alpha03+ -->
  <receiver
    android:name="androidx.profileinstaller.ProfileInstallReceiver"
    android:permission="android.permission.DUMP"
    android:exported="true">
    <intent-filter>
        <action android:name="androidx.profileinstaller.action.BENCHMARK_OPERATION" />
    </intent-filter>
  </receiver>

版本 1.2.0-alpha07

2022 年 11 月 9 日

发布了 androidx.benchmark:benchmark-*:1.2.0-alpha07版本 1.2.0-alpha07 中包含这些提交内容

API 变更

  • 添加了 PowerMetric API,用于测量 Macrobenchmark 中的能耗和功耗。(Ife601b/220183779
  • 修复了 MacrobenchmarkScope.dropShaderCache(),以实际丢弃着色器缓存。这会从 StartupMode.COLD 基准中移除大约 20 毫秒的噪声,因为着色器现在每次迭代时都会一直被清除。之前,使用预热迭代的 Partial 编译会误报快速数字,因为在预热期间发生着色器缓存的可能性更大。此修复程序需要已取得 root 权限的设备或者在目标应用中使用 profileinstaller:1.3.0-alpha02。如需了解 ProfileInstaller 库的 API 变更,请参阅 ProfileInstaller 1.30-alpha02 页面。(Ia5171b/231455742
  • 添加了 TraceSectionMode("label", Mode.Sum),允许测量在具有相同标签的多个轨迹部分所花的总时间。例如,TraceSectionMetric("inflate", Mode.Sum) 会在 Macrobenchmark 测试的总膨胀时间中报告指标 inflateMs。还移除了 API 29 要求,因为 TraceSectionMetric 可与目标 API 级别较低的 androidx.tracing.Trace 搭配使用,并在目标应用中使用 forceEnableAppTracing。(Id7b68b/231455742

bug 修复

  • 通过验证所有输出/错误,提高了所有内部 shell 命令的安全性。(I5984db/255402908b/253094958
  • 在基准配置文件 adb pull 命令中指定设备,以便能在连接了多个设备(最多一个模拟器)时直接复制拉取命令(I6ac6cb/223359380
  • 针对 Macrobenchmark 测试 APK 未设置为自插桩的情形添加了错误消息。此错误消息会阻止在目标应用的进程内进行 Macrobenchmark 测试。在此过程中,宏基准将无法编译/终止/冷启动应用,也无法控制其自身权限 (I4279b)
  • 修复了 measureRepeated()StartupMode.COLD 无法在 setupBlock 后终止目标进程的问题。现在,setupBlock 与应用交互将不会使应用进程保持运行,也不会导致冷启动测量无效。(I8ebb7)

版本 1.2.0-alpha06

2022 年 10 月 24 日

发布了 androidx.benchmark:benchmark-*:1.2.0-alpha06版本 1.2.0-alpha06 中包含这些提交内容

API 变更

  • 在 Android 13 (API 33) 中,BaselineProfileRule 不再需要 root 权限,并且不再处于实验阶段。(Ie0a7db/250083467b/253094958
    • 这项变更还修复了在未获 root 权限的设备上如何将应用的配置文件刷入磁盘的问题,但需要更新目标应用的 profileinstaller 依赖项。
    • 如需在未取得 root 权限的设备上使用 BaselineProfileRuleCompilationMode.Partial(warmupIterations),您还必须将目标应用更新为使用 androidx.profileinstaller.profileinstaller:1.3.0-alpha01。这样可以正确地将配置文件刷入磁盘,以便进行编译/提取。

bug 修复

  • 修复了 API 33 及更高版本上的 SampledProfiling 崩溃问题。(I40743b/236109374

版本 1.2.0-alpha05

2022 年 10 月 5 日

发布了 androidx.benchmark:benchmark-*:1.2.0-alpha05版本 1.2.0-alpha05 中包含这些提交内容

bug 修复

  • 修复了 Studio 系统轨迹查看器中针对基准捕获的轨迹的帧细分(I3f3aeb/239677443
  • 更正了 FrameTimingMetric,将 FrameOverrun 列为需要 API 31 而不是 29(I716ddb/220702554
  • BaselineProfileRule 中设置了迭代,并在未安装目标软件包时明确抛出(已针对 MacrobenchmarkRule 完成这一设置)。(Ic09a3b/227991471

版本 1.2.0-alpha04

2022 年 9 月 21 日

发布了 androidx.benchmark:benchmark-*:1.2.0-alpha04版本 1.2.0-alpha04 中包含这些提交内容

新功能

  • 在 Macrobenchmark 中添加了对 dryRunMode.enable 插桩参数的支持(已在 Microbenchmark 中提供),以加快本地开发和验证应用自动化(例如在提交前测试中)。这会将迭代计数替换为 1,跳过编译,抑制所有配置错误,并停用 .json 文件输出衡量。(Ib51b4b/175149857

    在 Gradle 命令行中:

    ./gradlew macrobenchmark:cC -P android.testInstrumentationRunnerArguments.androidx.benchmark.dryRunMode.enable=true
    

    在 build.gradle 中:

    android {
        defaultConfig {
            testInstrumentationRunnerArgument 'androidx.benchmark.dryRunMode.enable', 'true'
        }
    }
    

bug 修复

  • 修复了 StartupTimingMetric,使其不再需要通过 MacrobenchmarkScope.startActivityAndWait() 启动测量的 activity。这意味着,该指标可以从通知、Context.startActivity()、基于应用内 activity 的导航或 shell 命令等中选取启动模式。(Ia2de6b/245414235
  • 通过降低帧检测的严格程度修复了以下 bug:尝试等待在模拟器上完成启动时,startActivityAndWait 会发生超时。(Ibe2c6b/244594339b/228946895

版本 1.2.0-alpha03

2022 年 9 月 7 日

发布了 androidx.benchmark:benchmark-*:1.2.0-alpha03版本 1.2.0-alpha03 中包含这些提交内容

新功能

  • 添加了用于将 BenchmarkStateBenchmarkRule / JUnit4 分开使用的实验性 API。(Id478fb/228489614

bug 修复

版本 1.2.0-alpha02

2022 年 8 月 24 日

发布了 androidx.benchmark:benchmark-*:1.2.0-alpha02版本 1.2.0-alpha02 中包含这些提交内容

API 变更

  • MacrobenchmarkScope.killProcess() 默认为 am force stop,即使已取得 root 权限也不例外,但生成基准配置文件期间除外。可使用可选的布尔值参数将其替换。(02cce9b/241214097

bug 修复

  • 支持为系统应用生成基准配置文件。(I900b8b/241214097
  • 支持在未取得 root 权限的设备上检查 ODPM 功耗指标。(a38c78b/229623230

版本 1.2.0-alpha01

2022 年 7 月 27 日

发布了 androidx.benchmark:benchmark-*:1.2.0-alpha01版本 1.2.0-alpha01 中包含这些提交内容

新功能

  • 新增了 tracing-perfetto-common 组件,让工具可在会显示 Perfetto SDK 跟踪记录的应用中启用 Perfetto SDK 跟踪功能 (I2cc7f)
  • 添加了 androidx.benchmark.enabledRules 插桩参数,以允许过滤仅针对基准运行 MacroBenchmark 的情况,或过滤仅针对生成基准配置文件运行 MacroBenchmark 的情况。传入“Macrobenchmark”或“BaselineProfile”即可仅运行一种类型的测试,例如在模拟器上生成 BaselineProfiles 时。您也可以使用逗号分隔列表。(I756b7b/230371561

    例如,在 Macrobenchmark 的 build.gradle 中:

    android {
        defaultConfig {
            testInstrumentationRunnerArgument 'androidx.benchmark.enabledRules', 'BaselineProfile'
        }
    }
    

    或者在 Gradle 命令行中:

    ./gradlew macrobenchmark:cC -P android.testInstrumentationRunnerArguments.androidx.benchmark.enabledRules=BaselineProfile
    

API 变更

  • 添加了新的 PowerMetric,用于测量基准测试中的能耗和功耗任务。(I9f39bb/220183779
  • 添加了新的编译模式 CompilationMode.Ignore,用于跳过配置文件重置和编译。(Ibbcf8b/230453509
  • BaselineProfileRule#collectBaselineProfile 添加了一个新参数,以按软件包名称过滤输出文件(If7338b/220146561
  • 让开发者能够对设备进行放电以测量功耗。(I6a6cb)
  • MacrobenchmarkScope 中添加了清除着色器缓存的功能。(I32122)
  • 让开发者能够配置指标类型的显示并详细显示预期的子系统类别。(I810c9)
  • 以前,只要在不受支持的设备上运行,基准中就会抛出 UnsupportedOperationException。现在,仅当该指标用于不受支持的设备上时(即:PowerMetric.configure),才会出现不支持的操作异常 (UOE) 情况。(I5cf20b/227229375
  • 添加了 TotalPowerMetricTotalEnergyMetric,用于在 Macrobenchmark 中测量每个系统类别的总功耗和能耗。(I3b26bb/224557371

bug 修复

  • 修复了以下问题:在未取得 root 权限的 build 上的各 Macrobenchmark 之间,系统未正确重置已编译的方法。遗憾的是,每次迭代都需要重新安装该 APK,这会清除每个 Mmacrobenchmark 的应用数据。(I31c74b/230665435
  • 修复了 API 21/22 上的跟踪记录崩溃问题(If7fd6b/227509388b/227510293b/227512788
  • 改进了 activity 启动完成检测,以修复启动 Macrobenchmark 期间的“无法读取任何指标”异常。(Ia517c)

版本 1.1.1

版本 1.1.1

2022 年 11 月 9 日

发布了 androidx.benchmark:benchmark-*:1.1.1版本 1.1.1 中包含这些提交内容

bug 修复

  • 修复了在某些 Android11 (API 30) 及更高版本的设备上发生的 android.system.ErrnoException: open failed: EACCES 问题。这是从 1.2.0-alpha01 中择优挑选的修复程序。(aosp/2072249)

版本 1.1.0

版本 1.1.0

2022 年 6 月 15 日

发布了 androidx.benchmark:benchmark-*:1.1.0版本 1.1.0 中包含这些提交内容

  • 此版本与 androidx.benchmark:benchmark-*:1.1.0-rc03 完全相同。

自 1.0.0 以来的重要变更

版本 1.1.0-rc03

2022 年 6 月 1 日

发布了 androidx.benchmark:benchmark-*:1.1.0-rc03版本 1.1.0-rc03 中包含这些提交内容。

bug 修复

版本 1.1.0-rc02

2022 年 5 月 11 日

发布了 androidx.benchmark:benchmark-*:1.1.0-rc02版本 1.1.0-rc02 中包含这些提交内容

  • 请注意,此版本包含一项行为变更,应用现在会在每次基准测试之间完全重新安装,以确保测量结果准确。

bug 修复/行为变更

  • 修复了以下问题:应用编译在 Macrobenchmark 测试之间未正确重置,而且在未取得 root 权限的 build 中,应用编译完全无法重置。这修复了运行多项测试经常会导致 CompilationMode 对测量结果几乎没有影响的问题。为了解决此问题,目标应用现在会完全重新安装每个测试方法,这将清除每次 Macrobenchmark 测试之间的应用数据。(I31c74b/230665435

  • 由于这会防止应用在测试前设置状态,因此现在可以跳过编译/重新安装来解决此问题。例如,您可以使用 shell 命令 cmd package compile -f -m speed <package> 完全编译目标,然后绕过 Macrobenchmark 的编译步骤。

    例如,在 Macrobenchmark 的 build.gradle 中:

    android {
        defaultConfig {
            testInstrumentationRunnerArgument 'androidx.benchmark.compilation.enabled, 'false'
        }
    }
    

    或者在 Gradle 命令行中:

    ./gradlew macrobenchmark:cC -P android.testInstrumentationRunnerArguments.androidx.benchmark.compilation.enabled=false
    
  • 添加 androidx.benchmark.enabledRules 插桩参数以支持在 Macrobenchmark 与生成测试的基准配置文件之间共享模块。传入“Macrobenchmark”或“BaselineProfile”即可仅运行一种类型的测试,例如在模拟器上生成 BaselineProfiles 时。(I756b7b/230371561

    例如,在 Macrobenchmark 的 build.gradle 中:

    android {
        defaultConfig {
            testInstrumentationRunnerArgument 'androidx.benchmark.enabledRules', 'BaselineProfile'
        }
    }
    

    或者在 Gradle 命令行中:

    ./gradlew macrobenchmark:cC -P android.testInstrumentationRunnerArguments.androidx.benchmark.enabledRules=BaselineProfile
    

版本 1.1.0-rc01

2022 年 4 月 20 日

发布了 androidx.benchmark:benchmark-*:1.1.0-rc01版本 1.1.0-rc01 中包含这些提交内容

bug 修复

  • Android Studio 中的基准配置文件输出链接现在使用唯一的文件名。这样,输出始终会反映使用 BaselineProfileRule 的最新结果。(aosp/2057008b/228203086

版本 1.1.0-beta06

2022 年 4 月 6 日

发布了 androidx.benchmark:benchmark-*:1.1.0-beta06版本 1.1.0-beta06 中包含这些提交内容

bug 修复

  • 修复了 API 21/22 上的跟踪记录崩溃问题(If7fd6b/227509388
  • 改进了 activity 启动完成检测,以修复启动 Macrobenchmark 期间的“无法读取任何指标”异常。(Ia517c)
  • 修复了使用 CompilationMode.None() 时 Macrobenchmark 的启动指标。在此变更生效之前,CompilationMode.Partial() 的运行速度似乎慢于 Compilation.None()。(611ac9)

版本 1.1.0-beta05

2022 年 3 月 23 日

发布了 androidx.benchmark:benchmark-*:1.1.0-beta05版本 1.1.0-beta05 中包含这些提交内容

bug 修复

版本 1.1.0-beta04

2022 年 2 月 23 日

发布了 androidx.benchmark:benchmark-*:1.1.0-beta04版本 1.1.0-beta04 中包含这些提交内容

bug 修复

  • 修复了在 Android 10 中缺少指标的问题,还修复了因系统在轨迹中未正确捕获进程名称而导致出现的 NoSuchElementException。(Ib4c17b/218668335

  • 在 Android Q (API 29) 及更高版本中使用 PowerManager 进行温控调频检测。这可显著降低温控调频检测发生误报的频率(在 90 秒冷却期之后重试基准测试),并显著提高在用户 build 上进行基准测试的速度。同时这也使得即使时钟处于锁定状态,系统仍可进行热限制检测(如果锁定值对于设备的物理环境而言过高)。(I9c027b/217497678b/131755853

  • 过滤对 measureRepeated 线程的 Simpleperf 采样性能剖析,目的就在于简化检查(Ic3e12b/217501939

  • 支持来自多进程应用中已命名界面子进程的指标(Ice6c0b/215988434

  • 过滤基准配置文件规则,以 Android 9 (SDK 28) 为目标平台。aosp/1980331 b/216508418

  • 使用 Compilation.None() 时跳过配置文件安装。此外,在应用使用较低版本的 androidx.profileinstaller 和 Android Gradle 插件时还会报告警告。aosp/1977029

版本 1.1.0-beta03

2022 年 2 月 9 日

发布了 androidx.benchmark:benchmark-*:1.1.0-beta03版本 1.1.0-beta03 中包含这些提交内容

API 变更

  • 在 macrobenchmark 库中的实验性标记下方添加了 AudioUnderrunMetric,以允许检测音频欠载(Ib5972
  • BaselineProfileRule 不再接受 setup 块,因为其作用与 profileBlock 相同。(Ic7dfeb/215536447

    例如:

    @Test
    fun collectBaselineProfile() {
        baselineRule.collectBaselineProfile(
            packageName = PACKAGE_NAME,
            setupBlock = {
                startActivityAndWait()
            },
            profileBlock = {
                // ...
            }
        )
    }
    
    @Test
    fun collectBaselineProfile() {
        baselineRule.collectBaselineProfile(
            packageName = PACKAGE_NAME,
            profileBlock = {
                startActivityAndWait()
                // ...
            }
        )
    }
    

bug 修复

  • 修复了以下问题:在 Studio 输出中建立关联后,微平台性能分析器记录的轨迹在后续运行中无法更新(I5ae4db/214917025
  • 在 API 23 上阻止编译 shell 命令 (Ice380)
  • FrameCpuTime 重命名为 FrameDurationCpu,并将 FrameUiTime 重命名为 FrameDurationUi,以指明它们是时长(而非时间戳)并使前缀保持一致。(I0eba3b/216337830

版本 1.1.0-beta02

2022 年 1 月 26 日

发布了 androidx.benchmark:benchmark-*:1.1.0-beta02版本 1.1.0-beta02 中包含这些提交内容

bug 修复

  • 与其他性能剖析输出类似,微基准堆栈采样/方法跟踪性能分析结果现在会在 Studio 输出中添加链接,并且不会抑制分配指标。(Idcb65b/214440748b/214253245
  • BaselineProfileRule 现在会在 logcat 和 Studio 输出中输出 adb pull 命令的结果,以拉取生成的 BaselineProfile 文本文件。(f08811)

版本 1.1.0-beta01

2022 年 1 月 12 日

发布了 androidx.benchmark:benchmark-*:1.1.0-beta01版本 1.1.0-beta01 中包含这些提交内容

bug 修复

  • 修复了性能分析器参数启用设置被忽略的问题。(I37373b/210619998
  • 移除了已废弃的 CompliationModesI98186b/213467659
  • 为清楚起见,将 CompilationMode.Partial 的基准配置文件参数改成了枚举类型。(Id67ea)

版本 1.1.0-alpha13

2021 年 12 月 15 日

发布了 androidx.benchmark:benchmark-*:1.1.0-alpha13版本 1.1.0-alpha13 中包含这些提交内容

API 变更

  • 向 Android Q(API 29 及更高级别)上的微平台输出添加了低开销系统跟踪。请注意,这目前不会(通过 android.os.Traceandroidx.tracing Jetpack API)捕获自定义跟踪,以避免对结果产生影响。此跟踪在诊断不稳定性方面非常有用,尤其是针对基准之外的来源。(I298beb/205636583b/145598917
  • CompilationModes 分为三个类:完整、无、部分。之前它们以编译参数(现在我们视作实现细节)和功能命名,导致名称不一致。这样一来,不同平台版本上的权衡、潜在组合和行为就变得更加清晰明确。(I3d7bfb/207132597
  • 现在,“设置”和“衡量”始终是成对的,并且按顺序显示。您现在可以查询软件包名称和迭代(尽管在特定的预热场景中迭代可能是 null)。(Id3b68b/208357448b/208369635

bug 修复

  • 修复了 CompilationMode.Speed 被误处理为 None 的问题 (I01137)

版本 1.1.0-alpha12

2021 年 11 月 17 日

发布了 androidx.benchmark:benchmark-*:1.1.0-alpha12版本 1.1.0-alpha12 中包含这些提交内容

新功能

  • 针对基于轨迹的自定义时间测量增加了实验性 TraceSectionMetric。(I99db1b/204572664

bug 修复

  • 每次迭代时唤醒设备,以确保可以测试界面 - 需要停用锁屏功能。(Ibfa28b/180963442
  • 修复了模拟器和未取得 root 权限的设备在 StackSampling 分析模式下多次崩溃的问题(Icdbdab/202719335
  • 取消了每次迭代结束时 0.5 秒的休眠时间 - 如果您发现此次更改后缺少一些指标,请提交 bug。(Iff6aa)
  • 降低了数据丢失的几率,并减少了跟踪记录的内存开销(Id2544b/199324831b/204448861
  • 改为内存占用较小的 sched 存储格式,将轨迹大小缩减了约 40%。(Id5fb6b/199324831
  • 将启动指标的实现更新为始终在 renderthread 结束时结束。这将使各个平台版本间的测量结果更为一致,并且更贴近应用内衡量结果。(Ic6b55)

版本 1.1.0-alpha11

2021 年 11 月 3 日

发布了 androidx.benchmark:benchmark-*:1.1.0-alpha11版本 1.1.0-alpha11 中包含这些提交内容

API 变更

  • Macrobenchmark 现在的 minSdkVersion23。(If2655)
  • 新增了一个实验性 BaselineProfileRule,能够为应用的关键用户历程生成基准配置文件。后面提供了详细文档。(Ibbefab/203692160
  • 移除了为 Java 调用方添加的 measureRepeated 接口变体,因为它会导致在完成/解析该方法是产生歧义。Java 调用方将需要再从 measureRepeated 返回 Unit.Instance。如果由此给您带来不便,请提交 bug,我们会在未来版本中细探这一问题。(Ifb23eb/204331495

版本 1.1.0-alpha10

2021 年 10 月 27 日

发布了 androidx.benchmark:benchmark-*:1.1.0-alpha10版本 1.1.0-alpha10 中包含这些提交内容

API 变更

  • 向后移植 StartupTimingMetric 以向后兼容 API 23。这一新实现还能更好地处理 reportFullyDrawn(),以等待相应内容的呈现。(If3ac9b/183129298
  • 为 Java 调用方的多个 MacrobenchmarkScope 方法添加了 JvmOverloads。(I644feb/184546459
  • 提供了备用 MacrobenchmarkRule.measureRepeated 函数,该函数使用 Consumer<MacrobenchmarkScope> 实现 Java 语言中的惯用用法。(If74abb/184546459

bug 修复

  • 修复了跟踪记录未尽早开始以及缺少指标数据的问题。这应该可以修复由库本身引起的“在基准运行期间无法读取任何指标”异常。(I6dfcbb/193827052b/200302931
  • FrameNegativeSlack 已重命名为 FrameOverrun 以阐明其的含义:帧超出其时间预算的程度。(I6c2aab/203008701

版本 1.1.0-alpha09

2021 年 10 月 13 日

发布了 androidx.benchmark:benchmark-*:1.1.0-alpha09版本 1.1.0-alpha09 中包含这些提交内容

bug 修复

版本 1.1.0-alpha08

2021 年 9 月 29 日

发布了 androidx.benchmark:benchmark-*:1.1.0-alpha08版本 1.1.0-alpha08 中包含这些提交内容

API 变更

  • 使滚动 macrobenchmark 可以往回运行到 API 23(If39c2b/183129298
  • 向界面和 JSON 输出添加了新型采样指标,侧重于每次迭代多个样本的百分位数。(I56247b/199940612
  • 整个基准库都改为使用浮点指标(在 Studio 界面中会被截断)。(I69249b/197008210

版本 1.1.0-alpha07

2021 年 9 月 1 日

发布了 androidx.benchmark:benchmark-*:1.1.0-alpha07版本 1.1.0-alpha07 中包含这些提交内容

API 变更

  • 将最低的 API 级别提升到了 21,以反映未来预期支持的最低 API 级别。当前支持的最低 API 级别仍通过 requiredApi() 传达,目前为 29(I440d6b/183129298

bug 修复

  • 修复了 ProfileInstaller,以更方便使用基准配置文件的应用使用 CompilationMode.BaselineProfile 运行 MacroBenchmark。(I42657b/196074999)注意:还需要更新到 androidx.profileinstaller:profileinstaller:1.1.0-alpha04 或更高版本。
  • StartupMode.COLD + CompilationMode.None 基准现在更加稳定。(I770cdb/196074999

版本 1.1.0-alpha06

2021 年 8 月 18 日

发布了 androidx.benchmark:benchmark-*:1.1.0-alpha06版本 1.1.0-alpha06 中包含这些提交内容

API 变更

  • 添加了 androidx.benchmark.iterations 插桩参数,以允许在本地进行测试/性能分析时手动替换迭代计数。(6188beb/194137879

bug 修复

  • 已在 API 29 及更高级别上切换到 Simpleperf 并将其作为默认采样性能分析器。(Ic4b34b/158303822

已知问题

  • CompilationMode.BaselineProfile 仍在开发中。目前,请避免使用它来确定配置文件的优良度。

版本 1.1.0-alpha05

2021 年 8 月 4 日

发布了 androidx.benchmark:benchmark-*:1.1.0-alpha05版本 1.1.0-alpha05 中包含这些提交内容。

由于间歇性崩溃问题,1.1.0-alpha04 已取消,未发布。b/193827052

API 变更

  • startActivityAndWait 切换为通过 am start 调用启动事件,这会使每次测量迭代的时间缩短约 5 秒,但代价是不再支持 intent parcelable。(I5a6f5b/192009149

bug 修复

  • 降低了热节流检测的激进性,并在频繁检测到节流时重新计算基准。(I7327b)
  • 修复了 FrameTimingMetric,以支持 Android S Beta 版(Ib60ccb/193260119
  • 使用 EmptyActivity 使目标应用退出强行停止状态,以便更好地支持 CompilationMode.BaselineProfile。(Id7cacb/192084204
  • 将轨迹文件扩展名更改为 .perfetto-trace,以符合平台标准。(I4c236b/174663039
  • StartupTimingMetric 现在会输出“fullDrawnMs”指标,以测量直到应用完成渲染所用的时间。如需为您的应用定义此指标,请在初始内容准备就绪时(例如,从数据库或网络加载初始列表项时)调用 Activity.reportFullyDrawn。(无需对 ComponentActivity 进行 build 版本检查即可使用 reportFullyDrawn 方法。)请注意,您的测试必须运行足够长的时间才能捕获此指标(startActivityAndWait 不会等待 reportFullyDrawn)。(If1141b/179176560
  • 将界面元数据附加到轨迹的时间缩短了 50 多毫秒(Ic8390b/193923003
  • 停止跟踪后轮询频率显著提高,这可将示例启动基准运行时间缩短 30% 以上(Idfbc1b/193723768

版本 1.1.0-alpha03

2021 年 6 月 16 日

发布了 androidx.benchmark:benchmark-*:1.1.0-alpha03版本 1.1.0-alpha03 中包含这些提交内容

新功能

bug 修复

  • 用于抑制基准错误的 Gradle 示例代码已更新为使用一个非废弃的 API,其语法也支持 .gradle.kts 用户。

    例如:

    testInstrumentationRunnerArguments["androidx.benchmark.suppressErrors"] = "EMULATOR,LOW-BATTERY"
    

版本 1.1.0-alpha02

2021 年 5 月 18 日

Benchmark 版本 1.1.0-alpha02 为基准化分析引入了一个重要组件 - Macrobenchmark。除了提供用于衡量 CPU 循环的基准之外,Macrobenchmark 还可用于衡量整个应用的互动(如启动和滚动)和捕获跟踪记录。如需了解详情,请参阅库文档

发布了 androidx.benchmark:benchmark-*:1.1.0-alpha02版本 1.1.0-alpha02 中包含这些提交内容

新功能

添加了 Macrobenchmark 工件(androidx.benchmark:benchmark-macro-junit4androidx.benchmark:benchmark-macro

  • 从应用(在本地或 CI 中)中捕获启动、滚动/动画性能指标
  • 从 Android Studio 中捕获和检查跟踪记录

bug 修复

  • 解决了 Android 12 上输出目录的 shell 权限问题(注意 - 可能需要将 Android Gradle 插件更新到 7.0.0 Canary 版以及将 Android Studio 更新为 Arctic Fox [2020.3.1],以继续在受影响的设备上捕获输出文件)。(Icb039)
  • 在 BenchmarkPlugin 中支持配置缓存(6be1c1b/159804788
  • 简化了文件输出 - 默认情况下,在不需要 requestLegacyExternalStorage=true 的目录中启用(8b5a4db/172376362
  • 修复了以下问题:库输出关于在没有 JIT 线程的平台版本上找不到 JIT 线程的 logcat 警告。(I9cc63b/161847393
  • 修复了读取设备最大频率的问题。(I55c7a)

版本 1.1.0-alpha01

2020 年 6 月 10 日

发布了 androidx.benchmark:benchmark-common:1.1.0-alpha01androidx.benchmark:benchmark-gradle-plugin:1.1.0-alpha01androidx.benchmark:benchmark-junit4:1.1.0-alpha01版本 1.1.0-alpha01 中包含这些提交内容

1.1 的新功能

  • 分配指标 - 基准现在会在预热和计时后运行一个额外的阶段,以捕获分配计数。分配可能会导致旧版平台出现性能问题(O 中的 140ns 变为 M 中的 8ns - 在 Nexus5X 上测量,时钟处于锁定状态)。该指标显示以下位置:在 Android Studio 控制台输出以及
  • 性能剖析支持 - 您现在可以捕获基准运行的性能剖析数据,以检查代码运行缓慢的原因。Benchmark 支持捕获方法跟踪记录或 ART 中的方法采样。您可以使用 Android Studio 中的性能剖析器(依次选择“File > Open”)来检查这些文件。
  • Benchmark Gradle 插件现在提供默认设置,以便简化设置过程:
    • testBuildType 默认设置为发布,以避免使用内置代码覆盖率的依赖项。发布 buildType 也会配置为默认 buildType,以便 Android Studio 能够在首次打开项目时自动选择正确的 build 变体。(b/138808399)
    • signingConfig.debug 用作默认的签名配置 (b/153583269)

** 问题修复 **

  • 显著降低了预热过渡开销,其中每个基准的首次测量值都因人为原因而高于其他测量值。该问题在非常小的基准(1 毫秒或更短)中更加明显。(b/142058671)
  • 修复了从命令行运行时针对每个基准输出的 InstrumentationResultParser 错误。(I64988b/154248456

已知问题

  • 命令行、Benchmark 的 Gradle 调用不直接输出结果。若要解决该问题,您可以查看 Studio,也可以解析 JSON 输出文件以获取结果。
  • Benchmark 报告无法从已安装应用 ID 以“android”或“download”(不区分大小写)结尾的应用的设备中拉取报告。遇到该问题的用户应将 Android Gradle 插件升级到 4.2-alpha01 或更高版本。

版本 1.0.0

Benchmark 版本 1.0.0

2019 年 11 月 20 日

发布了 androidx.benchmark:benchmark-common:1.0.0androidx.benchmark:benchmark-gradle-plugin:1.0.0androidx.benchmark:benchmark-junit4:1.0.0,这些版本与 1.0.0-rc01 相比没有变化。版本 1.0.0 中包含这些提交内容

1.0.0 的主要功能

使用 Benchmark 库,您可为应用代码编写性能基准测试并快速获得分析结果。

它可以防止出现构建和运行时配置问题并稳定设备性能,确保衡量值的准确性和一致性。直接在 Android Studio 中在持续集成中运行基准化分析,以观察代码性能随时间的变化情况,并防止出现回归。

主要功能包括:

  • 时钟稳定
  • 自动设置线程优先级
  • 支持界面性能测试,例如在 RecyclerView 示例
  • JIT 感知预热和循环
  • 用于后期处理的 JSON 基准输出

版本 1.0.0-rc01

2019 年 10 月 23 日

发布了 androidx.benchmark:benchmark-common:1.0.0-rc01androidx.benchmark:benchmark-gradle-plugin:1.0.0-rc01androidx.benchmark:benchmark-junit4:1.0.0-rc01版本 1.0.0-rc01 中包含这些提交内容

新功能

  • 向基准添加了 systrace 跟踪记录

bug 修复

  • 修复了由于优先级设置导致 JIT 无法在预热前结束的指标不稳定问题 (b/140773023)
  • 统一了 Android Gradle 插件 3.5 和 3.6 的 JSON 输出目录

版本 1.0.0-beta01

2019 年 10 月 9 日

发布了 androidx.benchmark:benchmark-common:1.0.0-beta01androidx.benchmark:benchmark-gradle-plugin:1.0.0-beta01androidx.benchmark:benchmark-junit4:1.0.0-beta01版本 1.0.0-beta01 中包含这些提交内容

新功能

  • 在每次预热之前运行垃圾回收,以减少从一个基准泄漏到下一个基准的内存压力 (b/140895105)

bug 修复

  • 添加了 androidx.annotation:android-experimental-lint 依赖项,以便在未使用实验性 API 时,Java 代码将正确生成 lint 错误,类似于 Kotlin 实验性注解针对 Kotlin 调用方提供的内容。
  • 现在可正确检测 Android Gradle 插件 3.6 中输出的 additionalTestOutputDir 插桩参数的使用情况,了解 AGP 何时处理数据副本。
  • 修复了 JSON 中未检测到的时钟频率,以正确打印 -1 (b/141945670)。

版本 1.0.0-alpha06

2019 年 9 月 18 日

发布了 androidx.benchmark:benchmark-common:1.0.0-alpha06androidx.benchmark:benchmark-gradle-plugin:1.0.0-alpha06androidx.benchmark:benchmark-junit4:1.0.0-alpha06版本 1.0.0-alpha06 中包含这些提交内容

新功能

  • 添加了检查以确定错误使用旧软件包的测试运行程序,该程序现在提供更有用的错误消息

API 变更

  • 实验性注解 ExperimentalAnnotationReport 现已正确公开。现在,使用实验性 BenchmarkState#report API 时需要此注释

版本 1.0.0-alpha05

2019 年 9 月 5 日

发布了 androidx.benchmark:benchmark-common:1.0.0-alpha05androidx.benchmark:benchmark-gradle-plugin:1.0.0-alpha05androidx.benchmark:benchmark-junit4:1.0.0-alpha05。点击此处可查看此版本中包含的提交内容。

API 变更

  • BenchmarkState.reportData API 现标记为实验性

bug 修复

  • 修复了时钟锁定脚本,该脚本在缺少 cutexpr shell 实用程序的设备上将失败。
  • 修复了 ./gradlew lockClocks 任务存在的以下问题:在以 su 实用程序的较旧版本(不支持 -c 标志)启用 root 权限的设备上,该任务会挂起。

版本 1.0.0-alpha04

2019 年 8 月 7 日

发布了 androidx.benchmark:benchmark-common:1.0.0-alpha04androidx.benchmark:benchmark-gradle-plugin:1.0.0-alpha04androidx.benchmark:benchmark-junit4:1.0.0-alpha04。点击此处可查看此版本中包含的提交内容。

此外还添加了有关如何在不使用 Gradle 的情况下使用 Benchmark 库的新文档,可用于不同的构建系统(例如 Bazel 或 Buck),以及在 CI 中运行时。如需了解详情,请参阅在不使用 Gradle 的情况下构建基准在持续集成环境中运行基准测试

新功能

  • Gradle 插件
    • 现在自动停用测试覆盖范围,并默认设置 AndroidBenchmarkRunner (b/138374050)
    • 增加了在运行基准和使用 AGP 3.6+ 时,对基于 AGP 的新数据副本的支持
  • 添加了 JSON 格式
    • 输出总基准测试运行时间 (b/133147694)
    • 现在,使用名称字符串(例如 @Parameters(name = "size={0},depth={1}"))的 @Parameterized 基准以 JSON 输出格式输出每个基准的参数名称和值 (b/132578772)
  • 模拟运行模式 (b/138785848)
    • 添加了“模拟运行”模式,仅运行每个基准循环一次以检查是否有错误/崩溃,而不捕获测量值。该模式非常有用,例如可在预提交中快速运行基准,以确认它们未损坏。

API 变更

  • 更改了模块结构,拆分了库 (b/138451391)
    • benchmark:benchmark-junit4 包含具有 JUnit 依赖项的类:AndroidBenchmarkRunnerBenchmarkRule。这两个类均已移入 androidx.benchmark.junit4 软件包中
    • benchmark:benchmark-common 包含其余逻辑,其中包括 BenchmarkState API
    • 通过这种拆分,该库将来可以在没有 JUnit4 API 的情况下支持基准化分析
  • 配置警告现在被视为错误,并且会使测试崩溃 (b/137653596)
    • 这样做是为了进一步鼓励准确测量,尤其是在 CI 中
    • 可以使用插桩参数将这些错误回退为警告。例如:-e androidx.benchmark.suppressErrors "DEBUGGABLE,LOW_BATTERY"

bug 修复

  • 写入 Q 设备上的外部存储空间时出现的错误会提供更具描述性的消息,并提供有关如何解决相应问题的建议
  • 在基准运行期间,屏幕会自动打开,而不是在屏幕关闭时失败

外部贡献

  • 感谢 Sergey Zakharov 为 JSON 输出改进以及修复屏幕关闭问题做出的贡献!

版本 1.0.0-alpha03

2019 年 7 月 2 日

发布了 androidx.benchmark:benchmark:1.0.0-alpha03androidx.benchmark:benchmark-gradle-plugin:1.0.0-alpha03。点击此处可查看此版本中包含的提交内容。

新功能

  • 在完整的 JSON 报告中公开每个基准因热节流而导致的休眠持续时间

bug 修复

  • 在 Android 插件和 Android 块之后,不再需要应用 Gradle 插件
  • 在使用分区存储的 Android 10 设备上添加了对基准报告的支持

版本 1.0.0-alpha02

2019 年 6 月 6 日

发布了 androidx.benchmark:1.0.0-alpha02androidx.benchmark:benchmark-gradle-plugin:1.0.0-alpha02。点击此处可查看此版本中包含的提交内容。

请注意,我们将 JSON 架构视为 API。我们计划遵循与其他 API 相同的稳定性约束:进入 Beta 版后即保持稳定(极少数例外情况),并在最终版本中进行修复,在次要版本中仅添加新内容,在主要版本中更改/移除内容。

API 变更

  • 翻新了 JSON 架构。对 JSON 架构的后续更改很可能仅限于新增特性:

    • 重新组织了结果对象结构,以支持将来的更多指标组 (b/132713021)
    • 在顶级对象中添加了测试运行上下文信息(例如,设备和 build 信息以及时钟是否处于锁定状态)(b/132711920)
    • 现在,时间指标名称中带有“ns”(b/132714527)
    • 扩充了每个报告指标的统计信息(最大值、中位数、最小值),并移除了简化的“nanos”摘要统计信息 (b/132713851)
  • 移除了 XML 输出 (b/132714414)

  • BenchmarkState.reportData API 中移除了热限制检测 (b/132887006)

bug 修复

  • 修复了 ./gradlew lockClocks 在某些最新的 OS 设备上不粘滞的问题 (b/133424037)
  • 停用了模拟器的限制检测 (b/132880807)

版本 1.0.0-alpha01

2019 年 5 月 7 日

发布了 androidx.benchmark:benchmark:1.0.0-alpha01。点击此处可查看此版本中包含的提交内容。