基准测试
最新更新 | 稳定版 | 候选发布版 | Beta 版 | Alpha 版 |
---|---|---|---|---|
2024 年 11 月 13 日 | 1.3.3 | - | - | 1.4.0-alpha05 |
声明依赖项
要添加对 Benchmark 的依赖项,必须将 Google Maven 代码库添加到您的项目中。阅读Google 的 Maven 代码库以了解更多信息。
宏基准测试
要在您的项目中使用宏基准测试,请将以下依赖项添加到您的build.gradle
文件(用于您的宏基准测试模块)中
Groovy
dependencies { androidTestImplementation "androidx.benchmark:benchmark-macro-junit4:1.3.3" }
Kotlin
dependencies { androidTestImplementation("androidx.benchmark:benchmark-macro-junit4:1.3.3") }
微基准测试
要在您的项目中使用微基准测试,请将以下依赖项添加到您的build.gradle
文件(用于您的微基准测试模块)中
Groovy
dependencies { androidTestImplementation "androidx.benchmark:benchmark-junit4:1.3.3" } android { ... defaultConfig { ... testInstrumentationRunner "androidx.benchmark.junit4.AndroidBenchmarkRunner" } }
Kotlin
dependencies { androidTestImplementation("androidx.benchmark:benchmark-junit4:1.3.3") } android { ... defaultConfig { ... testInstrumentationRunner = "androidx.benchmark.junit4.AndroidBenchmarkRunner" } }
微基准测试库还提供一个 Gradle 插件,可与您的微基准测试模块一起使用。此插件会为模块设置构建配置默认值,设置基准测试输出复制到主机,并提供 ./gradlew lockClocks
任务。
要使用此插件,请在顶级build.gradle
文件的`plugins`块中包含以下行
Groovy
plugins { id 'androidx.benchmark' version '1.3.3' apply false }
Kotlin
plugins { id("androidx.benchmark") version "1.3.3" apply false }
然后将插件应用于基准测试模块的build.gradle
文件
Groovy
plugins { id 'androidx.benchmark' }
Kotlin
plugins { id("androidx.benchmark") }
反馈
您的反馈有助于改进 Jetpack。如果您发现新的问题或有改进此库的想法,请告知我们。在创建新问题之前,请查看此库中现有问题。您可以通过点击星号按钮为现有问题添加您的投票。
查看问题跟踪器文档以了解更多信息。
1.4 版
1.4.0-alpha05 版
2024 年 11 月 13 日
androidx.benchmark:benchmark-*:1.4.0-alpha05
已发布。1.4.0-alpha05 版包含这些提交。
错误修复
- 修复了 API 34+ 上
CompilationMode.None()
会出现不一致的性能问题,该性能无法代表初始的最坏情况性能。这解决了允许 ART 的编译状态verify
在首次启动后不久部分编译应用(仅影响类加载)的平台更改。(Ie48d0) - 修复了由于 Perfetto 追踪中进程名称被截断,导致可能捕获到(尤其短的)追踪,而这些追踪无法报告内置 Macrobenchmark 指标的测量结果的问题。现在 macrobenchmark 通过在所有内置查询中查找截断的包名(除了预期的包名之外)来解决此问题。请注意,自定义
TraceMetric
实现或PerfettoSession.query
的其他直接调用者可以通过将 Perfetto 查询中的process.name LIKE "$packageName"
更改为(process.name LIKE "$packageName" OR process.name LIKE "$(packageName.takeLast(15))")
来实现相同的行为。(I5bf01,b/377565760)
1.4.0-alpha04 版本
2024年10月30日
androidx.benchmark:benchmark-*:1.4.0-alpha04
已发布。1.4.0-alpha04 版本包含这些提交。
新功能
- (实验性)启用基线配置文件生成,以及对安装到辅助用户的应用进行基准测试,例如任何安装在无头 Android Auto 设备上的应用。此支持已在某些场景中进行测试,但如果它对您不起作用,请告知我们一个错误。(I9fcbe,b/356684617,b/373641155)
错误修复
- 在基准构建中,
isProfileable
现在始终被覆盖,并且在基准构建和nonMinified
(基线配置文件捕获)构建中,isDebuggable
也始终被覆盖。(I487fa,b/369213505) - 修复了在 API 28 之前的某些物理设备上编译检测的问题 - 影响 json
context.compilationMode
,以及androidx.benchmark.requireAot=true
的行为(不再错误地抛出异常)(Ic3e08,b/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 变更
- **Macrobenchmark**: 添加了
ArtMetric
,可用于检查配置文件覆盖率或一般的 Android 运行时性能。捕获 JIT、类初始化(如果可用)和类验证的数量和总持续时间。此外,更改CaptureInfo
以包含可选的 ART 主线版本(默认为空)。(I930f7) - 将
coefficientOfVariation
添加到基准 JSON 输出中,以显示给定基准运行中的稳定性。(Ib14ea)
错误修复
- 修复了当 AVD 设备包含空格时
CollectBaselineProfileTask
的问题。(Ia0225,b/371642809) - 针对
StartupMode.COLD
异常的错误进行了推测性修复:Package <packagename> must not be running prior to cold start!
。现在,MacrobenchmarkScope.killProcess()
(包括在每次迭代之前运行的一个,用于实现StartupMode.COLD
行为)将等待以验证应用程序的所有进程都已停止运行。(I60aa6,b/351582215) - 修复了在某些已 root 的模拟器上显示 UNLOCKED_ 错误的问题。(Ic5117)
- 此库现在使用JSpecify 空值注释,它们是类型使用。Kotlin 开发人员应使用以下编译器参数来强制执行正确的用法:
-Xjspecify-annotations=strict
,-Xtype-enhancement-improvements-strict-mode
(I7104f,b/326456246)
1.4.0-alpha02 版本
2024年10月2日
androidx.benchmark:benchmark-*:1.4.0-alpha02
已发布。1.4.0-alpha02 版本包含这些提交。
API 变更
- 将 Gradle 任务
lockClocks
和unlockClocks
移动到基准项目上,而不是在顶层可用。此更改是必要的,因为不幸的是,没有办法将这些注册为顶级操作而不会破坏项目隔离。(I02b8f,b/363325823)
错误修复
BaselineProfileRule
现在通过在块结束时向每个正在运行的进程发出信号以转储配置文件来收集多进程应用程序的配置文件。如果基于配置文件的编译从未成功找到要广播到的进程,则编译将失败,因为在其中包含配置文件数据是不正常的。此外,还添加了一个 instrumentation 参数来控制转储等待持续时间:androidx.benchmark.saveProfileWaitMillis
(I0f519,b/366231469)- 来自基准
1.3.2
:修复了 Firebase Test Lab (FTL) 无法从基线配置文件 Gradle 插件中提取基线配置文件或 Macrobenchmark 结果文件的问题。(I2f678,b/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 版本包含这些提交。
新功能 - 应用启动分析
- 可在 Macrobenchmark 中启用应用启动分析的初始版本。(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) - 更改性能事件启用逻辑,使其在 API 23+ 上运行。(2550048)
API 变更
- 将现有的实验性
PerfettoConfig
参数移动到新的ExperimentalConfig
对象中。
错误修复
- 增加
lockClocks.sh
重试次数。(99e9dac) - 如果存在,则不创建
nonMinified
和基准构建类型。由于一个错误,即使存在nonMinified
和基准构建类型,它们也会被重新创建。(e75f0a5) - 忽略
TraceSectionMetric
结果中的非终止切片。(a927d20) - 改进模拟器检查以考虑
sdk_
前缀。(1587de8) - 在
FrameTimingGfxInfoMetric
中将未运行的包视为已清除。(35cc79c) - 修复
androidx.benchmark.cpuEventCounter
为非指令事件生成损坏的值的问题。(06edd59) - 修复
resumeTiming/runWithTimingDisabled
以尊重指标优先级顺序,并显著减少低优先级指标暂停/恢复对高优先级指标结果的影响。例如,如果使用cpuEventCounter.enable
instrumentation 参数通过 cpu 性能计数器,则当发生暂停/恢复时,timeNs 将不再显著减少。(5de0968)
1.3 版本
1.3.3 版本
2024年10月16日
androidx.benchmark:benchmark-*:1.3.3
已发布。1.3.3 版本包含这些提交。
错误修复
- 修复了当 AVD 设备包含空格时
CollectBaselineProfileTask
的问题 (Ia0225,b/371642809)
1.3.2 版本
2024年10月2日
androidx.benchmark:benchmark-*:1.3.2
已发布。1.3.2 版本包含这些提交。
错误修复
- 修复了 Firebase Test Lab (FTL) 无法从基线配置文件 Gradle 插件中提取基线配置文件或 Macrobenchmark 结果文件的问题。(I2f678,b/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 版本包含这些提交。
错误修复
- 添加了 Gradle 属性
androidx.baselineprofile.suppressWarnings
用于抑制所有基线配置文件警告 (I7c36e,b/349646646) - 修复了基线配置文件 Gradle 插件,使其使用应用创建的现有
nonMinified…
和benchmark…
,而不是创建包装器。( Ia8934,b/361370179) - 修复了在模拟器上启用
automaticGenerationDuringBuild
时出现的java.lang.AssertionError: ERRORS (not suppressed): EMULATOR
错误。现在使用新的参数来跳过测试。( If3f51,b/355515798) - 微基准测试代码混淆 - 保留基准库 Proguard 中
org.junit.runner.notification.RunListener
的子类 (Ic8ed5,b/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 以防止死代码消除 (If6812,b/286091643)
- 指标
- 实验性 CPU 事件计数器功能(来自
perf_event_open
的指标,这在大多数平台版本上都需要 root 权限),通过InstrumentationArgument
androidx.benchmark.cpuEventCounter.enable
访问(可以设置为true
),并且可以将androidx.benchmark.cpuEventCounter.events
设置为例如 (Instructions,CpuCycles
)。这应该在某些 userdebug 模拟器上受支持,但尚未在所有可用模拟器上测试支持。
- 实验性 CPU 事件计数器功能(来自
自 1.2.0 版本以来的宏基准测试更改
- 宏基准测试的方法跟踪全面改进。
- 现在,方法跟踪的范围限定为
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.deviceSupportsHighPrecisionTracking
、PowerMetric.deviceBatteryHasMinimumCharge()
和PowerMetric.deviceSupportsPowerEnergy()
- 将
Metric.getResult
重命名为getMeasurements
以匹配返回类型。 - 向所有启动检测失败添加了 log.w/异常标签。这不会更改当前行为(因此某些错误会抛出,而其他错误则会默默地无法检测到启动),只是使其更容易理解。通常,
Log.w()
并无法报告启动指标的那些是缺少非帧事件的情况,除了帧计时信息(来自 UI/RT 片段)外,在检测到启动时会抛出异常。( Id240f,b/329145809) - 向
FrameTimingMetric
添加了frameCount
测量值,以帮助发现由于生成的帧数发生变化而导致测量值发生变化的情况(添加了新的动画,修复了无效问题)。( 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。
- 确保
mergeArtProfile
和mergeStartupProfile
任务始终等待基线配置文件生成。( 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 tag 追踪。这会捕获例如唤醒锁追踪点。(Icfe44,b/286551983)
- 增加了追踪捕获启动超时时间,以避免在较慢的设备上启动追踪时发生崩溃(I98841,b/329145808)
- 添加了公共 API
PerfettoTraceProcessor.Session.queryMetrics
,包含 JSON、textproto 和 proto 二进制(未解码)变体。这些允许您查询内置于TraceProcessor
中的指标(I54d7f,b/304038382) - 在 Perfetto 追踪记录上启用阻塞启动,以降低在追踪开始时丢失数据的风险。仅在 API 33+ 上支持。(Ie6e41,b/310760059)
- JSON 输出
- 在 JSON 输出的基准测试上下文中添加了其他信息
context.artMainlineVersion
- Art 主线模块的整数版本(如果设备上存在,则为-1
)context.build.id
- 等于 android.os.Build.IDcontext.build.version.codename
- 等于 android.os.Build.VERSION.CODENAMEcontext.build.version.abbreviatedCodename
- 对应于预发行代号的第一个字母(包括正式版本)(Ie5020)
- 添加了
profilerOutput
列表到 JSON 输出,以便于围绕性能分析追踪(例如 Perfetto、方法追踪)进行工具处理(I05ddd,b/332604449) - 在基准模块中使用 Android 测试编排器时添加了警告,因为这会导致每个模块的输出 JSON 文件被重复覆盖。(Ia1af6,b/286899049)
- 当文件名超过 200 个字符时抛出异常,以避免在写入或后期处理文件时出现不明确的崩溃。(I4a5ab)
- 在 JSON 输出的基准测试上下文中添加了其他信息
1.3.0-rc01 版
2024 年 8 月 7 日
androidx.benchmark:benchmark-*:1.3.0-rc01
已发布。1.3.0-rc01 版包含 这些提交。
错误修复
- 修复了
androidx.benchmark.cpuEventCounter
为非指令事件生成损坏值的问题(I7386a,b/286306579) - 修复了
resumeTiming
/runWithTimingDisabled
以遵守指标优先级顺序,并大幅减少低优先级指标暂停/恢复对高优先级指标结果的影响。例如,如果通过cpuEventCounter.enable
检测参数使用 cpu 性能计数器,则当发生暂停/恢复时,timeNs 将不再大幅减少。(I39c2e,b/286306579,b/307445225) - 通过将堆栈采样转换移出主线程,减少了堆栈采样导致
measureRepeatedOnMainThread
达到主线程硬超时概率。(I487a8,b/342237318) - 移除了对新平台 API 的手动轮廓访问,因为在使用 R8 和 AGP 7.3 或更高版本(例如 R8 3.3 版)以及在使用 AGP 8.1 或更高版本(例如 D8 8.1 版)的所有构建中,这将通过 API 建模自动发生。建议不使用 AGP 的客户端更新到 D8 8.1 或更高版本。有关详细信息,请参阅 这篇文章。(I9496c,b/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 以防止在微基准测试中消除死代码。(If6812,b/286091643) - 微基准测试现在将正确抛出异常以防止方法追踪干扰测量。当方法追踪被强制启用(通过检测参数或
MicrobenchmarkConfig
),并且在方法追踪后尝试进行测量时,这会在某些设备上发生。受影响的设备运行的是 API 26-30 或某些受此干扰影响的 ART 主线模块版本,并且可以通过ProfilerConfig.MethodTracing.affectsMeasurementOnThisDevice
在运行时检测到。(Iafb92,b/303660864)
错误修复
- 将推荐的最大 agp 版本提升至 9.0.0-alpha01。(I5bbb0)
- 将编译模式添加到基准测试上下文(If5612,b/325512900)
- 默认启用 AIDL 追踪(需要 API 28)(Ia0af2,b/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.sampleDurationSeconds
(Ib1d53) - 将宏到通用依赖项更改为
api()
,以便更容易使用例如PerfettoTrace
和PerfettoConfig
。(Icdae3,b/341851833) - 确保
mergeArtProfile
和mergeStartupProfile
任务始终等待基线配置文件生成。(I623d6,b/343086054) - 在决定是否应启用变体时考虑变体的启用状态。(I5d19e,b/343249144)
- 增加了 Perfetto 追踪处理器的默认启动超时时间。(I87e8c,b/329145808)
1.3.0-alpha05 版
2024 年 5 月 14 日
androidx.benchmark:benchmark-*:1.3.0-alpha05
已发布。1.3.0-alpha05 版包含 这些提交。
错误修复
- 当宏基准指标对所有迭代返回零值时,抛出更清晰的异常(Iab58f,b/314931695)
- 向微基准 ProGuard 规则中添加了其他解决方法规则,包括对侦听器规则和其他观察到的警告/错误的支持。(I14d8f,b/329126308,b/339085669)
- 方法追踪在宏基准测试期间作为单独阶段运行,并且不再影响测量。(If9a50,b/285912360,b/336588271)
- 添加了额外的调试建议以删除着色器广播失败消息。(I5efa6,b/325502725)
1.3.0-alpha04 版
2024 年 5 月 1 日
androidx.benchmark:benchmark-*:1.3.0-alpha04
已发布。1.3.0-alpha04 版包含 这些提交。
API 变更
- 添加了实验性的
MacrobenchmarkRule#measureRepeated
变体,该变体采用自定义的PerfettoConfig
来实现完全自定义的 Perfetto 追踪记录。请注意,配置不正确的配置可能会导致内置的指标类失败。(Idfd3d,b/309841164,b/304038384) - 为了清晰起见,将
PowerMetric.deviceSupportsPowerEnergy
重命名为PowerMetric.deviceSupportsHighPrecisionTracking
(I5b82f) - 添加了
PowerMetric.deviceBatteryHasMinimumCharge()
和PowerMetric.deviceSupportsPowerEnergy()
,以便根据设备电源测量能力更改或跳过基准测试。(I6a591,b/322121218)
错误修复
- 添加了与之前的基线配置文件的比较(I824c8,b/269484510)
- 添加了用于禁用警告的 DSL(Ic4deb,b/331237001)
- 禁用基准测试变体时,将异常更改为信息日志(I8a517,b/332772491)
- 简化了捕获宏基准测试方法跟踪的过程,使其范围限于实际
measureBlock()
的持续时间。之前,它从目标进程启动开始,并且仅支持冷启动(Iee85a,b/300651094) - 避免在 Perfetto 追踪处理器启动缓慢时崩溃(I98841,b/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 中内置的指标(I54d7f,b/304038382) - 将
profilerOutput
添加到 JSON 输出中,以便于围绕分析追踪(例如 perfetto、方法追踪)进行工具化。(I05ddd,b/332604449) - 将电源标签添加到基准测试 Perfetto 配置中。这会捕获例如唤醒锁追踪点。(Icfe44,b/286551983)
- 添加了 inst 参数
androidx.benchmark.profiling.skipWhenDurationRisksAnr
,可以将其设置为 false 以避免在预期持续时间可能导致 ANR 时跳过方法跟踪 - 强烈建议在 CI 运行中避免这样做。 - 添加了实验性 inst 参数
androidx.benchmark.profiling.perfCompare.enable
,将其设置为 true 以运行测量阶段和分析阶段之间的比较计时。例如,在评估方法跟踪的开销时很有用。(I61fb4,b/329146942)
API 变更
- 将
TraceSectionMetric.Mode
更改为密封类,以便在不破坏详尽的 when 语句的情况下进行未来的扩展(I71f7b) - 添加了
TraceSectionMetric.Mode.Average
和.Count
,并重新排序了参数,使更常用的参数 (mode) 在参数列表中更靠前,减少了指定参数名称的需求。(Ibf0b0,b/315830077,b/322167531) - 将
Metric.getResult
重命名为getMeasurements
以匹配返回类型(I42595)
错误修复
- 修复以确保基准测试在
automaticGenerationDuringBuild
关闭时使用生成的基线配置文件(Ic144f,b/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)
- 向
FrameTimingMetric
添加了frameCount
测量值,以帮助发现由于生成的帧数发生变化而导致测量值发生变化的情况(添加了新的动画,修复了无效问题)。( I1e5aa) - 文档中阐明了
frameOverrunMs
是首选指标(如果可用),并解释了原因。(I18749,b/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 缩小/优化,这将导致性能显著提高,具体取决于工作负载。(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
,以便主线程基准测试(例如触摸视图或 Compose UI 的基准测试)可以避免触发 ANR,尤其是在 CI 中的大型套件期间。(I5c86d) - 添加了
FrameTimingGfxInfoMetric
,这是FrameTimingMetric
的实验性替代实现,其测量值直接来自平台,而不是从 Perfetto 追踪中提取。(I457cb,b/322232828) - 添加了在单个
warmUp
迭代期间转储 ART 配置文件的能力。(I17923) TraceSectionMetric
API 的一些更改- 添加
Mode.Min
,Mode.Max
- 添加标签参数以覆盖节名称作为指标标签
- 将模式名称添加到输出中以阐明指标含义
- 将默认值更改为 sum,因为此指标的大多数用途都是针对重复事件。请注意 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线程上的方法跟踪耗时超过几秒钟时,跳过该跟踪,并在抛出异常时清理方法跟踪。(I6e768)
- 当文件名超过 200 个字符时抛出异常,以避免在写入或后期处理文件时出现不明确的崩溃。(I4a5ab)
- 修复了跟踪开始和结束处未终止的帧可能被配对在一起的问题,这会导致错误地报告为单个极长的帧。(I39353, b/322232828)
- 在 API 30+ 上重新安装 API 30-33 的包时,使用
--skip verification
清除用户构建上的 ART 配置文件。这有助于绕过在某些类型的设备上导致失败的 Play Protect 警告。(Ic9e36) - 当非系统应用(如系统 UI 或启动器)时,使用
am force-stop
终止应用。(I5e028) - Macrobenchmark 现在等待
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) - 当非系统应用(如系统 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 版本包含这些提交。
错误修复
- 当 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 版本包含这些提交。
基线配置文件
- 执行日志将基线配置文件输出路径显示为本地文件 URI (aosp/2843918, aosp/2853665, b/313976958)
1.2.1 版本
2023年11月15日
已发布androidx.benchmark:benchmark-*:1.2.1
。1.2.1 版本包含这些提交。
新功能
- 改进了用户禁用测试变体时的错误消息(b/307478189)
- 添加了属性以支持 AS 测试运行集成(b/309805233),(b/309116324)
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+ 上的基线配置文件收集问题(Id1392, b/277645214)
宏基准测试
- 编译
- Macrobenchmark 现在可以正确地完全重置每次编译的编译状态——这需要在 Android 14 之前重新安装 APK,因此如果您希望在正在衡量的对象中保留状态(如用户登录),强烈建议在 Android 14+ 上进行基准测试。
- 您还可以通过单独控制应用程序编译并使用
CompilationMode.Ignore()
或检测参数跳过编译来解决此问题
检测参数
- 支持
androidx.benchmark.dryRunMode.enable
检测参数(已在微基准测试中可用),用于更快速的验证运行(例如,在创建基准测试时或在预提交时) - 支持
androidx.benchmark.profiling.mode=StackSampling
和MethodTracing
。 - 添加了
androidx.benchmark.enabledRules
以允许运行时过滤基线配置文件与宏基准规则测试 - 添加了
androidx.benchmark.perfettoSdkTracing.enable
参数以启用使用 tracing-perfetto 进行跟踪,例如 Compose 重新组合跟踪。请注意,当与StartupMode.COLD
一起使用时,由于跟踪库是在应用程序启动期间加载和启用的,因此计时将受到显着影响。
- 支持
需求
- Macrobenchmark 现在需要目标应用程序中版本 1.3.0 或更高的
ProfileInstaller
,以启用配置文件捕获/重置和着色器缓存清除。
- Macrobenchmark 现在需要目标应用程序中版本 1.3.0 或更高的
新的实验性指标 API
- 添加了实验性的
TraceSectionMetric
,它允许从应用程序中的trace("") {}
块提取简单的计时,或TraceMetric 以利用 PerfettoTraceProcessor
的完整查询功能。 - 添加了实验性的
PowerMetric
以捕获功耗信息 - 添加了实验性的
MemoryCountersMetric
以计算缺页错误 - 添加了实验性的
PerfettoTraceProcessor
API,它在内部用于从系统跟踪(即 Perfetto 跟踪)中提取指标
- 添加了实验性的
修复
- 修复了从多个 APK 安装的应用程序(例如,来自应用程序包)安装或提取配置文件时发生的崩溃问题。
- 修复了
FrameTimingMetric
忽略帧 ID 不一致的帧(通常是 API 31+ 上的涟漪期间的帧)的问题(I747d2, b/279088460) - 修复了大于 64MB 的跟踪的解析错误(Ief831, b/269949822)
- 阐明了设备(尤其是模拟器)操作系统映像未正确配置进行跟踪或编译时的错误
- 跳过对没有电池的设备的电池电量检查(微型和宏型)
- 改进了文件输出,更清晰地显示了无效输出目录的错误,并提供了更安全的默认值
- 通过始终丢弃着色器缓存,提高了
StartupMode.COLD
的稳定性(也通过MacrobenchmarkScope.dropShaderCache
公开) - 修复了
startActivityAndWait
的 Leanback 回退。
微基准测试
- 功能
- 分析已移至单独的阶段,位于其他指标之后,因此一个测试运行可以同时显示准确的计时和分析结果。
- 实验性 API
- 添加了实验性的
MicrobenchmarkConfig
API,用于定义自定义指标和配置跟踪和分析。可用于捕获方法跟踪或捕获跟踪点(但请注意跟踪开销)。 - 添加了实验性 API,用于分别控制
BenchmarkState
与BenchmarkRule
,无需 JUnit - 添加了实验性的
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 插件无法看到它们。(I8dbcc, b/303034735, b/296453339) - 阐明了将
tracing-perfetto
从宏基准模块注入目标应用程序时出现的加载错误消息。
1.2.0-rc01 版本
2023年9月20日
已发布androidx.benchmark:benchmark-*:1.2.0-rc01
。1.2.0-rc01 版本包含这些提交。
错误修复
- 当 Perfetto SDK 跟踪无法在基准测试中初始化时,现在会抛出一个异常(包含补救说明)。(I6c878, b/286228781)
- 修复了将 ART 方法追踪转换为 Perfetto 格式时的 OOM 崩溃问题。(I106bd,b/296905344)
- (宏基准测试)在 Studio 测试输出中阐明了方法追踪标签,并修复了方法追踪文件名在设备/主机上不唯一的问题,因此在运行多个基准测试时不会被覆盖。(I08e65,b/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
过滤到仅目标包,默认启用。(Ia219b,b/292208786)
错误修复
- 为了与工件名称和其他引用保持一致,将
fullTracing.enable
检测参数重命名为perfettoSdkTracing.enable
。fullTracing.enable
将继续作为后备方案使用。(I7cc00) - 基准库内部跟踪点(包括微基准循环/阶段跟踪)现在将显示在 Studio 系统跟踪查看器中,并在 Perfetto 中嵌套在正确的进程下。(I6b2e7,b/293510459)
- 删除了 API 31+ 上的宏基准测试不可分析错误,并在 eng/userdebug 根设备上跳过可分析性检查。(I2abac,b/291722507)
- 使用 Dex 布局优化时,启动配置文件规则现在也作为基线配置文件规则。(aosp/2684246,b/293889189)
1.2.0-beta02 版本
2023 年 7 月 26 日
androidx.benchmark:benchmark-*:1.2.0-beta02
已发布。1.2.0-beta02 版本包含这些提交。
API 变更
- 添加了用于微基准自定义指标和配置(例如分析器和跟踪)的实验性 API。(I86101,b/291820856)
错误修复
- 在操作系统配置错误导致跟踪失败时,宏基准测试会报告错误,此问题最近在 API 26/28 ARM64 模拟器中已修复。(I0a328,b/282191686)
- 在编译重置失败时添加了详细信息,建议更新模拟器,因为某些模拟器最近已修复此问题。(I8c815,b/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 中基准测试输出中警告有时被抑制的问题,并解决了 Studio 中基准测试输出中的前导空格无法显示的问题。(Ia61d0,b/227205461,b/286306579,b/285912360)
- 修正了
FrameTimingMetric
的注释。子指标名为frameDurationCpuMs
。(Ib097f,b/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
。(I7ad37,b/285912360) - 微基准测试分析已移至单独的阶段,因此它在测量之后按顺序执行,而不是替换它。
MethodTracing
跟踪部分现在也包含在捕获的 Perfetto 跟踪中(如果存在)。(I9f657,b/285014599) - 使用
Mode.Sum
向TraceSectionMetric
添加计数测量。(Ic121a,b/264398606)
1.2.0-alpha15 版本
2023 年 6 月 7 日
androidx.benchmark:benchmark-*:1.2.0-alpha15
已发布。1.2.0-alpha15 版本包含这些提交。
新功能
- 添加了用于跟踪目标应用程序内存用量的实验性
MemoryUsageMetric
。(I56453,b/133147125,b/281749311) - 使用
PerfettoTrace.record
支持完全自定义的 Perfetto 配置。(If9d75,b/280460183) - 添加了跳过基线配置文件生成的属性。使用方法:
./gradlew assemble -Pandroidx.baselineprofile.skipgeneration
。(I37fda,b/283447020)
API 变更
collectBaselineProfile
API 始终生成稳定的基线配置文件。collectStableBaselineProfile
API 已删除,应改用collectBaselineProfile
。(I17262,b/281078707)- 将
BaselineProfileRule
的filterPredicate
参数更改为非空,并使用等效的默认值,以便在文档中更清晰地说明默认过滤行为。(I3816e)
错误修复
- 在
dryRunMode
中禁用IsolationActivity
和 Perfetto 跟踪以显著提高性能,因为这些是大部分运行时。(Ie4f7d) - 使用检测测试参数
androidx.benchmark.profiling.mode=StackSampling
和androidx.benchmark.profiling.sampleFrequency
支持宏基准测试中的调用堆栈采样。(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)
- 修复了由于
pm dump-profiles
命令的输出不同而导致 Android U 上的基线配置文件生成失败的问题。(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 跟踪支持,其中包括微基准测试和实验性
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 版本包含这些提交。
错误修复
- 修复了在使用包含多个 APK 的应用包重新安装或提取配置文件时,
MacrobenchmarkRule
和BaselineProfileRule
中的崩溃问题。(I0d8c8,b/270587281)
1.2.0-alpha10 版本
2023 年 2 月 22 日
已发布 androidx.benchmark:benchmark-*:1.2.0-alpha10
。1.2.0-alpha10 版本包含这些提交。
新功能
- 在 Android 14 及更高版本上,宏基准测试不再重新安装目标应用程序以重置编译状态,这要归功于新的平台功能。以前,需要一个已 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
instrumentation 参数以禁用所有基准测试/基线配置文件生成。(I3d7fd,b/258671856) - 修复了应用模块(即非自检测测试 APK)中的
PerfettoTrace
捕获问题。(I12cfc) - 修复了 Studio 输出中基线配置文件 adb pull 参数的顺序问题。(I958d1,b/261781624)
- 现在在尝试运行宏基准测试时,会正确识别 Arm 模拟器 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)
- 修复了 API <=23 上的几个 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。(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 要求,因为TraceSectionMetric
与androidx.tracing.Trace
一同工作,回溯到较低的 API 级别,并使用目标应用程序中的forceEnableAppTracing
。(Id7b68,b/231455742)
错误修复
- 通过验证所有输出/错误,提高了所有内部 shell 命令的安全性。(I5984d,b/255402908,b/253094958)
- 在基线配置文件
adb pull
命令中指定设备,以便如果连接了多个设备(最多一个模拟器),可以简单地复制 pull 命令。(I6ac6c,b/223359380) - 如果宏基准测试 apk 未设置为自检测,则会添加错误。此错误可防止从目标应用程序的进程中进行宏基准测试。在进程中,宏基准测试将无法编译/终止/冷启动应用程序,也无法控制其自身的权限。(I4279b)
- 修复了
measureRepeated()
中的一个问题,其中StartupMode.COLD
在setupBlock
之后不会终止目标进程。现在,与应用程序交互的setupBlock
将不会留下正在运行的应用程序进程,以及无效的冷启动测量。(I8ebb7)
1.2.0-alpha06 版本
2022 年 10 月 24 日
已发布 androidx.benchmark:benchmark-*:1.2.0-alpha06
。1.2.0-alpha06 版本包含这些提交。
API 变更
BaselineProfileRule
在 Android 13 (API 33) 上不再需要 root 权限,并且不再是实验性的。(Ie0a7d,b/250083467,b/253094958)- 此更改还修复了如何在未 root 设备上将来自应用程序的配置文件刷新到磁盘,但这需要更新目标应用程序的 profileinstaller 依赖项。
- 要在未 root 设备上使用
BaselineProfileRule
或CompilationMode.Partial(warmupIterations)
,还必须将目标应用程序更新为使用androidx.profileinstaller.profileinstaller:1.3.0-alpha01
。这将启用将配置文件正确刷新到磁盘,以便可以编译/提取它。
错误修复
- 修复了 API 33+ 上
SampledProfiling
崩溃的问题。(I40743,b/236109374)
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
instrumentation 参数的支持(微基准测试中已可用),以便更快地进行本地开发和验证应用程序自动化(例如,在预提交中)。这会将迭代次数覆盖为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()
启动测量的Activity。这意味着该指标可以捕获来自例如通知、Context.startActivity()
、应用内基于Activity的导航或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
(与BenchmarkRule
/JUnit4
分离)的实验性API。(Id478f,b/228489614)
错误修复
- 为
startActivityAndWait
添加了Leanback后备方案。(01ed77,b/242899915)
1.2.0-alpha02版本
2022年8月24日
发布了androidx.benchmark:benchmark-*:1.2.0-alpha02
。1.2.0-alpha02版本包含这些提交。
API 变更
- 即使已root,也默认对
MacrobenchmarkScope.killProcess()
使用am force stop
,但在生成基线配置文件期间除外。这可以通过可选的布尔参数来覆盖。(02cce9,b/241214097)
错误修复
- 支持为系统应用生成基线配置文件。(I900b8,b/241214097)
- 支持在未root的设备上检查ODPM功耗指标。(a38c78,b/229623230)
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
instrumentation 参数,以启用将宏基准测试运行过滤为仅基准测试或仅基线配置文件生成。例如,仅在模拟器上生成BaselineProfiles
时,传入“Macrobenchmark”或“BaselineProfile”即可只运行一种类型的测试。也支持逗号分隔的列表。(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) - 添加了
TotalPowerMetric
和TotalEnergyMetric
,用于测量宏基准测试中每个系统类别中的总功率和能量。(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版本以来的重要更改
支持基线配置文件
CompilationMode.Partial
用于测量基线配置文件的有效性。@BaselineProfileRule
用于自动为给定的关键用户旅程生成基线配置文件。
支持微基准测试运行期间的分配指标和分析。
1.1.0-rc03版本
2022年6月1日
发布了androidx.benchmark:benchmark-*:1.1.0-rc03
。1.1.0-rc03版本包含这些提交。
错误修复
避免在每次基准测试迭代中重新安装目标包。(aosp/2093027,b/231976084)
从
pressHome()
中删除了300ms
延迟。(aosp/2086030,b/231322975)通过优化底层使用的Shell命令来提高宏基准测试迭代速度。(aosp/2086023,b/231323582)
在使用宏基准测试生成基线配置文件时,支持托管Gradle设备。(aosp/2062228,b/228926421)
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
instrumentation 参数,可以使宏基准测试和基线配置文件生成测试之间共享模块。例如,仅在模拟器上生成BaselineProfiles
时,传入“Macrobenchmark”或“BaselineProfile”即可只运行一种类型的测试。(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版本包含这些提交。
错误修复
- 使用
CompilationMode.None
跳过配置文件安装后,结束程序包。(aosp/1991373) - 修复了使用
StartupMode.COLD
时,宏基准测试无法收集启动指标的问题。(aosp/2012227 b/218668335)
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.Trace
或androidx.tracing
Jetpack API),以避免影响结果。此跟踪应该有助于诊断不稳定性,特别是来自基准测试之外的来源。(I298be, b/205636583, b/145598917) - 将
CompilationModes
明确分为三类 - 完全、无、部分。以前,它们的名字与编译参数(我们现在将其视为实现细节)和功能不一致。这使得跨平台版本的权衡、潜在组合和行为更加清晰。(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)
- 通过切换到紧凑的调度存储格式,将跟踪大小减少约40%。(Id5fb6, b/199324831)
- 更新了启动指标的实现,使其始终在渲染线程结束时结束。这将使跨平台版本更加一致,并且更贴近应用内测量。(Ic6b55)
1.1.0-alpha11版本
2021年11月3日
发布了androidx.benchmark:benchmark-*:1.1.0-alpha11
。1.1.0-alpha11版本包含这些提交。
API 变更
- 宏基准测试的
minSdkVersion
现在为23
。(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)
- 为Java调用者向多个MacrobenchmarkScope方法添加了JvmOverloads。(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版本包含这些提交。
错误修复
- 支持在API 31/S+上无需ROOT即可丢弃内核页面缓存,这将提高StartupMode.COLD启动的准确性。(Iecfdb, b/200160030)
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 级别。当前支持的最低 API 继续通过 RequiredApi() 传达,当前为 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 秒,代价是不再支持 Intent Parcelable。(I5a6f5,b/192009149)
错误修复
- 降低热限制检测的积极性,如果频繁检测到限制,则重新计算基线。(I7327b)
- 修复 FrameTimingMetric 以使其在 Android S Beta 上运行。(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 版本包含以下提交。
新功能
- 添加了一个新的
CompilationMode.BaselineProfile
来支持使用 Jetpack ProfileInstaller 库 安装的配置文件。(aosp/1720930)
错误修复
用于抑制基准错误的示例 Gradle 代码已更新为使用非弃用的 API,该 API 的语法也支持 .gradle.kts 用户。
例如:
testInstrumentationRunnerArguments["androidx.benchmark.suppressErrors"] = "EMULATOR,LOW-BATTERY"
1.1.0-alpha02 版本
2021 年 5 月 18 日
基准测试 1.1.0-alpha02 版本带来了一个重要的基准测试组件 - Macrobenchmark。除了允许您测量 CPU 循环的 *benchmark* 之外,*macrobenchmark* 还允许您测量整个应用程序的交互(例如启动和滚动),并捕获跟踪。有关更多信息,请参阅 库文档。
已发布 androidx.benchmark:benchmark-*:1.1.0-alpha02
。 1.1.0-alpha02 版本包含以下提交。
新功能
添加了 Macrobenchmark 工件(androidx.benchmark:benchmark-macro-junit4
和 androidx.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-alpha01
、androidx.benchmark:benchmark-gradle-plugin:1.1.0-alpha01
和 androidx.benchmark:benchmark-junit4:1.1.0-alpha01
。 1.1.0-alpha01 版本包含以下提交。
1.1 版的新功能
- 内存分配指标 - 基准测试现在会在预热和计时后运行一个额外的阶段,捕获内存分配计数。内存分配可能会在较旧版本的平台上导致性能问题(在 O 中为 140ns,在 M 中为 8ns - 在 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
错误。(I64988,b/154248456)
已知问题
- Benchmark 的命令行、Gradle 调用不会直接打印出结果。您可以通过在 Studio 中运行或解析 JSON 输出文件以获取结果来解决此问题。
- 基准测试报告无法从安装了应用程序 ID 以“android”或“download”(不区分大小写)结尾的应用的设备中提取报告。遇到此问题的用户应将 Android Gradle Plugin 升级到 4.2-alpha01 或更高版本。
1.0.0 版本
基准测试版本 1.0.0
2019 年 11 月 20 日
androidx.benchmark:benchmark-common:1.0.0
、androidx.benchmark:benchmark-gradle-plugin:1.0.0
和 androidx.benchmark:benchmark-junit4:1.0.0
版本发布,与 1.0.0-rc01 版本相比没有变化。1.0.0 版本包含这些提交。
1.0.0 版本的主要功能
基准测试库允许您编写应用程序代码的性能基准测试并快速获得结果。
它可以防止构建和运行时配置问题,并稳定设备性能,以确保测量结果准确且一致。运行基准测试 直接在 Android Studio 中,或 在持续集成中,以便观察代码性能随时间的变化,并防止出现回归。
主要功能包括
- 时钟稳定
- 自动线程优先级
- 支持 UI 性能测试,例如在 RecyclerView 示例 中
- 支持 JIT 的预热和循环
- 用于后处理的 JSON 基准测试输出
1.0.0-rc01 版本
2019 年 10 月 23 日
androidx.benchmark:benchmark-common:1.0.0-rc01
、androidx.benchmark:benchmark-gradle-plugin:1.0.0-rc01
和 androidx.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-beta01
、androidx.benchmark:benchmark-gradle-plugin:1.0.0-beta01
和 androidx.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
instrumentation 参数的输出用法,以了解 AGP 何时处理数据复制。 - 修复了 JSON 中未检测到的时钟频率,使其能够正确打印
-1
(b/141945670)。
1.0.0-alpha06 版本
2019 年 9 月 18 日
androidx.benchmark:benchmark-common:1.0.0-alpha06
、androidx.benchmark:benchmark-gradle-plugin:1.0.0-alpha06
和 androidx.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-alpha05
、androidx.benchmark:benchmark-gradle-plugin:1.0.0-alpha05
和 androidx.benchmark:benchmark-junit4:1.0.0-alpha05
版本已发布。此版本中包含的提交可以在这里找到 这里。
API 变更
BenchmarkState.reportData
API 现在被标记为实验性
错误修复
- 修复了时钟锁定脚本,该脚本在缺少
cut
或expr
shell 实用程序的设备上会失败。 - 修复了
./gradlew lockClocks
任务的问题,该任务会在使用旧版 su 实用程序(不支持-c
标志)的已 root 设备上挂起。
1.0.0-alpha04 版本
2019 年 8 月 7 日
androidx.benchmark:benchmark-common:1.0.0-alpha04
、androidx.benchmark:benchmark-gradle-plugin:1.0.0-alpha04
和 androidx.benchmark:benchmark-junit4:1.0.0-alpha04
版本已发布。此版本中包含的提交可以在这里找到 这里。
还添加了有关如何在没有 Gradle 的情况下使用基准测试库的新文档,包括与不同构建系统(例如 Bazel 或 Buck)一起使用的情况,以及在 CI 中运行的情况。有关更多信息,请参阅 在没有 Gradle 的情况下构建基准测试 和 在持续集成中运行基准测试。
新功能
- Gradle 插件
- 现在自动禁用测试覆盖率,并默认设置
AndroidBenchmarkRunner
(b/138374050) - 在运行基准测试和使用 AGP 3.6+ 时,添加了对基于新 AGP 的数据复制的支持
- 现在自动禁用测试覆盖率,并默认设置
- JSON 格式添加
- 输出总基准测试运行时间 (b/133147694)
- 使用名称字符串的
@Parameterized
基准测试(例如@Parameters(name = "size={0},depth={1}")
)现在在 JSON 输出中输出每个基准测试的参数名称和值 (b/132578772)
- 试运行模式 (b/138785848)
- 添加了“试运行”模式,用于仅运行每个基准测试循环一次,以检查错误/崩溃,而无需捕获测量结果。例如,这对于在预提交中快速运行基准测试以检查它们是否未损坏非常有用。
API 变更
- 模块结构已更改,库已拆分 (b/138451391)
benchmark:benchmark-junit4
包含具有 JUnit 依赖项的类:AndroidBenchmarkRunner
和BenchmarkRule
,这两个类都已移至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-alpha03
和 androidx.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-alpha02
和 androidx.benchmark:benchmark-gradle-plugin:1.0.0-alpha02
版本已发布。此版本中包含的提交可以在这里找到 这里。
请注意,我们将 JSON 模式视为 API。我们计划遵循与其他 API 相同的稳定性约束:一旦进入 Beta 版就稳定(非常罕见的例外情况),并在最终版本中修复,仅在次要版本中添加内容,并在主要版本中更改/删除内容。
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
版本已发布。此版本中包含的提交可以在这里找到 这里。