基准测试

在 Android Studio 中准确地衡量代码的性能。
最新更新 稳定版发布 候选发布版 Beta 版发布 Alpha 版发布
2024 年 8 月 21 日 1.3.0 - - -

声明依赖项

要添加对 Benchmark 的依赖项,您必须将 Google Maven 存储库添加到您的项目中。阅读 Google 的 Maven 存储库,了解更多信息。

宏基准测试

要在您的项目中使用 宏基准测试,请将以下依赖项添加到 build.gradle 文件中,用于您的 宏基准测试模块

Groovy

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

Kotlin

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

微基准测试

要在您的项目中使用 微基准测试,请将以下依赖项添加到 build.gradle 文件中,用于您的 微基准测试模块

Groovy

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

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

Kotlin

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

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

微基准测试库还提供了一个 Gradle 插件,可以与您的微基准测试模块一起使用。此插件为模块设置构建配置默认值,设置 基准测试输出复制到主机,并提供 ./gradlew lockClocks 任务

要使用此插件,请在顶层 build.gradle 文件的 `plugins` 块中包含以下行

Groovy

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

Kotlin

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

然后将插件应用于您的基准测试模块的 build.gradle 文件

Groovy

plugins {
  id 'androidx.benchmark'
}

Kotlin

plugins {
    id("androidx.benchmark")
}

反馈

您的反馈有助于使 Jetpack 变得更好。如果您发现新问题或有改进此库的想法,请告诉我们。在创建新问题之前,请查看此库中 现有的问题。您可以通过点击星形按钮为现有问题添加您的投票。

创建新问题

有关更多信息,请参阅 问题追踪器文档

版本 1.3

版本 1.3.0

2024 年 8 月 21 日

androidx.benchmark:benchmark-*:1.3.0 已发布。版本 1.3.0 包含 这些提交

自 1.2.0 以来微基准测试的更改

  • 在大多数设备上运行时,方法跟踪在微基准测试中默认启用
    • 方法跟踪在测量之后作为单独的阶段运行
    • 在某些平台和 ART 版本上,方法跟踪会影响后续的测量阶段 - 在这些版本上,方法跟踪默认情况下处于关闭状态,并且会向 Studio 输出打印警告。
  • 主线程基准测试和 ANR
    • 添加了 measureRepeatedOnMainThread 用于 UI 线程基准测试(例如与 Compose/View UI 交互的基准测试),以避免在运行数秒时出现 ANR。
    • 如果预计方法跟踪会超过 ANR 避免截止日期,则会跳过方法跟踪。将 androidx.benchmark.profiling.skipWhenDurationRisksAnr 设置为 false 以禁用此行为(不推荐用于 CI 运行)。
  • 混淆
    • 嵌入 Proguard 规则以改进启用混淆的微基准测试。
    • 库模块中的混淆/R8 需要 AGP 8.3,并且可以通过 android.buildTypes.release.androidTest.enableMinification 在你的 build.gradle 中启用。
    • 添加了实验性的 BlackHole.consume() API 以防止死代码消除 (If6812, b/286091643)
  • 指标
    • 实验性的 CPU 事件计数器功能(来自 perf_event_open 的指标,需要在大多数平台版本上使用 root),可以通过 InstrumentationArgument androidx.benchmark.cpuEventCounter.enable 访问(可以设置为 true),并且 androidx.benchmark.cpuEventCounter.events 可以设置为(例如,Instructions,CpuCycles)。这应该在某些 userdebug 模拟器上得到支持,但尚未在跨平台上测试支持。

自 1.2.0 以来 MACRObenchmark 的变化

  • 宏基准测试方法跟踪的全面改进。
    • 现在,方法跟踪的范围限定为 measureBlock 的持续时间,并且如果进程多次启动,可以捕获多个会话。
    • 以前,方法跟踪仅适用于 StartupMode.COLD 基准测试,并且不会捕获没有重新启动目标进程的 measureBlocks
    • 修复了宏基准测试中的方法跟踪刷新,因此即使在较慢的设备上,方法跟踪也应该完全捕获并有效。(I6349a, b/329904950)
  • 在进程被杀死时,正确地转储单个 warmUp 迭代期间的 ART 配置文件,以便 CompilationMode.Partial(warmup=N) 测量更准确。(I17923)
  • 删除着色器广播失败消息
    • 添加了调试建议以删除着色器广播失败消息
    • 添加两个 instrumentation 参数用于覆盖着色器丢弃行为,以解决在没有 ProfileInstaller 1.3 的情况下基准测试应用时的崩溃问题
      • androidx.benchmark.dropShaders.enable=true/false : 可以用来跳过所有着色器丢弃(包括在 StartupMode.Cold 启动中完成的丢弃),尤其是在基准测试尚未使用 profileinstaller 1.3 的应用时
      • androidx.benchmark.dropShaders.throwOnFailure=true/false : 可以用来容忍尝试丢弃着色器时发生的错误,例如在基准测试没有 profileinstaller 1.3 的应用时 (I4f573)
  • 添加了实验性的 MacrobenchmarkRule#measureRepeated 变体,它采用自定义的 PerfettoConfig 用于完全自定义的 Perfetto 跟踪记录。请注意,配置错误的配置可能会导致内置的指标类失败。(Idfd3d, b/309841164, b/304038384)
  • 在运行宏基准测试之前取消后台 dexopt 作业,以减少干扰。(I989ed)
  • 宏基准测试现在会等待 1 秒,以便目标应用程序刷新 ART 配置文件(以前它会等待 500 毫秒)。(I85a50, b/316082056)
  • TraceSectionMetric 改进
    • 注意:以下 TraceSectionMetric 更改可能会影响 CI 使用中的输出,并可能导致不连续性或破坏解析
    • 总和现在是默认值,因为此指标的大多数使用情况都是针对重复事件,而第一个值会在此类情况下丢弃数据
    • 更改为更可定制,并提供更多可用模式
    • 模式名称现在嵌入在指标输出名称中(在 Studio 和 JSON 中)
    • 现在支持使用 Trace.{begin|end}AsyncSection 创建的切片。
  • 指标
    • 电源 - 添加了 PowerMetric.deviceSupportsHighPrecisionTrackingPowerMetric.deviceBatteryHasMinimumCharge()PowerMetric.deviceSupportsPowerEnergy()
    • Metric.getResult 重命名为 getMeasurements 以匹配返回类型
    • 向所有启动检测失败添加了 log.w/异常标签。这不会改变当前的行为(因此一些错误会抛出异常,而另一些错误会静默地无法检测到启动),只是使它更易于理解。通常,那些 Log.w() 并无法报告启动指标的是那些缺少非帧事件的指标,当检测到启动时会抛出异常,除了帧计时信息(来自 UI/RT 切片)。(Id240f, b/329145809)
    • 添加了 frameCount 测量值到 FrameTimingMetric 中,以帮助发现测量值发生变化的原因是产生的帧数发生了变化(添加了新的动画,修复了失效问题)。(I1e5aa)
    • 澄清了 frameOverrunMs 是跟踪可用时首选指标的原因和原因。(I18749, b/329478323)
    • 修复了跟踪开始和结束处的未终止帧可能会配对在一起的问题,这将错误地报告为单个极长的帧。(I39353, b/322232828)
    • 当没有产生帧时,改进 FrameTimingMetric 错误,并且在指标解析失败时始终输出到跟踪的链接,以帮助诊断问题。(I956b9)
    • 修复了 FrameTimingMetric 无法解析帧 ID 导致的崩溃,尤其是在某些 OEM 设备上。(Ia24bc, b/303823815, b/306235276)
    • 放宽了 FrameMetrics 中检查的严格性,并添加了更多错误消息的详细信息。(Iadede)

