基准测试

在 Android Studio 中精确测量代码性能。
最新更新 稳定版发布 发布候选版本 Beta 版发布 Alpha 版发布
2025 年 6 月 4 日 1.3.4 - 1.4.0-beta02 -

声明依赖项

要添加对 Benchmark 的依赖项,您必须将 Google Maven 代码库添加到您的项目中。有关详情,请阅读Google 的 Maven 代码库

宏基准测试

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

Groovy

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

Kotlin

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

微基准测试

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

Groovy

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

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

Kotlin

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

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

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

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

Groovy

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

Kotlin

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

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

Groovy

plugins {
  id 'androidx.benchmark'
}

Kotlin

plugins {
    id("androidx.benchmark")
}

反馈

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

创建新问题

有关详情,请参阅问题跟踪器文档

版本 1.4

版本 1.4.0-beta02

2025 年 6 月 4 日

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

API 变更

  • 添加了 BaselineProfileConfig.Builder,以便 Java 开发者更轻松地调用 BaselineProfileRule.collectWithResults()。(I94905

版本 1.4.0-beta01

2025 年 5 月 7 日

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

API 变更

  • 添加了接受 PerfettoConfigPerfettoTraceRule 构造函数变体(Ie53ba

Bug 修复

  • 更新了 TraceProcessor 启动洞察链接格式,以使用正确的插件和更清晰的分隔符(:%3A 短,并且都支持)(Ie18ef
  • 始终使用强制停止来终止进程,即使在已获得 root 权限并终止系统应用时也是如此。修复了以下形式的异常:Expected no stdout/stderr from killall ... No such process。(Idca2c

外部贡献

  • TraceProcessorHttpServer 添加了代理异常处理程序(I480f5

版本 1.4.0-alpha11

2025 年 4 月 9 日

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

API 变更

  • 更改了 TraceProcessor 的参数超时:Duration 为 timeoutMs long 以方便 Java 调用者使用。(I9fbb5
  • TraceProcessor 构造函数标记为内部。调用者应使用 TraceProcessor.startServerTraceProcessor.runServer。(Ia8c5b

Bug 修复

  • 使用 MacrobenchmarkScope.killProcess 终止应用时,验证终止命令结果以防止静默失败和超时错误。(I84555

依赖项更新

  • 此库现在面向 Kotlin 2.0 语言级别,并需要 KGP 2.0.0 或更高版本。(Idb6b5

版本 1.4.0-alpha10

2025 年 3 月 26 日

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

API 变更

  • TraceProcessor 服务器加载和查询的默认超时时间增加到 120 秒(之前为 60/30),并通过一个超时参数使其可配置。(Ifec87

Bug 修复

  • 修复了在没有 profileinstaller 且包含 BroadcastReciever 的应用中进行基准测试或捕获配置文件时出现的一些问题。这仅影响在已获得 root 权限的设备上运行。(Ied308

版本 1.4.0-alpha09

2025 年 3 月 12 日

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

API 变更

  • 添加了带可关闭句柄的 TraceProcessor 和 Session API,以便更轻松地使用自定义生命周期。这也是实现更轻松的协程和 Java API 使用的第一步。现在,TraceProcessor.runServer {} 的扩展函数被标记为实验性,因为它们可能会在将来移动并取消实验性标记。(I358b4

Bug 修复

  • 修复了由于 pgrep toybox 的更改而导致基准测试和 Baseline Profile 捕获在 API 36 上无法工作的问题,现在它需要 -a 才能打印完整的命令行。(Idc991
  • 过滤默认跟踪配置,以降低在较新 API 级别上跟踪数据丢失的风险。(I54e8a
  • 添加了实验性 androidx.benchmark.killExistingPerfettoRecordings Instrumentation 参数,可以将其设置为 false 以允许现有 Perfetto 跟踪捕获继续。默认情况下,设备上现有的 Perfetto 跟踪捕获会被终止以防止干扰。(I02a3c
  • 对于 API 35 及以上已发布的操作系统版本,JSON 字段 context.osCodenameAbbreviated 将为 REL,因为底层平台不再支持非数字代码名称。(Ib17fd
  • 修复了当发生重新同步帧时 FrameTimingMetric 中的崩溃。(I7c6f4b/394610806
  • 不再假设 Choreographer#doFrame 是主线程上 FrameTimingQuery 的堆栈帧顶部。(Iee0e0b/340206285

版本 1.4.0-alpha08

2025 年 2 月 12 日

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

API 变更

  • TraceProcessor.runSession() 扩展 API 移至实验性,因为它们最终可能会在 Android 上成为具体的构造函数。(Ib0528b/393640753
  • Startup Insights 的大部分实现现在是公开/实验性的,并已移至 TraceProcessor 工件。请参阅 StartupInsights。(I0aa00
  • 弃用 BenchmarkRule.runWithTimingDisabled {},转而使用 BenchmarkRule.runWithMeasurementDisabled {},后者更清晰地描述了行为 - 所有指标都已暂停。此外,公开 MicrobenchmarkScope 超类,因为重新声明 runWithMeasurementDisabled 函数以开放访问是不可能的,因为它在内联。(I9e23bb/389149423b/149979716
  • 基准测试库已迁移到 Kotlin 2.0。(I9d1e0
  • 移除了 androidx.benchmark.startupProfiles.enable Instrumentation 参数。它不再有用,因为可以通过 BaselineProfileRule.collect() 中的 includeInStartupProfile 参数控制。(I39eb4

Bug 修复

  • 减少了分析期间调用的 Microbenchmark 内部函数的数量,以使方法跟踪等更清晰(Ifaed8
  • 崩溃的推测性修复:“未能停止 [ProcessPid(processName=perfetto, pid=...)]”。现在,当后台 Perfetto 进程无法在运行基准测试之前停止时,Benchmark 将记录一条消息而不是崩溃。(I37d3eb/323601788
  • 修复了由于输出格式检查过于严格而导致的 IllegalStateExceptions,其标签为“Expected pm dump-profiles stdout”。(I358dc

版本 1.4.0-alpha07

2025 年 1 月 29 日

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

新功能

  • BaselineProfileRule 现在引入了 collectWithResults(...) API,其中包含计算出的配置文件路径列表。(I056f8
  • 添加了 androidx.benchmark.measureRepeatedOnMainThread.throwOnDeadline Instrumentation 参数,可以将其设置为 false,以禁用 measureRepeatedOnMainThread 的截止日期抛出行为,用于本地测试。否则不建议使用,因为这会增加测试期间 ANR 的可能性。(Idbeecb/353226476

API 变更

  • MicrobenchmarkConfig 构造函数添加了 @JvmOverloads。(I13fd3
  • 重构了 BenchmarkRule,使其基于协程构建,并支持更好的 yield() 行为。此重构移除了几个实验性的 BenchmarkState API,但会根据需要提供替代品。此外,添加了 runWithMeasurementDisabled 以澄清行为(所有测量都已暂停)。将来,runWithTimingDisabled 将被弃用。(I19837b/389149423b/311242861
  • PerfettoTraceProcessor 移动到新的 androidx.benchmark:benchmark-traceprocessor 工件中的 TraceProcessor,并使其大部分 API 非实验性。任何自定义的 TraceMetric 或从跟踪中读取的任何内容都需要更新到新的 TraceProcessor 导入。新的 TraceProcessor API 的工作方式与旧版完全相同,但它是一个独立的接口库(有点类似于 Room 的 androidx.sqlite 层),在宏基准测试中内置了 Android 特定的实现。新的工件也可以在 JVM 上使用,但目前您需要启动自己的 TraceProcessor 二进制文件副本,并提供一个端口以连接到它。(I3a767I62563b/381134564

Bug 修复

  • MacrobenchmarkScope.startActivityAndWait 未能启动目标进程(可能是由于目标进程崩溃)时,抛出更清晰的错误消息,而不是更模糊的“无法确认 activity 启动完成”消息(I3539b
  • 修复了 Kotlin 示例中的几个语法错误,以及 Java / build.gradle 示例中的语法高亮。(Ib3808
  • 澄清了 ArtMetricCaptureInfo 参数文档。(I96e60

版本 1.4.0-alpha06

2024 年 12 月 11 日

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

API 变更

  • 移除了 PerfettoTraceProcessor.Session.query()@Language("sql") 的使用,因为 Studio 的高亮/解析功能已损坏。(Idc2fab/377733398

Bug 修复

  • 此库现在使用 JSpecify 空值注解,这些注解是类型用途的。Kotlin 开发者应使用以下编译器参数来强制执行正确使用:-Xjspecify-annotations=strict(这是 Kotlin 编译器 2.1.0 版及更高版本的默认设置)。(I46810b/326456246
  • 更正了 ArtMetric 以报告类加载(而非初始化),并改进了文档以阐明运行时行为。(I9915c
  • 在 Android 多用户上,仅在已获得 root 权限的设备上以 root 身份执行命令。(I88b44

版本 1.4.0-alpha05

2024 年 11 月 13 日

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

Bug 修复

  • 修复了 API 34+ 上 CompilationMode.None() 的性能不一致且无法代表初始最坏情况性能的问题。这解决了平台更改,该更改允许 ART 的编译状态 verify 在首次启动后不久部分编译应用(仅影响类加载)。(Ie48d0
  • 修复了捕获(尤其是短)跟踪时可能导致无法从内置 Macrobenchmark 指标报告测量值的问题,原因是 Perfetto 跟踪中进程名称被截断。现在,宏基准测试通过在所有内置查询中查找截断的包名来解决此问题,除了预期的包名。请注意,自定义 TraceMetric 实现或其他 PerfettoSession.query 的直接调用者可以通过将 Perfetto 查询中的 process.name LIKE "$packageName" 更改为 (process.name LIKE "$packageName" OR process.name LIKE "$(packageName.takeLast(15))") 来实现相同的行为。(I5bf01b/377565760

版本 1.4.0-alpha04

2024 年 10 月 30 日

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

新功能

  • (实验性)支持在安装到辅助用户(例如无头 Android Auto 设备上的任何应用)的应用上生成 Baseline Profile 和进行基准测试。此支持已在某些场景中进行了测试,但如果它不适用于您,请通过 bug 告知我们。(I9fcbeb/356684617b/373641155

Bug 修复

  • isProfileable 现在始终在基准测试版本中被覆盖,而 isDebuggable 现在也始终在基准测试和 nonMinified(基线配置文件捕获)版本中被覆盖。(I487fab/369213505
  • 修复了某些 API 28 之前的物理设备上的编译检测问题 - 影响了 json context.compilationMode,以及 androidx.benchmark.requireAot=true 的行为(不再错误地抛出异常)(Ic3e08b/374362482
  • CpuEventCounter 指标中,如果观察到无效测量值(例如 instructions/cpucycles==0),则抛出异常(I8c503

版本 1.4.0-alpha03

2024 年 10 月 16 日

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

API 变更

  • 宏基准测试:添加了 ArtMetric,可用于检查配置文件覆盖率或通用 Android 运行时性能。捕获 JIT、类初始化(如果可用)和类验证的数量和总持续时间。此外,更改了 CaptureInfo 以包含可选的 ART 主线版本(带默认值)。(I930f7
  • coefficientOfVariation 添加到 Benchmark JSON 输出,以显示给定基准测试运行中的稳定性。(Ib14ea

Bug 修复

  • 修复了 AVD 设备名称中包含空格时 CollectBaselineProfileTask 的问题。(Ia0225b/371642809
  • StartupMode.COLD 异常的推测性修复:Package <packagename> must not be running prior to cold start!。现在,MacrobenchmarkScope.killProcess()(包括每次迭代之前运行的,用于实现 StartupMode.COLD 行为的)将等待验证应用的所有进程是否已停止运行。(I60aa6b/351582215
  • 修复了在某些已获得 root 权限的模拟器上出现 UNLOCKED_ 错误的问题。(Ic5117
  • 此库现在使用 JSpecify 空值注解,这些注解是类型用途的。Kotlin 开发者应使用以下编译器参数来强制执行正确使用:-Xjspecify-annotations=strict(这是 Kotlin 编译器 2.1.0 版及更高版本的默认设置)。(I7104fb/326456246

版本 1.4.0-alpha02

2024 年 10 月 2 日

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

API 变更

  • 将 Gradle 任务 lockClocksunlockClocks 移至基准测试项目,而不是在顶层可用。此更改是必要的,因为不幸的是,无法在不破坏项目隔离的情况下将这些任务注册为顶层操作。(I02b8fb/363325823

Bug 修复

  • BaselineProfileRule 现在通过在块结束时向每个正在运行的进程发出信号以转储配置文件来收集多进程应用的配置文件。如果基于配置文件的编译从未成功找到要广播的进程,则编译将失败,因为在此情况下不应存在配置文件数据。此外,添加了一个 instrumentation 参数来控制转储等待时间:androidx.benchmark.saveProfileWaitMillisI0f519b/366231469
  • 自 Benchmark 1.3.2 起:修复了 Firebase Test Lab (FTL) 无法从 Baseline Profile Gradle 插件中提取 Baseline Profile 或 Macrobenchmark 结果文件的问题。(I2f678b/285187547

要使用 FTL,请在插件块中将插件应用于基线配置文件模块,并使用

  plugins {
      ...
      id("com.google.firebase.testlab")
  }

然后配置 firebase test lab,使用

  firebaseTestLab {

      // Credentials for FTL service
      serviceAccountCredentials.set(file("credentials.json"))

      // Creates one or more managed devices to run the tests on.
      managedDevices {
          "ftlDeviceShiba34" {
              device = "shiba"
              apiLevel = 34
          }
      }

      // Ensures the baseline profile is pulled from the device.
      // Note that this will be automated as well later with aosp/3272935.
      testOptions {
          results {
              directoriesToPull.addAll("/storage/emulated/0/Android/media/${android.namespace}")
          }
      }
  }

此外,创建的 FTL 设备需要添加到基线配置文件扩展中

  baselineProfile {
      managedDevices += "ftlDeviceShiba34"
      useConnectedDevices = false
  }

版本 1.4.0-alpha01

2024 年 9 月 18 日

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

新功能 - 应用启动洞察

  • 应用启动洞察的初始版本可以在宏基准测试中启用。(09fae38

要在启动基准测试中启用

  @Test
  fun startup {
      macrobenchmarkRule.measureRepeated(
          
          packageName = "com.example.my.application.id"
          metrics = listOf(StartupTimingMetric()),
          iterations = 5,
          startupMode = StartupMode.COLD,
          compilationMode = CompilationMode.None(),
          experimentalConfig = ExperimentalConfig(startupInsightsConfig = StartupInsightsConfig(isEnabled = true))
          ) {
          scope.startActivityAndWait(...)
      }
  }

然后运行您的启动基准测试将分析跟踪以查找常见问题,并在指标之后将其打印到基准测试选项卡中的 Studio 测试输出,例如:

StartupBenchmark_startup[startup=COLD,compilationMode=None]
├── Metrics
│   ├──   timeToFullDisplayMs                min  1,147.2,   median  1,208.8,   max  1,307.4
│   └──   timeToInitialDisplayMs             min  1,147.2,   median  1,208.8,   max  1,307.4
├── App Startup Insights
│   ├── App in debuggable mode (expected: false)
│   │   └── seen in iterations: 0(true) 1(true) 2(true) 3(true) 4(true) 5(true) 6(true) 7(true) 8(true) 9(true)
│   ├── Potential CPU contention with another process (expected: < 100000000ns)
│   │   └── seen in iterations: 4(105022546ns)
│   └── Main Thread - Binder transactions blocked (expected: false)
│       └── seen in iterations: 7(true)
└── Traces
    └── Iteration 0 1 2 3 4 5 6 7 8 9

此功能仍在开发中,后续将改进文档和可扩展性,但欢迎提供反馈。

新功能

  • 添加了 gradle 属性 androidx.baselineprofile.suppressWarnings 以抑制所有基线配置文件警告。(314153a
  • 微基准测试指标现在在 Perfetto 跟踪中显示为计数器。(3214854
  • 添加了用于禁用 JIT(需要 root/运行时重启)和重置设备性能/测试状态的实验性脚本。这些脚本目前尚未发布为 gradle 任务。(7c3732b
  • 添加了在模拟器上运行时跳过测试的基准测试参数。当 automaticGenerationDuring 构建启用时,基准测试也将触发基线配置文件生成。如果使用模拟器,这将失败。通过新参数 skipBenchmarksOnEmulator,我们可以改为跳过测试。(0c2ddcd
  • 更改 perf 事件启用逻辑以在 API 23+ 上运行(2550048

API 变更

  • MacrobenchmarkRule.measureRepeated() 的现有实验性 PerfettoConfig 参数移动到新的 ExperimentalConfig 对象。

Bug 修复

  • 增加 lockClocks.sh 重试次数(99e9dac
  • 如果存在 nonMinified 和基准测试构建类型,则不创建它们。由于一个 bug,即使 nonMinified 和基准测试构建类型存在,它们也将被重新创建。(e75f0a5
  • 忽略 TraceSectionMetric 结果中非终止切片。(a927d20
  • 改进了模拟器检查,以考虑 sdk_ 前缀。(1587de8
  • 将未运行的包视为在 FrameTimingGfxInfoMetric 中已清除。(35cc79c
  • 修复了 androidx.benchmark.cpuEventCounter 对非指令事件产生损坏值的问题。(06edd59
  • 修复了 resumeTiming/runWithTimingDisabled 以尊重指标优先级顺序,并显著减少较低优先级指标暂停/恢复对较高优先级指标结果的影响。例如,如果通过 cpuEventCounter.enable instrumentation 参数使用 cpu 性能计数器,则当发生暂停/恢复时,timeNs 不再显著减少。(5de0968

版本 1.3

版本 1.3.4

2025 年 3 月 26 日

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

Bug 修复

  • 修复了基准测试基线 Gradle 插件中的 Gradle 项目隔离不兼容问题。(b/404523257

版本 1.3.3

2024 年 10 月 16 日

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

Bug 修复

  • 修复了 AVD 设备名称中包含空格时 CollectBaselineProfileTask 的问题(Ia0225b/371642809

版本 1.3.2

2024 年 10 月 2 日

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

Bug 修复

  • 修复了 Firebase Test Lab (FTL) 无法从 Baseline Profile Gradle 插件中提取 Baseline Profile 或 Macrobenchmark 结果文件的问题。(I2f678b/285187547

要使用 FTL,请在插件块中将插件应用于基线配置文件模块,并使用

  plugins {
      ...
      id("com.google.firebase.testlab")
  }

然后配置 firebase test lab,使用

  firebaseTestLab {

      // Credentials for FTL service
      serviceAccountCredentials.set(file("credentials.json"))

      // Creates one or more managed devices to run the tests on.
      managedDevices {
          "ftlDeviceShiba34" {
              device = "shiba"
              apiLevel = 34
          }
      }

      // Ensures the baseline profile is pulled from the device.
      // Note that this will be automated as well later with aosp/3272935.
      testOptions {
          results {
              directoriesToPull.addAll("/storage/emulated/0/Android/media/${android.namespace}")
          }
      }
  }

此外,创建的 FTL 设备需要添加到基线配置文件扩展中

  baselineProfile {
      managedDevices += "ftlDeviceShiba34"
      useConnectedDevices = false
  }

版本 1.3.1

2024 年 9 月 18 日

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

Bug 修复

  • 添加了 gradle 属性 androidx.baselineprofile.suppressWarnings 以抑制所有基线配置文件警告(I7c36eb/349646646
  • 修复了 Baseline Profile Gradle 插件,使其在应用创建了预先存在的 nonMinified…benchmark… 时使用它们,而不是创建包装器。(Ia8934b/361370179
  • 修复了在模拟器上启用 automaticGenerationDuringBuild 时出现的 java.lang.AssertionError: ERRORS (not suppressed): EMULATOR 错误。现在,新参数用于跳过测试。(If3f51b/355515798
  • 微基准测试精简 - 在基准测试库 proguard 中保留 org.junit.runner.notification.RunListener 的子类(Ic8ed5b/354264743
  • 修复了 TraceSectionMetric 以忽略非终止切片。之前这些被认为持续时间为 -1,例如在求和或查找最小持续时间时。(If74b7
  • 修复了 FrameTimingGfxInfoMetric 中的问题,该问题会导致如果在进程未运行时启动指标,则会崩溃。(I6e412

版本 1.3.0

2024 年 8 月 21 日

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

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

  • 方法跟踪在大多数设备上运行时在微基准测试中默认启用
    • 方法跟踪作为单独的阶段运行,在测量之后 - 这使得从单个基准测试运行中同时输出准确的测量和方法跟踪成为可能
    • 某些 Android 操作系统和 ART 版本上的方法跟踪将影响后续的测量阶段 - 在这些版本上,方法跟踪默认关闭,并在 Studio 输出中打印警告
  • 主线程基准测试和 ANR
    • 添加了 measureRepeatedOnMainThread 用于 UI 线程基准测试(例如与 Compose/View UI 交互的基准测试),以避免长时间运行时的 ANR。
    • 如果方法跟踪预计会超出 ANR 避免截止日期,则跳过。将 androidx.benchmark.profiling.skipWhenDurationRisksAnr 设置为 false 以禁用此行为(不建议用于 CI 运行,因为 ANR 可能会在长时间 CI 运行中导致问题)。
  • 精简
    • 嵌入式 proguard 规则以改进启用精简后的微基准测试
    • 库模块中的精简/R8 需要 AGP 8.3,可以通过在 build.gradle 中设置 android.buildTypes.release.androidTest.enableMinification 来启用
    • 添加了实验性 BlackHole.consume() API 以防止死代码消除(If6812b/286091643
  • 指标
    • 实验性 cpu 事件计数器功能(来自 perf_event_open 的指标,在大多数平台版本上需要 root 权限),通过 InstrumentationArgument androidx.benchmark.cpuEventCounter.enable 访问(可以设置为 true),androidx.benchmark.cpuEventCounter.events 可以设置为例如 (Instructions,CpuCycles)。这应该在某些用户调试模拟器上受支持,但尚未在所有可用模拟器上测试其支持情况

自 1.2.0 以来的 MACRObenchmark 更改

  • 宏基准测试的方法跟踪全面修订。
    • 现在,方法跟踪的范围限定为 measureBlock 的持续时间,并且如果进程多次启动,则可以捕获多个会话。
    • 以前,方法跟踪仅适用于 StartupMode.COLD 基准测试,并且对于未重启目标进程的 measureBlocks 不会捕获任何内容
    • 修复了宏基准测试中的方法跟踪刷新,使得方法跟踪应该完全捕获并有效,即使在较慢的设备上也是如此。(I6349ab/329904950
  • 在进程终止时,在每次 warmUp 迭代期间正确转储 ART 配置文件,以便 CompilationMode.Partial(warmup=N) 测量更准确。(I17923
  • 删除 Shader 广播失败消息
    • 添加调试建议以删除着色器广播失败消息
    • 添加两个 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 跟踪记录。请注意,配置不正确的配置可能会导致内置 Metric 类失败。(Idfd3db/309841164b/304038384
  • 在运行宏基准测试之前取消后台 dexopt 任务,以减少干扰。(I989ed
  • 宏基准测试现在会等待 1 秒钟,以便目标应用程序刷新 ART 配置文件(之前等待 500 毫秒)。(I85a50b/316082056
  • TraceSectionMetric 全面修订
    • 注意:以下 TraceSectionMetric 更改可能会影响 CI 使用中的输出,并可能导致不连续性或解析失败
    • 总和现在是默认值,因为此指标的大多数用法都是针对重复事件,并且在这些情况下,first 会丢弃数据
    • 更改为更可定制,具有更多可用模式
    • 模式名称现在嵌入在指标输出名称中(在 Studio 和 JSON 中)
    • 现在支持使用 Trace.{begin|end}AsyncSection 创建的切片。
  • 指标
    • 功耗 - 添加了 PowerMetric.deviceSupportsHighPrecisionTrackingPowerMetric.deviceBatteryHasMinimumCharge()PowerMetric.deviceSupportsPowerEnergy()
    • Metric.getResult 重命名为 getMeasurements 以匹配返回类型
    • 为所有启动检测失败添加了 log.w / 异常标签。这不改变当前行为(因此某些错误抛出,而另一些则静默未能检测启动),只是使其更容易理解。通常,那些 Log.w() 并未能报告启动指标的,是缺少非帧事件的,而当检测到启动但缺少帧时(来自 UI/RT 切片),则抛出异常。(Id240fb/329145809
    • FrameTimingMetric 中添加了 frameCount 测量,以帮助发现由于生成帧数发生变化(添加了新动画,修复了无效问题)而导致测量值发生变化的情况。(I1e5aa
    • 澄清了 frameOverrunMs 在文档中为何是跟踪首选指标,以及原因。(I18749b/329478323
    • 修复了跟踪开始和结束时未终止的帧可能配对在一起的问题,这会导致错误地报告为单个极长的帧。(I39353b/322232828
    • 改进了 FrameTimingMetric 在未生成帧时的错误,并始终在指标解析失败时输出跟踪链接,以帮助诊断问题。(I956b9
    • 修复了 FrameTimingMetric 中解析帧 ID 失败导致的崩溃,特别是在某些 OEM 设备上。(Ia24bcb/303823815b/306235276
    • 放宽了 FrameMetrics 中检查的严格性,并添加了更多错误消息详细信息。(Iadede

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

  • 将 AGP 的最高建议版本提高到 9.0.0-alpha01。
  • 确保 mergeArtProfilemergeStartupProfile 任务始终等待基线配置文件生成。(I623d6b/343086054
  • 成功生成基线配置文件将输出更改摘要(I824c8b/269484510
  • 添加了禁用警告的 DSL(Ic4debb/331237001
  • 修复以确保在 automaticGenerationDuringBuild 关闭时基准测试使用生成的基线配置文件(Ic144fb/333024280
  • 修复了 BaselineProfile gradle 插件属性覆盖,以在使用自定义的 nonMinified 或基准测试构建类型时启用基线配置文件生成和基准测试。(Ib8f05b/324837887
  • 修复了在 AGP 8.3.0-alpha15 之前将库基线配置文件包含在 AAR 中的问题。(I1d2afb/313992099
  • 修复了生成任务结束时基线和启动配置文件输出 URL。(I802e5b/313976958

自 1.2.0 以来的其他重大变更

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

版本 1.3.0-rc01

2024 年 8 月 7 日

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

Bug 修复

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

版本 1.3.0-beta02

2024 年 7 月 10 日

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

Bug 修复

  • 优雅地处理启动 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
  • 微基准测试现在将正确抛出异常,以防止方法跟踪干扰测量。这发生在某些设备上,当方法跟踪被强制开启(通过 instrumentation args 或 MicrobenchmarkConfig),并且在方法跟踪之后尝试测量时。受影响的设备运行 API 26-30 或受此干扰影响的某些 ART 主线模块版本,可以通过 ProfilerConfig.MethodTracing.affectsMeasurementOnThisDevice 在运行时检测到。(Iafb92b/303660864

Bug 修复

  • 建议的 AGP 最高版本提高到 9.0.0-alpha01。(I5bbb0
  • 添加了编译模式到基准测试上下文(If5612b/325512900
  • 默认启用 AIDL 跟踪(需要 API 28)(Ia0af2b/341852305
  • 在 JSON 输出的基准测试上下文中添加了额外信息
    • context.artMainlineVersion - Art 主线模块的整数版本(如果设备上存在,否则为 -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 包含这些提交

Bug 修复

  • 当宏基准指标在所有迭代中返回零值时,抛出更清晰的异常(Iab58fb/314931695
  • 微基准测试 proguard 规则中添加了额外的变通规则,包括支持侦听器规则和其他观察到的警告/错误。(I14d8fb/329126308b/339085669
  • 方法跟踪在 Macrobenchmark 期间作为单独的阶段运行,并且不再影响测量。(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 跟踪记录。请注意,配置不正确的配置可能会导致内置 Metric 类失败。(Idfd3db/309841164b/304038384
  • PowerMetric.deviceSupportsPowerEnergy 重命名为 PowerMetric.deviceSupportsHighPrecisionTracking 以提高清晰度(I5b82f
  • 添加了 PowerMetric.deviceBatteryHasMinimumCharge()PowerMetric.deviceSupportsPowerEnergy(),以允许根据设备功耗测量能力更改或跳过基准测试。(I6a591b/322121218

Bug 修复

  • 添加了与上一个基线配置文件的比较(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 二进制(未解码)变体。这些 API 允许您查询内置于 TraceProcessor 中的指标I54d7fb/304038382
  • profilerOutput 添加到 JSON 输出,以便更轻松地进行分析跟踪(例如 perfetto、方法跟踪)的工具化。(I05dddb/332604449
  • 为基准测试 Perfetto Config 添加了电源标签。这会捕获例如唤醒锁跟踪点。(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

Bug 修复

  • 修复以确保在 automaticGenerationDuringBuild 关闭时基准测试使用生成的基线配置文件(Ic144fb/333024280
  • 修复 BaselineProfile Gradle 插件属性覆盖,以便在自定义 nonMinified 或基准测试构建类型时能够生成和基准测试基线配置文件。(Ib8f05b/324837887
  • 修复了宏基准测试中的方法跟踪刷新,使得方法跟踪能够完全捕获并有效,即使在较慢的设备上也是如此。(I6349ab/329904950
  • 启用 Perfetto 跟踪记录上的阻塞启动,以降低跟踪开始时数据丢失的风险。仅支持 API 33+。(Ie6e41b/310760059
  • 在基准测试模块中使用 Android Test Orchestrator 时添加了警告,因为这会导致每个模块的输出 JSON 文件被重复覆盖。(Ia1af6b/286899049
  • 强制使用“,”(逗号)作为千位分隔符,以保持 Studio 输出的一致性,忽略设备区域设置。(I3e921b/313496656
  • TraceSectionMetric 现在支持使用 Trace.{begin|end}AsyncSection 创建的切片。(I91b32b/300434906
  • 为所有启动检测失败添加了 log.w / 异常标签。这不改变当前行为(因此某些错误会抛出,而另一些则静默地无法检测到启动),只是使其更易于理解。通常,那些 Log.w() 并未能报告启动指标的错误是缺少非帧事件的情况,当检测到启动但缺少帧时序信息(来自 UI/RT 切片)时则会抛出异常。(Id240fb/329145809
  • 在运行宏基准测试之前取消后台 dexopt 任务,以减少干扰。(I989ed
  • FrameTimingMetric 中添加了 frameCount 测量,以帮助发现由于生成帧数发生变化(添加了新动画,修复了无效问题)而导致测量值发生变化的情况。(I1e5aa
  • 澄清了 frameOverrunMs 在可用时是首选的跟踪指标,并说明了原因。(I18749b/329478323

版本 1.3.0-alpha02

2024 年 3 月 20 日

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

新功能

  • 通过嵌入式 proguard 规则在微基准测试中实验性支持 R8。请注意,此支持是实验性的,并且需要 AGP 8.3 才能对库模块测试进行压缩。使用以下方法在基准测试模块的 build.gradle 中启用 R8 压缩/优化,根据工作负载,这应该会带来显著的性能提升。(I738a3b/184378053

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

Bug 修复

  • 修复了方法跟踪警告与微基准测试输出不在同一行的问题。(I0455cb/328308833

版本 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 UI 的基准测试)可以避免触发 ANR,尤其是在 CI 中的大型套件期间。(I5c86d
  • 添加了 FrameTimingGfxInfoMetric,它是 FrameTimingMetric 的实验性替代实现,其测量值直接来自平台,而不是从 Perfetto 跟踪中提取。(I457cbb/322232828
  • 增加了在单个 warmUp 迭代期间转储 ART 配置文件的功能。(I17923
  • TraceSectionMetric API 的几项更改
    • 添加 Mode.MinMode.Max
    • 添加标签参数以将节名称覆盖为指标标签
    • 在输出中添加了模式名称以澄清指标含义
    • 将默认值更改为 sum,因为此指标的大多数用法是针对重复事件。请注意 CI 使用中的这些更改,因为它可能会导致不连续性或破坏解析。(Ic1e82b/301892382b/301955938

Bug 修复

  • 改进了基线配置文件 Gradle 插件在指定托管设备不存在时的错误消息。(Idea2bb/313803289
  • 修复了在 AGP 8.3.0-alpha15 之前将库基线配置文件包含在 AAR 中的问题。(I1d2afb/313992099
  • 修复了生成任务结束时基线和启动配置文件输出 URL 的问题。(I802e5b/313976958
  • 调整了数据源超时,尝试修复 java.lang.IllegalStateException: Failed to stop [ProcessPid(processName=perfetto, pid=...)]。(I8dc7db/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 线程上的方法跟踪,并在抛出异常时清理方法跟踪。(I6e768
  • 当文件名长度超过 200 个字符时抛出异常,以避免在写入或后处理文件时出现不明确的崩溃。(I4a5ab
  • 修复了跟踪开头和结尾处未终止的帧可能配对在一起的问题,这会被错误地报告为一个非常长的单帧。(I39353b/322232828
  • 在 API 30+ 上重新安装包以清除用户构建上的 ART 配置文件时,使用 API 30-33 上的 --skip verification。这有助于绕过 Play Protect 警告,这些警告会导致某些类型的设备出现故障。(Ic9e36
  • 当应用程序不是系统 UI 或启动器等系统应用程序时,使用 am force-stop 终止应用程序。(I5e028
  • 宏基准测试现在会等待 1 秒让目标应用程序刷新 ART 配置文件(以前等待 500 毫秒)。(I85a50b/316082056
  • 改进了 FrameTimingMetric 在未生成帧时的错误,并始终在指标解析失败时输出跟踪链接,以帮助诊断问题。(I956b9
  • 修复了 FrameTimingMetric 解析帧 ID 失败导致崩溃的问题,特别是在某些 OEM 设备上。(Ia24bcb/303823815b/306235276
  • 放宽了 FrameMetrics 中检查的严格性,并添加了更多错误消息详细信息。(Iadede

版本 1.2

版本 1.2.4

2024 年 4 月 17 日

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

Bug 修复

  • 修复了基线配置文件 srcset 未在基准测试变体中设置的问题。还修复了库中 automaticGenerationDuringBuild 导致循环依赖的问题。(I28ab7b/333024280
  • 当应用程序不是系统 UI 或启动器等系统应用程序时,使用 am force-stop 终止应用程序。这修复了 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 包含这些提交。

Bug 修复

  • 当 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 U+ 上基线配置文件收集的问题。(Id1392b/277645214

宏基准测试

  • 编译
    • 宏基准测试现在会正确地为每次编译完全重置编译状态——这需要在 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
    • 澄清了设备(尤其是模拟器)操作系统映像未正确配置跟踪或编译时的错误
    • 跳过无电池设备的电池电量检查(微基准测试和宏基准测试)
    • 改进了文件输出,对无效输出目录提供了更清晰的错误,并提供了更安全的默认设置
    • 通过始终清除着色器缓存(也通过 MacrobenchmarkScope.dropShaderCache 公开)提高了 StartupMode.COLD 的稳定性
    • 修复了 startActivityAndWait 的 leanback 回退。

微基准测试

  • 功能
    • 分析被移到一个单独的阶段,在其他指标之后,因此一次测试运行可以同时显示准确的计时*和*分析结果。
  • 实验性 API
    • 添加了实验性 MicrobenchmarkConfig API,用于定义自定义指标和配置跟踪与分析。可用于捕获方法跟踪或捕获跟踪点(但请注意跟踪开销)。
    • 添加了实验性 API,用于独立于 BenchmarkRule(不使用 JUnit)控制 BenchmarkState
    • 添加了实验性 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
  • 澄清了将 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
  • (宏基准测试) 澄清了在 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
  • 基准测试库内部跟踪点(包括微基准测试循环/阶段跟踪)现在将显示在 Studio 系统跟踪查看器中,并在 Perfetto 中嵌套在正确的进程下。(I6b2e7b/293510459
  • 移除了 API 31+ 上的 macrobenchmark 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.0implementation 依赖项更改为 api 依赖项。(I1981e

版本 1.2.0-beta01

2023 年 7 月 18 日

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

Bug 修复

  • 修复了基准测试输出中警告有时在 Studio 中被抑制的问题,并解决了基准测试输出中前导空格在 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

Bug 修复

  • 宏基准测试支持 androidx.benchmark.profiling.mode = MethodTracing。(I7ad37b/285912360
  • 微基准测试分析已移至单独的阶段,因此它在测量之后按顺序进行,而不是替换测量。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 参数更改为非空,并具有等效的默认值,以便在文档中更清楚地显示默认过滤行为。(I3816e

Bug 修复

  • dryRunMode 中禁用 IsolationActivity 和 Perfetto 跟踪,以显著提高性能,因为它们是大部分运行时。(Ie4f7d
  • 支持在 Macrobenchmarks 中使用插桩测试参数 androidx.benchmark.profiling.mode=StackSamplingandroidx.benchmark.profiling.sampleFrequency 进行调用堆栈采样。(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
  • 修复了 Android U 上由于 pm dump-profiles 命令的不同输出导致基线配置文件生成失败的问题。(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 跟踪支持,包括微基准测试和实验性 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 的应用包中重新安装或提取配置文件时 MacrobenchmarkRuleBaselineProfileRule 中的崩溃问题。(I0d8c8b/270587281

版本 1.2.0-alpha10

2023 年 2 月 22 日

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

新功能

  • 在 Android 14+ 上,宏基准测试不再重新安装目标应用程序以重置编译状态,这得益于一项新的平台功能。以前,必须有一个有 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 pull 参数顺序问题。(I958d1b/261781624
  • 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,它会等待基线配置文件稳定 N 次迭代。(I923f3
  • 添加了使用 BaselineProfileRule 生成基线配置文件时指定输出文件名前缀的功能。(I7b59fb/260318655

Bug 修复

  • 提高了文件输出写入的安全性,这应能防止输出文件在写入/附加时静默失败,尤其是在 API 21/22 上。(If8c44b/227510293
  • 修复了 simpleperf 跟踪输出无法正确创建和放置文件的问题。这通常也能更全面地解决 Gradle 无法成功拉取文件的问题。(I12a1cb/259424099
  • 改进了 profileinstaller 过旧时打印的错误消息。现在它会告诉您更新 profileinstaller 版本 (1.2.1) 以便在 API 31 到 33 上测量基线配置文件,而不是说它不支持。(Ia517fb/253519888
  • 修复了几个 shell 命令失败的错误消息:打印所需 API <=23,包括 Perfetto 捕获二进制设置失败和跟踪捕获失败。(Ib6b87b/258863685
  • 自动排序生成的配置文件规则,以最小化它们随时间变化时的更改次数(在将配置文件规则检入源代码管理时)。(Ie2509
  • 修复了 Android 13 (API 33) 以下未 root 构建上崩溃的问题,错误消息为 Expected no stderr from echo 3 > /proc/sys/vm/drop_caches。(I6c245b/259508183

已知问题 - MacrobenchmarkScope.dropShaderCache() 可能会因 profileinstaller manifest 中缺少广播注册而崩溃,该注册尚未发布。(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。(Ife601b/220183779
  • 修复了 MacrobenchmarkScope.dropShaderCache() 实际清除着色器缓存的问题。这将从 StartupMode.COLD 基准测试中消除大约 20ms 的噪音,因为着色器现在每次迭代都会一致地清除。以前,使用预热迭代的 Partial 编译会报告不正确的快速数字,因为着色器缓存更有可能在预热期间发生。此修复需要有 root 权限的设备,或者在目标应用中使用 profileinstaller:1.3.0-alpha02。有关 ProfileInstaller 库的 API 更改,请参阅ProfileInstaller 1.30-alpha02 页面。(Ia5171b/231455742
  • 添加了 TraceSectionMode("label", Mode.Sum),允许测量具有相同标签的多个跟踪部分的总耗时。例如,TraceSectionMetric("inflate", Mode.Sum) 将报告宏基准测试中通货膨胀总耗时的指标 inflateMs。还取消了 API 29 的要求,因为 TraceSectionMetricandroidx.tracing.Trace 协同工作,支持更低的 API 级别,并通过在目标应用程序中使用 forceEnableAppTracing。(Id7b68b/231455742

Bug 修复

  • 通过验证所有输出/错误,提高了所有内部 shell 命令的安全性。(I5984db/255402908b/253094958
  • 在基线配置文件 adb pull 命令中指定设备,这样如果连接了多个设备(最多一个模拟器),pull 命令就可以简单地复制。(I6ac6cb/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 权限,并且不再是实验性的。(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 包含这些提交。

新功能

  • 为宏基准测试添加了对 dryRunMode.enable 插桩参数的支持(已在微基准测试中可用),以便更快地进行本地开发和验证应用程序自动化(例如在预提交中)。这会将迭代次数覆盖为 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
  • 修复了 startActivityAndWait 在模拟器上尝试等待启动完成时因帧检测严格性降低而超时的问题。(Ibe2c6b/244594339b/228946895

版本 1.2.0-alpha03

2022 年 9 月 7 日

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

新功能

  • 添加了实验性 API,用于独立于 BenchmarkRule / JUnit4 使用 BenchmarkState。(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 修复

版本 1.2.0-alpha01

2022 年 7 月 27 日

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

新功能

  • 新的 tracing-perfetto-common 组件允许工具在公开 Perfetto SDK 跟踪的应用程序中启用该跟踪。(I2cc7f
  • 添加了 androidx.benchmark.enabledRules 插桩参数,以启用将宏基准测试运行仅过滤到基准测试或仅过滤到基线配置文件生成。传入“Macrobenchmark”或“BaselineProfile”以仅运行一种类型的测试,例如仅在模拟器上生成 BaselineProfiles 时。还支持逗号分隔列表。(I756b7b/230371561

    例如,在您的宏基准测试 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,用于测量宏基准测试中每个系统类别的总功耗和总能耗。(I3b26bb/224557371

Bug 修复

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

版本 1.1.1

版本 1.1.1

2022 年 11 月 9 日

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

Bug 修复

  • 修复了在某些 Android 11 (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 修复/行为更改

  • 修复了宏基准测试之间应用程序编译未正确重置,以及在未 root 构建上根本未重置的问题。这修复了许多运行多个测试时 CompilationMode 对测量几乎没有影响的情况。为解决此问题,现在目标应用程序会在每个测试方法中完全重新安装,这会清除每个宏基准测试之间的应用程序数据。(I31c74b/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 时。(I756b7b/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 包含这些提交。

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
  • 彻底检查活动启动完成检测,以修复启动宏基准测试中“无法读取任何指标”异常。(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 包含这些提交。

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

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

  • 过滤 simpleperf 采样分析以仅测量 measureRepeated 线程,以简化检查。(Ic3e12b/217501939

  • 支持多进程应用中命名 UI 子进程的指标。(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 变更

  • 在宏基准测试库中添加了 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
  • 移除了已废弃的 CompliationModes。(I98186b/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 分为三类:Full、None、Partial。以前,它们的命名与编译参数(我们现在将其视为实现细节)和功能不一致。这使得平台版本之间的权衡、潜在组合和行为更加清晰。(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 修复

  • 每次迭代唤醒设备,以确保可以测试 UI - 要求禁用锁屏。(Ibfa28b/180963442
  • 修复了模拟器和非 Root 设备上堆栈采样分析模式下的多次崩溃问题。(Icdbdab/202719335
  • 移除了每次迭代结束时 0.5 秒的休眠时间 - 如果您发现此更改导致指标缺失,请提交错误报告。(Iff6aa
  • 减少数据丢失的可能性,并降低跟踪造成的内存开销。(Id2544b/199324831b/204448861
  • 通过切换到紧凑的调度存储格式,将跟踪大小减少约 40%。(Id5fb6b/199324831
  • 更新了启动指标的实现,使其始终在渲染线程结束时结束。这将使跨平台版本更加一致,并更接近应用内测量。(Ic6b55

版本 1.1.0-alpha11

2021 年 11 月 3 日

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

API 变更

  • Macrobenchmark 的 minSdkVersion 现在为 23。(If2655
  • 新增实验性 BaselineProfileRule,能够为应用的“关键用户旅程”生成基准配置文件。详细文档将随后发布。(Ibbefab/203692160
  • 移除了为 Java 调用方添加的 measureRepeated 接口变体,因为它导致了方法完成/解析的歧义。Java 调用方将再次需要从 measureRepeated 返回 Unit.Instance。如果这造成不便,请提交错误报告,我们可以在未来的版本中重新考虑。(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 调用方添加了 JvmOverloads 到多个 MacrobenchmarkScope 方法。(I644feb/184546459
  • 为 Java 语言中的惯用用法提供了替代的 MacrobenchmarkRule.measureRepeated 函数,该函数使用 Consumer<MacrobenchmarkScope>。(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 变更

  • 使滚动宏基准测试能够回溯到 API 23 运行。(If39c2b/183129298
  • 向 UI 和 JSON 输出添加了新型采样指标,重点关注每次迭代多个采样的百分位数。(I56247b/199940612
  • 在整个基准库中切换到浮点指标(在 Studio UI 中截断)。(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 运行 MacroBenchmarks。(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 parcelables。(I5a6f5b/192009149

Bug 修复

  • 降低热节流检测的激进程度,并在频繁检测到节流时重新计算基线。(I7327b
  • 修复了 FrameTimingMetric 在 Android S beta 上无法工作的问题。(Ib60ccb/193260119
  • 使用 EmptyActivity 使目标应用脱离强制停止状态,以更好地支持 CompilationMode.BaselineProfile。(Id7cacb/192084204
  • 将跟踪文件扩展名更改为 .perfetto-trace 以匹配平台标准。(I4c236b/174663039
  • StartupTimingMetric 现在输出“fullyDrawnMs”指标,用于测量直到您的应用程序完成渲染的时间。要为您的应用定义此指标,请在初始内容准备就绪时调用 Activity.reportFullyDrawn,例如当您的初始列表项从数据库或网络加载时。(ComponentActivity 上无需构建版本检查即可使用 reportFullyDrawn 方法)。请注意,您的测试必须运行足够长时间才能捕获此指标(startActivityAndWait 不会等待 reportFullyDrawn)。(If1141b/179176560
  • 将 UI 元数据附加到跟踪的成本降低 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 日

基准测试版本 1.1.0-alpha02 带来了基准测试的一个重要组成部分 - Macrobenchmark。除了 benchmark 允许您测量 CPU 循环外,macrobenchmark 允许您测量整个应用程序的交互,如启动和滚动,并捕获跟踪。有关更多信息,请参阅库文档

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

新功能

添加了宏基准工件(androidx.benchmark:benchmark-macro-junit4androidx.benchmark:benchmark-macro

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

Bug 修复

  • 解决了 Android 12 上输出目录的 shell 权限问题(注意 - 可能需要将 Android Gradle Plugin 更新到 7.0.0 canary 版本,并将 Android Studio 更新到 Arctic Fox (2020.3.1) 版本,才能继续在受影响的设备上捕获输出文件)。(Icb039
  • 支持 BenchmarkPlugin 中的配置缓存(6be1c1b/159804788
  • 简化文件输出 - 默认开启,位于不需要 requestLegacyExternalStorage=true 的目录中。(8b5a4db/172376362
  • 修复了库在没有 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 上为 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 调用基准测试不会直接打印结果。您可以通过在 Studio 中运行或解析 JSON 输出文件来获取结果。
  • 如果设备上安装了 applicationId 以“android”或“download”(不区分大小写)结尾的应用,基准测试报告将无法从设备中拉取报告。遇到此问题的用户应将 Android Gradle Plugin 升级到 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 Plugin 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 Plugin 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 现在标记为实验性

错误修复

  • 修复了时钟锁定脚本的问题,该脚本会在缺少 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 的数据复制的支持,在运行基准测试和使用 AGP 3.6+ 时
  • 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"

错误修复

  • 在 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 报告中,暴露每个基准测试因热节流导致的休眠持续时间

错误修复

  • Gradle 插件不再需要在 Android 插件和 Android 块之后应用
  • 添加了对使用作用域存储的 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
    • 将测试运行上下文信息(例如设备和构建信息以及时钟是否锁定)添加到顶层对象。(b/132711920
    • 时间指标名称现在包含“ns”。(b/132714527
    • 为每个报告的指标添加了额外统计数据(最大值、中位数、最小值),并删除了简化的“nanos”摘要统计数据。(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 已发布。此版本中包含的提交可在此处找到。