自 1.2.0 以来,基准配置文件捕获/Gradle 插件的更改

  • 将 AGP 的最大推荐版本增加到 9.0.0-alpha01。
  • 确保 mergeArtProfilemergeStartupProfile 任务始终等待基准配置文件生成。(I623d6, b/343086054)
  • 成功生成基准配置文件将输出有关更改的摘要 (I824c8, b/269484510)
  • 添加了 DSL 以禁用警告 (Ic4deb, b/331237001)
  • 修复以确保基准测试在 automaticGenerationDuringBuild 关闭时使用生成的基准配置文件 (Ic144f, b/333024280)
  • 修复 BaselineProfile gradle 插件属性覆盖以启用基准配置文件生成和基准测试,方法是自定义 nonMinified 或基准构建类型。(Ib8f05, b/324837887)
  • 修复在 AGP 8.3.0-alpha15 之前将库基准配置文件包含在 AAR 中的问题。(I1d2af, b/313992099)
  • 修复了在生成任务结束时基准配置文件和启动配置文件的输出 URL。(I802e5, b/313976958)

自 1.2.0 以来其他重大更改

  • 跟踪捕获
    • 减少了从错误到记录的警告时,从 Perfetto 启动时的 EXITCODE 2 错误
    • 在基准测试中默认启用 AIDL 跟踪(需要 API 28)(Ia0af2, b/341852305)
    • 在基准测试中默认启用 porter 标签跟踪。这会捕获例如 wakelock 跟踪点。(Icfe44, b/286551983)
    • 增加了跟踪捕获启动超时,以避免在较慢的设备上启动跟踪时发生崩溃 (I98841, b/329145808)
    • 添加了公共 API PerfettoTraceProcessor.Session.queryMetrics API,包括 JSON、textproto 和 proto 二进制(未解码)变体。这些允许你查询内置于 TraceProcessor 中的指标 (I54d7f, b/304038382)
    • 在 Perfetto 跟踪记录中启用阻塞启动,以减少跟踪开始时丢失数据的风险。仅在 API 33+ 上支持。(Ie6e41, b/310760059)
  • JSON 输出
    • 在 JSON 输出的基准测试上下文中添加了其他信息
      • context.artMainlineVersion - Art 主线模块的整数版本(如果设备上存在,则为 -1,否则为 -1
      • context.build.id - 等于 android.os.Build.ID
      • context.build.version.codename - 等于 android.os.Build.VERSION.CODENAME
      • context.build.version.abbreviatedCodename - 对应于预发布代号的首字母(包括发布版本) (Ie5020)
    • 添加了 profilerOutput 列表到 JSON 输出,以便更轻松地对配置文件跟踪(例如 Perfetto、方法跟踪)进行工具化 (I05ddd, b/332604449)
    • 在基准测试模块中使用 Android Test Orchestrator 时添加警告,因为这会导致每个模块的输出 JSON 文件被重复覆盖。(Ia1af6, b/286899049)
    • 当文件名超过 200 个字符时抛出异常,以避免在写入或后处理文件时出现不明确的崩溃。(I4a5ab)

版本 1.3.0-rc01

2024 年 8 月 7 日

androidx.benchmark:benchmark-*:1.3.0-rc01 已发布。版本 1.3.0-rc01 包含 这些提交.

错误修复

  • 修复 androidx.benchmark.cpuEventCounter 对非指令事件产生错误的值(I7386ab/286306579)。
  • 修复 resumeTiming / runWithTimingDisabled 以尊重指标优先级顺序,并显着减少低优先级指标暂停/恢复对高优先级指标结果的影响。例如,如果使用 cpuEventCounter.enable 仪器参数通过 CPU 性能计数器,则当暂停/恢复发生时,timeNs 将不再显着减少。(I39c2eb/286306579b/307445225)。
  • 通过将堆栈采样转换移出主线程,减少堆栈采样导致 measureRepeatedOnMainThread 命中主线程硬超时的时间。(I487a8b/342237318)。
  • 删除了对新平台 API 的手动轮廓,因为当使用 R8 与 AGP 7.3 或更高版本(例如 R8 版本 3.3)时,以及当使用 AGP 8.1 或更高版本(例如 D8 版本 8.1)时,所有构建都会通过 API 建模自动执行此操作。建议没有使用 AGP 的客户端更新到 D8 版本 8.1 或更高版本。有关更多详细信息,请参阅 这篇文章。(I9496cb/345472586)。
  • 添加了 agp 版本检查以发送包名称作为 instr 参数。在 AGP 8.4.0 之前,目标应用程序包名称无法通过仪器参数发送到仪器应用程序。(0c72a3f)。

版本 1.3.0-beta02

2024 年 7 月 10 日

androidx.benchmark:benchmark-*:1.3.0-beta02 已发布。版本 1.3.0-beta02 包含 这些提交

错误修复

  • 在启动 Perfetto 时优雅地处理 EXITCODE 2 以记录警告,但继续执行。

版本 1.3.0-beta01

2024 年 6 月 12 日

androidx.benchmark:benchmark-*:1.3.0-beta01 已发布。版本 1.3.0-beta01 包含 这些提交

API 更改

  • MethodTracing.affectsMeasurementOnThisDevice 重命名为 AFFECTS_MEASUREMENT_ON_THIS_DEVICE 以保持一致性。(I1bdfa)。
  • 添加了实验性的 BlackHole.consume() API 以防止微基准测试中的死代码消除。(If6812b/286091643)。
  • 微基准测试现在将正确抛出异常以防止方法跟踪干扰测量。当方法跟踪被强制开启(通过仪器参数或 MicrobenchmarkConfig)时,并在方法跟踪后尝试测量时,这会在某些设备上发生。受影响的设备运行的是 API 26-30 或受此干扰影响的某些 ART 主线模块版本,并且可以通过 ProfilerConfig.MethodTracing.affectsMeasurementOnThisDevice 在运行时检测到。(Iafb92b/303660864)。

错误修复

  • 将建议的最大 agp 版本提升到 9.0.0-alpha01。(I5bbb0)。
  • 将编译模式添加到基准测试上下文(If5612b/325512900)。
  • 默认情况下启用 AIDL 跟踪(需要 API 28)(Ia0af2b/341852305)。
  • 在 JSON 输出的基准测试上下文中添加了其他信息
    • context.artMainlineVersion - Art 主线模块的整数版本(如果设备上存在,则为 -1,否则为 -1)。
    • context.build.id - 等于 android.os.Build.ID
    • context.build.version.codename - 等于 android.os.Build.VERSION.CODENAME
    • context.build.version.abbreviatedCodename - 对应于预发布代号的首字母(即使在发布版本上)(Ie5020)。
  • 修复 StackSampling 以尊重 androidx.benchmark.profiling.sampleDurationSecondsIb1d53)。
  • 将宏->通用依赖项更改为 api(),以便更容易使用,例如 PerfettoTracePerfettoConfig。(Icdae3b/341851833)。
  • 确保 mergeArtProfilemergeStartupProfile 任务始终等待基线配置文件生成。(I623d6b/343086054)。
  • 在决定是否应启用变体时考虑变体启用状态。(I5d19eb/343249144)。
  • 增加了 Perfetto 跟踪处理器的默认启动超时时间。(I87e8cb/329145808)。

版本 1.3.0-alpha05

2024 年 5 月 14 日

androidx.benchmark:benchmark-*:1.3.0-alpha05 已发布。版本 1.3.0-alpha05 包含 这些提交

错误修复

  • 当宏基准测试指标对所有迭代返回零值时,抛出更清晰的异常(Iab58fb/314931695)。
  • 在微基准测试 Proguard 规则中添加了额外的解决方法规则,包括对监听器规则和其他观察到的警告/错误的支持。(I14d8fb/329126308b/339085669)。
  • 方法跟踪在宏基准测试期间作为单独的阶段运行,不再影响测量。(If9a50b/285912360b/336588271)。
  • 添加了额外的调试建议以删除着色器广播失败消息。(I5efa6b/325502725)。

版本 1.3.0-alpha04

2024 年 5 月 1 日

androidx.benchmark:benchmark-*:1.3.0-alpha04 已发布。版本 1.3.0-alpha04 包含 这些提交

API 更改

  • 添加了实验性的 MacrobenchmarkRule#measureRepeated 变体,它采用自定义的 PerfettoConfig 以进行完全自定义的 Perfetto 跟踪记录。请注意,配置错误的配置可能会导致内置指标类失败。(Idfd3db/309841164b/304038384)。
  • PowerMetric.deviceSupportsPowerEnergy 重命名为 PowerMetric.deviceSupportsHighPrecisionTracking 以提高清晰度(I5b82f)。
  • 添加了 PowerMetric.deviceBatteryHasMinimumCharge()PowerMetric.deviceSupportsPowerEnergy() 以根据设备电源测量功能启用更改或跳过基准测试。(I6a591b/322121218)。

错误修复

  • 添加了与先前基线配置文件的比较(I824c8b/269484510)。
  • 添加了 DSL 以禁用警告(Ic4debb/331237001)。
  • 将禁用基准测试变体时的异常更改为信息日志(I8a517b/332772491)。
  • 简化了为宏基准测试捕获方法跟踪的过程,该过程的范围限于实际 measureBlock() 的持续时间。以前,它从目标进程启动开始,并且只支持冷启动(Iee85ab/300651094)。
  • 避免在 Perfetto 跟踪处理器启动缓慢时崩溃(I98841b/329145808)。

版本 1.3.0-alpha03

2024 年 4 月 17 日

androidx.benchmark:benchmark-*:1.3.0-alpha03 已发布。版本 1.3.0-alpha03 包含 这些提交

新功能

  • 添加了公共 API PerfettoTraceProcessor.Session.queryMetrics API,其中包含 JSON、textproto 和 proto 二进制(未解码)变体。这些允许您查询 TraceProcessor 中内置的指标I54d7fb/304038382)。
  • 在 JSON 输出中添加了 profilerOutput 以简化对分析跟踪的工具使用(例如 Perfetto、方法跟踪)。(I05dddb/332604449)。
  • 在基准测试 Perfetto 配置中添加了电源标签。这将捕获例如唤醒锁跟踪点。(Icfe44b/286551983)。
  • 添加了 inst 参数 androidx.benchmark.profiling.skipWhenDurationRisksAnr,可以将其设置为 false 以避免在预期持续时间可能导致 ANR 时跳过方法跟踪 - 强烈建议在 CI 运行中避免这样做。
  • 添加了实验性的 inst 参数 androidx.benchmark.profiling.perfCompare.enable,将其设置为 true 以在测量阶段和分析阶段之间运行比较计时。在评估方法跟踪的开销时很有用。(I61fb4b/329146942)。

API 更改

  • TraceSectionMetric.Mode 更改为密封类,以便在不破坏详尽的 when 语句的情况下进行未来的扩展(I71f7b)。
  • 添加了 TraceSectionMetric.Mode.Average.Count,并重新排序了参数,以便更常用的参数(模式)在参数列表中更早,减少了指定参数名称的需要。(Ibf0b0b/315830077b/322167531)。
  • Metric.getResult 重命名为 getMeasurements 以匹配返回类型(I42595)。

错误修复

  • 修复以确保基准测试在 automaticGenerationDuringBuild 关闭时使用生成的基线配置文件(Ic144fb/333024280)。
  • 修复 BaselineProfile gradle 插件属性覆盖,以在自定义 nonMinified 或基准构建类型时启用基准配置文件生成和基准测试。 (Ib8f05, b/324837887)
  • 修复了宏基准测试中的方法跟踪刷新,因此即使在速度较慢的设备上,方法跟踪也应该被完全捕获并有效。 (I6349a, b/329904950)
  • 在 Perfetto 跟踪记录中启用阻塞启动,以降低跟踪开始时丢失数据的风险。 仅在 API 33+ 上支持。 (Ie6e41, b/310760059)
  • 当在基准模块中使用 Android 测试编排器时添加警告,因为这将导致每个模块的输出 JSON 文件被重复覆盖。 (Ia1af6, b/286899049)
  • 为 Studio 输出中的一致性强制使用 ','(逗号)千位分隔符,忽略设备区域设置 (I3e921, b/313496656)
  • TraceSectionMetric 现在支持使用 Trace.{begin|end}AsyncSection 创建的切片。 (I91b32, b/300434906)
  • 将 log.w / 异常标签添加到所有启动检测失败中。 这不会改变当前的行为(因此某些错误会抛出,而其他错误会静默地无法检测到启动),只是让它更容易理解。 通常那些 Log.w() 并无法报告启动指标的是那些缺少非帧事件、启动检测时抛出异常但缺少帧计时信息(来自 UI/RT 切片)的事件。 (Id240f, b/329145809)
  • 在运行宏基准测试之前取消后台 dexopt 作业,以减少干扰。(I989ed)
  • 添加了 frameCount 测量值到 FrameTimingMetric 中,以帮助发现测量值发生变化的原因是产生的帧数发生了变化(添加了新的动画,修复了失效问题)。(I1e5aa)
  • 澄清了 frameOverrunMs 是跟踪何时在文档中可用的首选指标,以及原因。 (I18749, b/329478323)

版本 1.3.0-alpha02

2024 年 3 月 20 日

androidx.benchmark:benchmark-*:1.3.0-alpha02 已发布。 版本 1.3.0-alpha02 包含 这些提交

新功能

  • 微基准测试中实验性的 R8 支持,通过嵌入式 proguard 规则实现。 请注意,此支持是实验性的,并且需要 AGP 8.3 才能缩小库模块测试的规模。 使用以下命令在你的基准模块的 build.gradle 中启用 R8 缩小/优化,这将导致性能显著提高,具体取决于工作负载。 (I738a3, b/184378053)

    android {
        buildTypes.release.androidTest.enableMinification = true
    }
    

错误修复

  • 修复了方法跟踪警告,使其与微基准测试输出位于不同的行上。 (I0455c, b/328308833)

版本 1.3.0-alpha01

2024 年 2 月 21 日

androidx.benchmark:benchmark-*:1.3.0-alpha01 已发布。 版本 1.3.0-alpha01 包含这些提交。

API 更改

  • MicrobenchmarkConfig 布尔参数重命名为避免不必要的“should”一词 (Ia8f00, b/303387299)
  • 添加了 BenchmarkRule.measureRepeatedOnMainThread,以便主线程基准测试(例如,触摸 View 或 Compose UI 的基准测试)可以避免触发 ANR,尤其是在 CI 中的大型套件期间。 (I5c86d)
  • 添加了 FrameTimingGfxInfoMetric,这是 FrameTimingMetric 的实验性替代实现,其测量值直接来自平台,而不是从 Perfetto 跟踪中提取。 (I457cb, b/322232828)
  • 添加了在单个 warmUp 迭代期间转储 ART 配置文件的能力。 (I17923)
  • TraceSectionMetric API 进行了多项更改
    • 添加了 Mode.MinMode.Max
    • 添加了 label 参数以覆盖部分名称作为指标标签
    • 将模式名称添加到输出以阐明指标含义
    • 将默认值更改为求和,因为此指标的大多数用法都是针对重复事件。 请注意 CI 用法中的这些更改,因为它可能会创建不连续性或破坏解析。 (Ic1e82, b/301892382, b/301955938)

错误修复

  • 改进了基准配置文件 gradle 插件中指定的托管设备不存在时的错误消息 (Idea2b, b/313803289)
  • 在 AGP 8.3.0-alpha15 之前将库基准配置文件包含在 AAR 中的修复 (I1d2af, b/313992099)
  • 修复了生成任务结束时基准和启动配置文件输出 URL (I802e5, b/313976958)
  • 调整了数据源超时,以尝试修复 java.lang.IllegalStateException: Failed to stop [ProcessPid(processName=perfetto, pid=...)] (I8dc7d, b/323601788)
  • 添加两个 instrumentation 参数用于覆盖着色器丢弃行为,以解决在没有 ProfileInstaller 1.3 的情况下基准测试应用时的崩溃问题
    • androidx.benchmark.dropShaders.enable=true/false : 可以用来跳过所有着色器丢弃(包括在 StartupMode.Cold 启动中完成的丢弃),尤其是在基准测试尚未使用 profileinstaller 1.3 的应用时
    • androidx.benchmark.dropShaders.throwOnFailure=true/false : 可以用来容忍尝试丢弃着色器时发生的错误,例如在基准测试没有 profileinstaller 1.3 的应用时 (I4f573)
  • 当预计 UI 线程需要超过几秒钟的时间时,跳过 UI 线程上的方法跟踪,并在抛出异常时清理方法跟踪。 (I6e768)
  • 当文件名超过 200 个字符时抛出异常,以避免在写入或后处理文件时出现不明确的崩溃。(I4a5ab)
  • 修复了跟踪开始和结束时未终止的帧可能被配对在一起的问题,这将错误地报告为单个极长的帧。 (I39353, b/322232828)
  • 在 API 30+ 上使用 --skip verification,在 API 30-33 上重新安装包时,以清除用户构建的 ART 配置文件。 这有助于绕过 Play Protect 警告,这些警告会导致某些类别的设备出现故障。 (Ic9e36)
  • 使用 am force-stop 来杀死应用程序,当应用程序不是系统应用程序(如系统 UI 或启动器)时。 (I5e028)
  • 宏基准测试现在等待 1 秒 以便目标应用程序刷新 ART 配置文件(以前它等待 500 毫秒)。 (I85a50, b/316082056)
  • 当没有产生帧时,改进 FrameTimingMetric 错误,并且在指标解析失败时始终输出到跟踪的链接,以帮助诊断问题。(I956b9)
  • 修复了 FrameTimingMetric 中的崩溃,导致无法解析帧 ID,尤其是在某些 OEM 设备上。 (Ia24bc, b/303823815, b/306235276)
  • 放宽了 FrameMetrics 中检查的严格性,并添加了更多错误消息的详细信息。(Iadede)

版本 1.2

版本 1.2.4

2024 年 4 月 17 日

androidx.benchmark:benchmark-*:1.2.4 已发布。 版本 1.2.4 包含 这些提交

错误修复

  • 修复了基准配置文件 srcset 未在基准变体中设置的问题。 还修复了库中 automaticGenerationDuringBuild 导致循环依赖关系的问题。 (I28ab7, b/333024280)
  • 使用 am force-stop 来杀死应用程序,当应用程序不是系统应用程序(如系统 UI 或启动器)时。 这修复了由于进程杀死未完全成功,导致 StartupMode.COLD 基准测试因“Package $package must not be running prior to cold start!”而崩溃的问题。 (I5e028)

版本 1.2.3

2024 年 1 月 24 日

androidx.benchmark:benchmark-*:1.2.3 已发布。 版本 1.2.3 包含这些提交。

错误修复

  • 从 AGP 版本为 8.3.0 或更高版本的基准配置文件 Gradle 插件中删除了异常。
  • 在 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 以来发生的重要更改

基准配置文件

  • 新的 基准配置文件 Gradle 插件 自动执行捕获和包含基准配置文件的过程,并将其纳入您的测试和构建工作流程。
  • BaselineProfileRule.collect 现在已稳定,这是以前实验性 BaselineProfileRule.collectBaselineProfile API 的简化版本
    • 只需指定 packageName,并驱动您的应用程序
  • 对于生成基准配置文件的库,您现在可以过滤生成的规则,这些规则可以在代码中 (BaselineProfileRule.collect 参数) 或更简单的 gradle 插件中过滤
  • 修复

宏基准测试

  • 编译
    • 宏基准测试现在可以正确地完全重置每个编译的编译状态 - 这需要在 Android 14 之前重新安装 APK,因此如果您想在要测量的内容中保留状态(如用户登录),建议强烈建议在 Android 14+ 上进行基准测试。
    • 您还可以通过单独控制应用程序编译并使用 CompilationMode.Ignore()工具参数 跳过编译来解决此问题
  • 工具参数

    • 支持 androidx.benchmark.dryRunMode.enable 工具参数(已经在微基准测试中提供),用于更快的验证运行(例如,在创建基准测试时或在预提交时)
    • 支持 androidx.benchmark.profiling.mode=StackSamplingMethodTracing
    • 添加了 androidx.benchmark.enabledRules 以允许运行时过滤基准配置文件与宏基准测试规则测试
    • 添加了 androidx.benchmark.perfettoSdkTracing.enable 参数以启用使用 tracing-perfetto 进行跟踪,例如 Compose 重新组合跟踪。 请注意,当与 StartupMode.COLD 一起使用时,计时将受到显著影响,因为跟踪库在应用程序启动期间被加载和启用。
  • 要求

    • 宏基准测试现在要求目标应用程序中的 ProfileInstaller 1.3.0 或更高版本,以启用配置文件捕获/重置和着色器缓存清除。
  • 新的实验性 指标 API

  • 修复

    • 修复了从多个 APK 安装(例如,从应用程序包安装)的应用程序中安装或提取配置文件时的崩溃问题。
    • 修复了 FrameTimingMetric 忽略具有不一致帧 ID 的帧(通常,API 31+ 上的波动期间的帧)的问题(I747d2b/279088460)。
    • 修复了对大于 64MB 的跟踪的解析错误(Ief831b/269949822)。
    • 澄清了设备(尤其是模拟器)操作系统映像未正确配置用于跟踪或编译时的错误。
    • 跳过没有电池的设备的电池电量检查(微观和宏观)。
    • 改进了文件输出,为无效的输出目录提供了更清晰的错误,并提供了更安全的默认值。
    • 提高了 StartupMode.COLD 的稳定性,通过始终删除着色器缓存来实现(也可通过 MacrobenchmarkScope.dropShaderCache 访问)。
    • 修复了 startActivityAndWait 的 Leanback 回退。

微基准测试

  • 特性
    • 分析已移至单独的阶段,在其他指标之后,因此一次测试运行可以显示准确的计时和分析结果。
  • 实验性 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 包含这些提交。

错误修复

  • 修复基准文件输出,使其不再破坏 BaselineProfile 插件文件复制。 文件已生成并从设备上复制,但已重命名,因此 Gradle 插件无法识别它们。(I8dbccb/303034735b/296453339)。
  • 澄清了将 tracing-perfetto 从宏基准模块注入目标应用程序时遇到的加载错误消息。

版本 1.2.0-rc01

2023 年 9 月 20 日

androidx.benchmark:benchmark-*:1.2.0-rc01 已发布。 版本 1.2.0-rc01 包含这些提交。

错误修复

  • 当 Perfetto SDK 跟踪无法在基准测试中初始化时,现在会抛出一个异常(并提供解决方法说明)。(I6c878b/286228781)。
  • 修复将 ART 方法跟踪转换为 Perfetto 格式时的 OOM 崩溃问题。(I106bdb/296905344)。
  • (宏基准)澄清了在 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)。

错误修复

  • 修复了写入/移动和拉取文件(尤其是来自参数化测试的文件)的失败问题,方法是进一步清理输出文件名,避免输出文件名中出现 '=' 和 ':'。(I759d8)。

版本 1.2.0-beta03

2023 年 8 月 9 日

androidx.benchmark:benchmark-*:1.2.0-beta03 已发布。 版本 1.2.0-beta03 包含这些提交。

API 更改

  • 添加了参数以过滤 TraceSectionMetric,仅限于目标包,默认情况下启用(Ia219bb/292208786)。

错误修复

  • fullTracing.enable 工具参数重命名为 perfettoSdkTracing.enable,以与工件名称和其他引用保持一致。 fullTracing.enable 将继续作为备用方法工作。(I7cc00)。
  • 基准库内部跟踪点(包括微基准循环/阶段跟踪)现在将在 Studio 系统跟踪查看器中显示,并在 Perfetto 中嵌套在正确的进程下。(I6b2e7b/293510459)。
  • 在 API 31+ 上删除了宏基准测试 NOT-PROFILEABLE 错误,并在 eng/userdebug 根设备上跳过了可分析性检查。(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)。

错误修复

  • 当操作系统配置不正确以进行跟踪时,在宏基准测试中报告错误,因为最近在 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 包含这些提交。

错误修复

  • 修复了基准输出中警告有时会被抑制的问题,并解决了基准输出中缺少前导空格的问题,这些空格无法显示在 Studio 中(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)。

错误修复

  • 宏基准测试支持 androidx.benchmark.profiling.mode = MethodTracing。(I7ad37b/285912360)。
  • 微基准分析已移至单独的阶段,因此它在测量之后按顺序执行,而不是替换测量。 如果存在,MethodTracing 跟踪部分也将包含在捕获的 Perfetto 跟踪中。(I9f657b/285014599)。
  • 将计数测量添加到 TraceSectionMetric,使用 Mode.Sum。(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 参数更改为非空,并具有等效的默认值,以便在文档中更清楚地显示默认过滤行为。(I3816e)。

错误修复

  • dryRunMode 中禁用 IsolationActivity 和 Perfetto 跟踪,可以显著提高性能,因为它们占用了大部分运行时间。(Ie4f7d)
  • 支持使用仪器测试参数 androidx.benchmark.profiling.mode=StackSamplingandroidx.benchmark.profiling.sampleFrequency 在 Macrobenchmarks 中进行调用栈采样。(I1d13b, b/282188489)
  • 修复了在 Android U(API 34)以及模拟器上丢弃着色器时发生的崩溃。(I031ca, b/274314544)

版本 1.2.0-alpha14

2023 年 5 月 3 日

androidx.benchmark:benchmark-*:1.2.0-alpha14 已发布。 版本 1.2.0-alpha14 包含以下提交。

错误修复

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

版本 1.2.0-alpha13

2023 年 4 月 5 日

androidx.benchmark:benchmark-*:1.2.0-alpha13 已发布。 版本 1.2.0-alpha13 包含以下提交。

API 更改

  • 在生成基线配置文件时添加了配置文件类型参数,以支持即将推出的启动配置文件功能 (Ie20d7, b/275093123)
  • 添加了新的实验性 TraceMetric API,用于基于 Perfetto 跟踪的内容定义完全自定义的指标。(I4ce31, b/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 跟踪支持,包括 Microbenchmarks 和实验性的 PerfettoTrace API。在此版本之前, UiAutomation 连接在某些设备上不可靠。(I78e8c)
  • 添加了 PerfettoTraceProcessor 的公共实验性 API,以启用解析跟踪内容。这是朝着基于 Perfetto 跟踪数据的完全自定义指标迈出的一步。(I2659e, b/219851406)

版本 1.2.0-alpha11

2023 年 3 月 8 日

androidx.benchmark:benchmark-*:1.2.0-alpha11 已发布。 版本 1.2.0-alpha11 包含以下提交。

错误修复

  • 修复了 MacrobenchmarkRuleBaselineProfileRule 在重新安装或从包含多个 APK 的应用程序包中提取配置文件时发生的崩溃。(I0d8c8, b/270587281)

版本 1.2.0-alpha10

2023 年 2 月 22 日

androidx.benchmark:benchmark-*:1.2.0-alpha10 已发布。 版本 1.2.0-alpha10 包含以下提交。

新功能

  • 在 Android 14+ 上,Macrobenchmark 不再重新安装目标应用程序以重置编译状态,这得益于一项新的平台功能。以前,有必要使用已获得 root 权限的设备,或者在每次基准测试运行之前清除所有应用程序状态(例如用户登录)。(I9b08c, b/249143766)

错误修复

  • 修复了 DryRunMode 在配置文件为空时不再崩溃的问题,这是由于跳过了编译。相反,它运行一次迭代并提取配置文件,以确保捕获到一些内容。(I2f05d, b/266403227)
  • 修复了在旧的 API 级别上检查 powerstats 存在时发生的 PowerMetric 崩溃。(5faaf9, b/268253898)

版本 1.2.0-alpha09

2023 年 1 月 11 日

androidx.benchmark:benchmark-*:1.2.0-alpha09 已发布。 版本 1.2.0-alpha09 包含以下提交。

错误修复

  • 允许将 None 传递给 androidx.benchmark.enabledRules 仪器参数,以禁用所有基准测试/基线配置文件生成。(I3d7fd, b/258671856)
  • 修复了在应用程序模块(即非自仪器测试 APK)中 PerfettoTrace 捕获的问题 (I12cfc)
  • 修复了 Studio 输出中的基线配置文件 adb 拉取参数顺序 (I958d1, b/261781624)
  • 现在,Arm 模拟器 API 33 在尝试运行宏基准测试时被正确识别为 API 33,并将正确打印警告。(69133b,b/262209591)
  • 在没有电池的设备上跳过电池电量检查 (fe4114, b/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,它会等到基线配置文件在 N 次迭代后稳定。(I923f3)
  • 添加了在使用 BaselineProfileRule 生成基线配置文件时指定输出文件名前缀的功能。(I7b59f, b/260318655)

错误修复

  • 提高了文件输出写入的安全性,这应该可以防止输出文件在没有写入/追加的情况下静默,特别是在 API 21/22 上。(If8c44, b/227510293)
  • 修复了 simpleperf 跟踪输出以创建和放置文件的问题。这还应该更普遍地修复文件未被 Gradle 成功拉取的问题。(I12a1c, b/259424099)
  • 改进了在 profileinstaller 太旧时打印的错误消息。现在它会提示你更新 profileinstaller 版本(1.2.1),以便在 API 31 到 33 上测量基线配置文件,而不是说它不受支持。(Ia517f, b/253519888)
  • 修复了在 Android 13(API 33)以下的未获得 root 权限的版本上发生的多个 shell 命令失败的错误消息打印,包括失败的 perfetto 捕获二进制文件设置和跟踪捕获失败 (Ib6b87, b/258863685)
  • 自动对生成的配置文件规则进行排序,以最大程度地减少随着时间的推移而发生的更改次数(在将配置文件规则检入源代码控制时)。(Ie2509)
  • 修复了在 Android 13(API 33)以下的未获得 root 权限的版本上发生的崩溃,并显示消息 Expected no stderr from echo 3 > /proc/sys/vm/drop_caches (I6c245, b/259508183)

已知问题 - MacrobenchmarkScope.dropShaderCache() 可能会崩溃,因为 profileinstaller 清单中缺少广播注册表,该注册表尚未发布。(I5c728, b/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,用于在 Macrobenchmarks 中测量能量和功率。(Ife601, b/220183779)
  • 修复了 MacrobenchmarkScope.dropShaderCache() 实际上删除了着色器缓存的问题。这会从 StartupMode.COLD 基准测试中删除大约 20 毫秒的噪声,因为着色器现在在每次迭代中都始终清除。以前,使用预热迭代的 Partial 编译会报告不正确快速的数字,因为着色器缓存更有可能在预热期间发生。此修复需要已获得 root 权限的设备,或者在目标应用程序中使用 profileinstaller:1.3.0-alpha02。有关 ProfileInstaller 库的 API 更改,请参阅 ProfileInstaller 1.30-alpha02 页面。(Ia5171, b/231455742)
  • 添加了 TraceSectionMode("label", Mode.Sum),允许测量具有相同标签的多个跟踪部分上花费的总时间。例如, TraceSectionMetric("inflate", Mode.Sum) 将为宏基准测试中花费在膨胀上的总时间报告一个指标 inflateMs。还删除了 API 29 要求,因为 TraceSectionMetricandroidx.tracing.Trace 一同工作,直到较低的 API 级别,并使用目标应用程序中的 forceEnableAppTracing。(Id7b68, b/231455742)

错误修复

  • 改进了所有内部 shell 命令的安全性,方法是验证所有输出/错误。(I5984d, b/255402908, b/253094958)
  • 在基线配置文件 adb pull 命令中指定设备,这样如果连接了多个设备(最多一个模拟器),就可以简单地复制拉取命令 (I6ac6c, b/223359380)
  • 如果宏基准测试 apk 未设置为自测,则添加错误。此错误阻止在目标应用程序的进程中进行宏基准测试。在进程中,宏基准测试将无法编译/杀死/冷启动应用程序或控制其自身的权限 (I4279b)
  • 修复了 measureRepeated() 中的一个问题,其中 StartupMode.COLDsetupBlock 后不会杀死目标进程。现在,setupBlock 与应用程序交互将不会让应用程序进程继续运行,并且会导致无效的冷启动测量。(I8ebb7)

版本 1.2.0-alpha06

2022 年 10 月 24 日

androidx.benchmark:benchmark-*:1.2.0-alpha06 已发布。 版本 1.2.0-alpha06 包含以下提交内容。

API 更改

  • BaselineProfileRule 不再需要 Android 13(API 33)上的 root 权限,也不再是实验性的。(Ie0a7d, b/250083467, b/253094958)
    • 此更改还修复了在非 root 设备上如何将应用程序的配置文件刷新到磁盘,但需要更新目标应用程序的 profileinstaller 依赖项。
    • 要在非 root 设备上使用 BaselineProfileRuleCompilationMode.Partial(warmupIterations),还必须更新目标应用程序以使用 androidx.profileinstaller.profileinstaller:1.3.0-alpha01。这将正确地启用将配置文件刷新到磁盘,以便可以编译/提取它。

错误修复

版本 1.2.0-alpha05

2022 年 10 月 5 日

androidx.benchmark:benchmark-*:1.2.0-alpha05 已发布。 版本 1.2.0-alpha05 包含以下提交内容。

错误修复

  • 修复了 Studio 系统跟踪查看器中基准捕获跟踪的帧分解问题 (I3f3ae, b/239677443)
  • FrameTimingMetric 纠正为将 FrameOverrun 列为需要 API 31 而不是 29 (I716dd, b/220702554)
  • BaselineProfileRule 中设置迭代次数,如果目标包未安装,则抛出明确的错误(对于 MacrobenchmarkRule 已经完成)。(Ic09a3, b/227991471)

版本 1.2.0-alpha04

2022 年 9 月 21 日

androidx.benchmark:benchmark-*:1.2.0-alpha04 已发布。 版本 1.2.0-alpha04 包含以下提交内容。

新功能

  • 为宏基准测试添加对 dryRunMode.enable 检测参数的支持(微基准测试中已经可用),以便更快速地进行本地开发,并验证应用程序自动化(例如,在预提交中)。这会将迭代次数覆盖为 1,跳过编译,抑制所有 配置错误,并禁用测量 .json 文件输出。(Ib51b4, b/175149857)

    在 Gradle 命令行上

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

    在 build.gradle 中

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

错误修复

  • 修复了 StartupTimingMetric,使其不再需要通过 MacrobenchmarkScope.startActivityAndWait() 启动测量的活动。这意味着该指标可以从例如通知、Context.startActivity()、应用程序内基于活动的导航或 shell 命令中获取启动。(Ia2de6, b/245414235)
  • 修复了一个错误,该错误会导致 startActivityAndWait 在尝试等待模拟器上的启动完成时超时,方法是降低帧检测的严格性。(Ibe2c6, b/244594339, b/228946895)

版本 1.2.0-alpha03

2022 年 9 月 7 日

androidx.benchmark:benchmark-*:1.2.0-alpha03 已发布。 版本 1.2.0-alpha03 包含以下提交内容。

新功能

  • 添加了独立使用 BenchmarkState 的实验性 API,与 BenchmarkRule / JUnit4 分开。(Id478f, b/228489614)

错误修复

版本 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 权限下也是如此,除了在生成基线配置文件期间。这可以通过一个可选的布尔值参数来覆盖。(02cce9, b/241214097)

错误修复

版本 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' 或 'BaselineProfile' 以仅运行一种类型的测试,例如,仅在模拟器上生成 BaselineProfiles 时。逗号分隔列表也受支持。(I756b7, b/230371561)

    例如,在您的宏基准测试的 build.gradle 中

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

    或从 Gradle 命令行

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

API 更改

  • 添加了新的 PowerMetric,用于测量基准测试中的能量和功率任务。(I9f39b, b/220183779)
  • 添加了一种新的编译模式 CompilationMode.Ignore,用于跳过配置文件重置和编译。(Ibbcf8, b/230453509)
  • BaselineProfileRule#collectBaselineProfile 中添加了一个新参数,用于通过包名称过滤输出文件 (If7338, b/220146561)
  • 使开发人员能够放电设备以测量功耗。(I6a6cb)
  • 添加了在 MacrobenchmarkScope 中清除着色器缓存的功能。(I32122)
  • 使开发人员能够配置指标类型和所需子系统类别的详细信息的显示。(I810c9)
  • 以前,如果在不受支持的设备上运行基准测试,则会抛出 UnsupportedOperationException。现在,仅当在不受支持的设备上使用指标时(即:PowerMetric.configure)才会发生 UOE。(I5cf20, b/227229375)
  • 添加了 TotalPowerMetricTotalEnergyMetric,用于测量宏基准测试中每个系统类别中的总功率和总能量。(I3b26b, b/224557371)

错误修复

  • 修复了一个问题,该问题会导致在非 root 构建中,编译后的方法在每个宏基准测试之间未正确重置。不幸的是,这需要在每次迭代时重新安装 apk,这将清除每个宏基准测试的应用程序数据。(I31c74, b/230665435)
  • 修复了 API 21/22 上的跟踪记录崩溃 (If7fd6, b/227509388, b/227510293, b/227512788)
  • 彻底改造活动启动完成检测,以修复启动宏基准测试中的“无法读取任何指标”异常。(Ia517c)

版本 1.1.1

版本 1.1.1

2022 年 11 月 9 日

androidx.benchmark:benchmark-*:1.1.1 已发布。 版本 1.1.1 包含以下提交内容。

错误修复

  • 修复了 android.system.ErrnoException: open failed: EACCES,它会在某些 Android 11(API 30)+ 设备上出现。这是从 1.2.0-alpha01 中 cherry-pick 的一个修复程序。(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 包含以下提交内容。

错误修复

版本 1.1.0-rc02

2022 年 5 月 11 日

androidx.benchmark:benchmark-*:1.1.0-rc02 已发布。 版本 1.1.0-rc02 包含这些提交。

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

错误修复/行为变更

  • 修复了应用编译在多个宏基准测试之间未正确重置,并且在非 root 构建中根本未重置的问题。这修复了许多在运行多个测试时会导致 CompilationMode 对测量结果几乎没有影响的案例。为了解决此问题,目标应用现在将在每个测试方法之间完全重新安装,这将在每个宏基准测试之间清除应用程序数据。 (I31c74, b/230665435)

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

    例如,在您的宏基准测试的 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”或“BaselineProfile”仅运行一种类型的测试,例如,在模拟器上生成 BaselineProfiles 时。 (I756b7, b/230371561)

    例如,在您的宏基准测试的 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 包含这些提交。

错误修复

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

版本 1.1.0-beta06

2022 年 4 月 6 日

androidx.benchmark:benchmark-*:1.1.0-beta06 已发布。 版本 1.1.0-beta06 包含这些提交。

错误修复

  • 修复了 API 21/22 上的跟踪记录崩溃 (If7fd6, b/227509388)
  • 彻底改造活动启动完成检测,以修复启动宏基准测试中的“无法读取任何指标”异常。(Ia517c)
  • 修复了在使用 CompilationMode.None() 时宏基准测试的启动指标。在此更改之前,CompilationMode.Partial() 似乎比 Compilation.None() 慢。 (611ac9).

版本 1.1.0-beta05

2022 年 3 月 23 日

androidx.benchmark:benchmark-*:1.1.0-beta05 已发布。 版本 1.1.0-beta05 包含这些提交。

错误修复

版本 1.1.0-beta04

2022 年 2 月 23 日

androidx.benchmark:benchmark-*:1.1.0-beta04 已发布。 版本 1.1.0-beta04 包含这些提交。

错误修复

  • 修复 Android 10 上的缺失指标,以及 NoSuchElementException,该错误是由跟踪中未正确捕获的进程名称引起的。 (Ib4c17, b/218668335)

  • 在 Q(API 29)及更高版本上使用 PowerManager 进行热量节流检测。这显着降低了热量节流检测(基准测试在 90 秒冷却后重试)的误报频率,并在用户构建中显着加快了基准测试速度。它还提供了热量节流检测,即使时钟被锁定(如果它们被锁定得太高,超出了设备的物理环境)。 (I9c027, b/217497678, b/131755853)

  • 将 simpleperf 采样分析过滤到 measureRepeated 线程,以简化检查 (Ic3e12, b/217501939)

  • 支持来自多进程应用中命名 UI 子进程的指标 (Ice6c0, b/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 更改

  • 在宏基准测试库中添加了 AudioUnderrunMetric,用于实验性标志,以允许检测音频欠载 (Ib5972)
  • BaselineProfileRule 不再接受 setup 块,因为它的功能与 profileBlock 相同。 (Ic7dfe, b/215536447)

    例如

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

错误修复

  • 修复了在后续运行中,当在 Studio 输出中链接时,微基准分析器跟踪将无法更新的问题 (I5ae4d, b/214917025)
  • 防止在 API 23 上执行编译 Shell 命令 (Ice380)
  • FrameCpuTime 重命名为 FrameDurationCpu,将 FrameUiTime 重命名为 FrameDurationUi,以明确这些是持续时间,而不是时间戳,并与前缀匹配。 (I0eba3, b/216337830)

版本 1.1.0-beta02

2022 年 1 月 26 日

androidx.benchmark:benchmark-*:1.1.0-beta02 已发布。 版本 1.1.0-beta02 包含这些提交。

错误修复

  • 微基准堆栈采样/方法跟踪配置文件结果现在已链接到 Studio 输出中,类似于其他配置文件输出,并且不会抑制分配指标。 (Idcb65, b/214440748, b/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 包含这些提交。

错误修复

  • 修复了分析器参数启用被忽略的问题。 (I37373, b/210619998)
  • 已移除不推荐使用的 CompliationModes (I98186, b/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),以避免影响结果。此跟踪应有助于诊断不稳定性,尤其是来自基准测试之外的来源的不稳定性。 (I298be, b/205636583, b/145598917)
  • CompilationModes 分为三类 - Full、None、Partial。以前,它们是根据编译参数(我们现在将其视为实现细节)和功能不一致命名的。这使得跨平台版本的权衡、潜在组合和行为更加清晰。 (I3d7bf, b/207132597)
  • 设置和测量现在始终成对出现,并且按顺序进行。您现在可以查询包名称和迭代(尽管迭代在某些预热情况下可能为 null)。 (Id3b68, b/208357448, b/208369635)

错误修复

  • 修复了 CompilationMode.Speed 被错误地视为 None (I01137)

版本 1.1.0-alpha12

2021 年 11 月 17 日

androidx.benchmark:benchmark-*:1.1.0-alpha12 已发布。 版本 1.1.0-alpha12 包含这些提交。

新功能

  • 添加了用于自定义基于跟踪的计时测量的实验性 TraceSectionMetric。 (I99db1, b/204572664)

错误修复

  • 每次迭代唤醒设备,以确保 UI 可以被测试 - 需要禁用锁屏。 (Ibfa28, b/180963442)
  • 修复了模拟器和非 root 设备上堆栈采样配置文件模式中的多个崩溃 (Icdbda, b/202719335)
  • 已移除每次迭代结束处的 0.5 秒休眠 - 如果您在此更改后看到缺失指标,请提交错误。 (Iff6aa)
  • 减少数据丢失的机会,并降低跟踪的内存开销 (Id2544, b/199324831, b/204448861)
  • 通过切换到紧凑的 sched 存储格式,将跟踪大小减少约 40%。 (Id5fb6, b/199324831)
  • 更新了启动指标的实现,使其始终在渲染线程结束时结束。这将使不同平台版本之间更加一致,并且更 closely 映射到应用内测量。(Ic6b55)

版本 1.1.0-alpha11

2021 年 11 月 3 日

androidx.benchmark:benchmark-*:1.1.0-alpha11 已发布。 版本 1.1.0-alpha11 包含以下提交。

API 更改

  • Macrobenchmark 现在具有 minSdkVersion23。 (If2655)
  • 添加了一个新的实验性 BaselineProfileRule,它能够为应用的 关键用户旅程生成基线配置文件。详细文档将随后提供。 (Ibbefa, b/203692160)
  • 删除了 measureRepeated 接口变体,该变体是为 Java 调用者添加的,因为它会导致方法完成/解析时的歧义。Java 调用者将再次需要从 measureRepeated 返回 Unit.Instance。如果这造成不便,请提交错误报告,我们可以在将来的版本中重新审视这个问题。 (Ifb23e, b/204331495)

版本 1.1.0-alpha10

2021 年 10 月 27 日

androidx.benchmark:benchmark-*:1.1.0-alpha10 已发布。 版本 1.1.0-alpha10 包含以下提交。

API 更改

  • 将 StartupTimingMetric 回溯到 API 23。此新实现还更好地处理 reportFullyDrawn(),以等待相应内容呈现。 (If3ac9, b/183129298)
  • 为多个 MacrobenchmarkScope 方法添加了 JvmOverloads,用于 Java 调用者。 (I644fe, b/184546459)
  • 提供替代的 MacrobenchmarkRule.measureRepeated 函数,该函数使用 Consumer<MacrobenchmarkScope>,以便在 Java 语言中使用惯用方式。 (If74ab, b/184546459)

错误修复

  • 修复了跟踪启动过晚以及缺少指标数据的错误。预计这将修复由库本身引起的“在基准测试期间无法读取任何指标”异常。 (I6dfcb, b/193827052, b/200302931)
  • FrameNegativeSlack 已重命名为 FrameOverrun,以澄清其含义——帧超出其时间预算的程度。 (I6c2aa, b/203008701)

版本 1.1.0-alpha09

2021 年 10 月 13 日

androidx.benchmark:benchmark-*:1.1.0-alpha09 已发布。 版本 1.1.0-alpha09 包含以下提交。

错误修复

版本 1.1.0-alpha08

2021 年 9 月 29 日

androidx.benchmark:benchmark-*:1.1.0-alpha08 已发布。 版本 1.1.0-alpha08 包含以下提交。

API 更改

  • 使滚动宏基准测试能够回溯到 API 23 (If39c2, b/183129298)
  • 向 UI 和 JSON 输出添加了新的采样指标类型,重点关注每次迭代中多个样本的百分位数。 (I56247, b/199940612)
  • 切换到整个基准测试库中的浮点指标(在 Studio UI 中截断)。 (I69249, b/197008210)

版本 1.1.0-alpha07

2021 年 9 月 1 日

androidx.benchmark:benchmark-*:1.1.0-alpha07 已发布。 版本 1.1.0-alpha07 包含以下提交。

API 更改

  • 将最低 API 提高到 21,以反映将来打算支持的最低 API 级别。通过 RequiredApi() 继续传达当前支持的最低 API,目前为 29 (I440d6, b/183129298)

错误修复

  • 修复了 ProfileInstaller,使其更容易使用基线配置文件的应用通过 CompilationMode.BaselineProfile 运行 MacroBenchmarks。 (I42657, b/196074999) 注意:还需要更新到 androidx.profileinstaller:profileinstaller:1.1.0-alpha04 或更高版本。
  • StartupMode.COLD + CompilationMode.None 基准测试现在更加稳定。 (I770cd, b/196074999)

版本 1.1.0-alpha06

2021 年 8 月 18 日

androidx.benchmark:benchmark-*:1.1.0-alpha06 已发布。 版本 1.1.0-alpha06 包含以下提交。

API 更改

  • 添加了 androidx.benchmark.iterations 工具参数,允许在本地测试/分析时手动覆盖迭代次数。 (6188be, b/194137879)

错误修复

  • 切换到 API 29+ 上的 Simpleperf 作为默认采样分析器。 (Ic4b34, b/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 秒,但代价是不再支持意图可序列化对象。 (I5a6f5, b/192009149

错误修复

  • 降低了热量节流检测的激进程度,如果经常检测到节流,则重新计算基线。 (I7327b)
  • 修复了 FrameTimingMetric,使其可在 Android S 测试版上运行 (Ib60cc, b/193260119)
  • 使用 EmptyActivity 使目标应用退出强制停止状态,以更好地支持 CompilationMode.BaselineProfile。 (Id7cac, b/192084204)
  • 将跟踪文件扩展名更改为 .perfetto-trace,以匹配平台标准。 (I4c236, b/174663039)
  • StartupTimingMetric 现在输出 "fullyDrawnMs" 指标,以测量应用程序完成渲染所需的时间。要为您的应用定义此指标,请在初始内容准备好时(例如,当初始列表项从数据库或网络加载时)调用 Activity.reportFullyDrawn。(reportFullyDrawn 方法无需在 ComponentActivity 上进行构建版本检查)。请注意,您的测试必须运行足够长的时间才能捕获该指标(startActivityAndWait 不会等待 reportFullyDrawn)。 (If1141, b/179176560)
  • 将向跟踪附加 UI 元数据的工作量减少了 50 多毫秒 (Ic8390, b/193923003)
  • 大幅提高了停止跟踪时的轮询频率,这可以将例如启动基准测试运行时间缩短 30% 以上 (Idfbc1, b/193723768)

版本 1.1.0-alpha03

2021 年 6 月 16 日

androidx.benchmark:benchmark-*:1.1.0-alpha03 已发布。 版本 1.1.0-alpha03 包含以下提交。

新功能

错误修复

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

    例如,

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

版本 1.1.0-alpha02

2021 年 5 月 18 日

基准测试版本 1.1.0-alpha02 带来了基准测试的一个重要组件——Macrobenchmark。除了 benchmark 允许您测量 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 中捕获和检查跟踪

错误修复

  • 解决 Android 12 上的输出目录的 shell 权限问题(注意——可能需要将 Android Gradle 插件更新到 7.0.0 canary 版本,并将 Android Studio 更新到 Arctic Fox (2020.3.1),才能继续在受影响的设备上捕获输出文件)。 (Icb039)
  • 支持 BenchmarkPlugin 中的配置缓存 (6be1c1, b/159804788)
  • 简化了文件输出——默认情况下启用,位于不需要 requestLegacyExternalStorage=true 的目录中 (8b5a4d, b/172376362)
  • 修复了库打印有关在不存在 JIT 线程的平台版本上找不到 JIT 线程的 logcat 警告的错误。 (I9cc63, b/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 中为 140 毫秒,在 M 中为 8 毫秒——在 Nexus5X 上测量,时钟已锁定)。此指标显示在 Android Studio 控制台输出中,以及在
  • 性能分析支持——您现在可以捕获基准测试运行的性能分析数据,以检查代码运行缓慢的原因。基准测试支持从 ART 捕获方法跟踪或方法采样。这些文件可以使用 Android Studio 中的“性能分析器”通过“文件 > 打开”进行检查。
  • Benchmark Gradle 插件现在提供默认值,以便更轻松地进行设置
    • testBuildType 默认设置为 release,以避免使用内置代码覆盖率的依赖项。release buildType 也配置为默认 buildType,这允许 Android Studio 在首次打开项目时自动选择正确的构建变体。(b/138808399
    • signingConfig.debug 用作默认签名配置 (b/153583269)

** 错误修复 **

  • 显著减少了预热转换开销,其中每个基准的第一个测量结果人为地高于其他结果。此问题在非常小的基准测试(1 微秒或更短)中更为明显。(b/142058671
  • 修复了从命令行运行时为每个基准测试打印的 InstrumentationResultParser 错误。(I64988b/154248456

已知问题

  • 命令行、Gradle 调用 Benchmark 不会直接打印出结果。您可以通过以下两种方法解决此问题:通过 Studio 运行,或解析 JSON 输出文件以获取结果。
  • 基准测试报告无法从安装了应用程序 ID 以“android”或“download”(不区分大小写)结尾的应用程序的设备中提取报告。遇到此问题的用户应将 Android Gradle 插件升级到 4.2-alpha01 或更高版本。

版本 1.0.0

基准测试版本 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 中,或 在持续集成中,以观察代码性能随时间的变化,并防止回归。

主要功能包括

  • 时钟稳定
  • 自动线程优先级
  • 支持 UI 性能测试,例如在 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 跟踪添加到基准测试中

错误修复

  • 修复了度量不稳定问题,其中 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

错误修复

  • 添加了 androidx.annotation:android-experimental-lint 依赖项,以便 Java 代码在未使用实验性 API 时正确生成 lint 错误,类似于 Kotlin 实验性注释为 Kotlin 调用者提供的功能。
  • 现在可以正确检测 Android Gradle 插件 3.6 中用于输出的 additionalTestOutputDir instrumentation 参数的使用,以便知道 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 现在标记为实验性

错误修复

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

版本 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 的数据复制的支持,在运行基准测试时以及使用 AGP 3.6+ 时
  • JSON 格式添加
    • 输出总基准测试运行时间 (b/133147694
    • 使用名称字符串的 @Parameterized 基准测试(例如 @Parameters(name = "size={0},depth={1}"))现在在 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 中
    • 这些错误可以通过 instrumentation 参数将降级回警告。例如:-e androidx.benchmark.suppressErrors "DEBUGGABLE,LOW_BATTERY"

错误修复

  • 在 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 报告中公开由于热量节流造成的每个基准测试的睡眠持续时间

错误修复

  • 不再需要在 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 相同的稳定性约束:在测试版中稳定(极少数例外情况),并在最终版本中修复,仅在次要版本中添加,并在主要版本中更改/删除。

API 更改

  • 全面修改了 JSON 模式。对 JSON 模式的进一步更改可能仅限于添加

    • 重新组织了结果对象结构,以将来支持其他指标组 (b/132713021
    • 将测试运行上下文信息(如设备和构建信息以及时钟是否锁定)添加到顶级对象 (b/132711920
    • 时间指标名称现在在其名称中包含“ns” (b/132714527
    • 为每个报告的指标添加了其他统计信息(最大值、中位数、最小值),并删除了简化的“纳秒”汇总统计信息 (b/132713851
  • 删除了 XML 输出 (b/132714414

  • BenchmarkState.reportData API 中删除了热量节流检测 (b/132887006

错误修复

  • 修复了 ./gradlew lockClocks 在某些最新的操作系统设备上无法坚持 (b/133424037
  • 模拟器禁用了节流检测 (b/132880807

版本 1.0.0-alpha01

2019 年 5 月 7 日

androidx.benchmark:benchmark:1.0.0-alpha01 发布。此版本中包含的提交可以在 此处 找到。