Benchmark
最近更新时间 | 稳定版 | 候选版 | Beta 版 | Alpha 版 |
---|---|---|---|---|
2024 年 11 月 13 日 | 1.3.3 | - | - | 1.4.0-alpha05 |
声明依赖项
如需添加 Benchmark 的依赖项,您必须将 Google Maven 制品库添加到项目中。有关详情,请阅读 Google 的 Maven 制品库。
Macrobenchmark
如需在项目中使用 Macrobenchmark,请将以下依赖项添加到 Macrobenchmark 模块的 build.gradle
文件中:
Groovy
dependencies { androidTestImplementation "androidx.benchmark:benchmark-macro-junit4:1.3.3" }
Kotlin
dependencies { androidTestImplementation("androidx.benchmark:benchmark-macro-junit4:1.3.3") }
Microbenchmark
如需在项目中使用 Microbenchmark,请将以下依赖项添加到microbenchmark 模块的 build.gradle
文件中:
Groovy
dependencies { androidTestImplementation "androidx.benchmark:benchmark-junit4:1.3.0" } android { ... defaultConfig { ... testInstrumentationRunner "androidx.benchmark.junit4.AndroidBenchmarkRunner" } }
Kotlin
dependencies { androidTestImplementation("androidx.benchmark:benchmark-junit4:1.3.0") } android { ... defaultConfig { ... testInstrumentationRunner = "androidx.benchmark.junit4.AndroidBenchmarkRunner" } }
Microbenchmark 库还提供了一个可与 Microbenchmark 模块搭配使用的 Gradle 插件。此插件可设置模块的默认 build 配置,设置将基准输出复制到主机,并提供 ./gradlew lockClocks
任务。
如需使用该插件,请在顶级 build.gradle
文件的“plugins”代码块中添加以下代码行:
Groovy
plugins { id 'androidx.benchmark' version '1.3.0' apply false }
Kotlin
plugins { id("androidx.benchmark") version "1.3.0" apply false }
然后,将该插件应用到基准模块的 build.gradle
文件
Groovy
plugins { id 'androidx.benchmark' }
Kotlin
plugins { id("androidx.benchmark") }
反馈
您的反馈将帮助我们改进 Jetpack。如果您发现了新问题,或对此库有任何改进建议,请告诉我们。创建新问题前,请先查看此库中的现有问题。您可以点击星标按钮,为现有问题投票。
如需了解详情,请参阅问题跟踪器文档。
版本 1.4
版本 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) - 修复了以下问题:由于进程名称在 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 设备上的任何应用)进行基准测试。我们已在某些情况下测试过此支持功能,但如果它不适用于您,请告诉我们并报告 bug。(I9fcbe、b/356684617、b/373641155)
bug 修复
- 现在,基准测试 build 中始终会替换
isProfileable
,基准测试 build 和nonMinified
(基准配置文件捕获)build 中也始终会替换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 RunTime 性能。捕获 JIT、类初始化(如果可用)和类验证的次数和总时长。此外,更改了CaptureInfo
,以便包含可选的 ART Mainline 版本和默认版本。(I930f7) - 将
coefficientOfVariation
添加到基准测试 JSON 输出中,以显示给定基准测试运行中的稳定性。(Ib14ea)
bug 修复
- 修复了当 AVD 设备中包含空格时
CollectBaselineProfileTask
的问题。(Ia0225、b/371642809) - 针对
StartupMode.COLD
异常错误的推测性修复:Package <packagename> must not be running prior to cold start!
。现在,MacrobenchmarkScope.killProcess()
(包括在每次迭代之前运行的用于实现StartupMode.COLD
行为的MacrobenchmarkScope.killProcess()
)将等待,以验证应用的进程是否已全部停止运行。(I60aa6、b/351582215) - 修复了某些已取得 root 权限的模拟器上会显示 UNLOCKED_ 错误的问题。(Ic5117)
- 此库现在使用 JSpecify nullness annotations,即类型使用。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)
bug 修复
BaselineProfileRule
现在会在块结束时向每个正在运行的进程发送信号,以转储配置文件,从而收集多进程应用的配置文件。如果基于配置文件的编译从未成功找到要广播到的进程,则编译将失败,因为其中不应包含配置文件数据。此外,添加了一个插桩参数来控制转储等待时长: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) - Microbench 指标现在在 Perfetto 轨迹中显示为计数器。(3214854)
- 添加了用于停用 JIT(需要 root / 运行时重启)和重置设备性能/测试状态的实验性脚本。这些任务目前未发布为 Gradle 任务。(7c3732b)
- 添加了基准测试参数,以便在模拟器上运行时跳过测试。启用
automaticGenerationDuring
build 后,基准测试还会触发基准配置文件生成。如果使用模拟器,则会失败。使用新参数skipBenchmarksOnEmulator
,我们可以跳过测试。(0c2ddcd) - 将性能事件启用逻辑更改为在 API 23 及更高版本上运行 (2550048)
API 变更
- 将
MacrobenchmarkRule.measureRepeated()
的现有实验性PerfettoConfig
参数移到了新的ExperimentalConfig
对象。
bug 修复
- 增加了
lockClocks.sh
重试次数 (99e9dac) - 请勿创建
nonMinified
和基准测试 build 类型(如果已存在)。由于存在一个 bug,即使nonMinified
和基准 build 类型已存在,系统也会重新创建它们。(e75f0a5) - 忽略
TraceSectionMetric
结果中的非终止 slice。(a927d20) - 改进了模拟器检查,以考虑
sdk_
前缀。(1587de8) - 在
FrameTimingGfxInfoMetric
中将非运行软件包视为已清除。(35cc79c) - 修复了
androidx.benchmark.cpuEventCounter
为非指令事件生成损坏值的问题。(06edd59) - 修复了
resumeTiming/runWithTimingDisabled
,以遵循指标优先级顺序,并显著减少了优先级较低的指标暂停/恢复对优先级较高的指标结果的影响。例如,如果通过cpuEventCounter.enable
插桩参数使用 CPU 性能计数器,则在发生暂停/恢复时,timeNs 不再显著缩短。(5de0968)
版本 1.3
版本 1.3.3
2024 年 10 月 16 日
发布了 androidx.benchmark:benchmark-*:1.3.3
。版本 1.3.3 包含这些提交内容。
bug 修复
- 修复了当 AVD 设备包含空格时
CollectBaselineProfileTask
出现的问题(Ia0225、b/371642809)
版本 1.3.2
2024 年 10 月 2 日
发布了 androidx.benchmark:benchmark-*:1.3.2
。版本 1.3.2 包含这些提交内容。
bug 修复
- 修复了 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 包含这些提交内容。
bug 修复
- 添加了 Gradle 属性
androidx.baselineprofile.suppressWarnings
以抑制所有基准配置文件警告 (I7c36e、b/349646646) - 修复了基准配置文件 Gradle 插件,使其在应用创建
nonMinified…
和benchmark…
时使用现有nonMinified…
和benchmark…
,而不是创建封装容器。(Ia8934、b/361370179) - 修复了在模拟器上启用
automaticGenerationDuringBuild
时java.lang.AssertionError: ERRORS (not suppressed): EMULATOR
的问题。新参数用于跳过测试。(If3f51、b/355515798) - Microbenchmark 缩减 - 在基准库 proguard 中保留
org.junit.runner.notification.RunListener
的子类(Ic8ed5、b/354264743) - 修复了
TraceSectionMetric
,以忽略非终止 slice。以前,这些广告会被视为时长为 -1,例如在求和或查找最短时长时。(If74b7) - 修复了
FrameTimingGfxInfoMetric
中如果进程尚未运行,启动指标会崩溃的问题。(I6e412)
版本 1.3.0
2024 年 8 月 21 日
发布了 androidx.benchmark:benchmark-*:1.3.0
。版本 1.3.0 包含这些提交内容。
自 1.2.0 以来的 Microbenchmark 变更
- 在大多数设备上运行时,微基准测试中的方法跟踪功能默认处于开启状态
- 方法跟踪会在测量后作为单独的阶段运行,这样一来,单次基准测试运行即可输出准确的测量结果和方法轨迹
- 某些 Android OS 和 ART 版本上的方法跟踪会影响后续的衡量阶段 - 在这些版本中,方法跟踪默认处于关闭状态,并且会向 Studio 输出中输出警告
- 主线程基准测试和 ANR
- 为界面线程基准测试(例如与 Compose/View 界面交互的测试)添加了
measureRepeatedOnMainThread
,以避免在运行数秒钟后出现 ANR。 - 如果预计方法轨迹会超出 ANR 避免期限,则会跳过这些轨迹。将
androidx.benchmark.profiling.skipWhenDurationRisksAnr
设为 false 可停用此行为(不建议在 CI 运行时执行此操作,因为 ANR 可能会导致长时间 CI 运行出现问题)。
- 为界面线程基准测试(例如与 Compose/View 界面交互的测试)添加了
- 缩减
- 嵌入了 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 以来的 MACRObenchmark 变更
- 对 Macrobenchmark 的方法跟踪进行了全面改进。
- 现在,方法轨迹的范围限定为
measureBlock
的持续时间,并且如果进程多次启动,则可以捕获多个会话。 - 之前,方法跟踪仅适用于
StartupMode.COLD
基准测试,并且不会捕获未重启目标进程的measureBlocks
的任何内容 - 修复了 macrobenchmark 中的方法轨迹刷新问题,因此即使在速度较慢的设备上,也应能完全捕获有效的方法轨迹。(I6349a、b/329904950)
- 现在,方法轨迹的范围限定为
- 在进程被终止时,在各个
warmUp
迭代期间正确转储 ART 配置文件,以便CompilationMode.Partial(warmup=N)
测量结果更准确。(I17923) - 移除了着色器广播失败消息
- 添加了有关丢弃着色器广播失败消息的调试建议
- 添加了两个插桩参数,用于替换着色器丢弃行为,以解决在对不使用
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 类失败。(Idfd3d、b/309841164、b/304038384) - 请先取消后台 dexopt 作业,然后再运行 Macrobenchmark,以减少干扰。(I989ed)
- Macrobenchmark 现在会等待 1 秒,以便目标应用刷新 ART 配置文件(之前等待 500 毫秒)。(I85a50、b/316082056)
- TraceSectionMetric 全面改进
- 注意:以下
TraceSectionMetric
更改可能会影响 CI 使用中的输出,并可能会导致中断或破坏解析 - 现在,默认值为“总和”,因为此指标的大多数用途都是针对重复事件,而“先”会在这些情况下舍弃数据
- 更具自定义性,提供更多可用模式
- 模式名称现在嵌入在指标输出名称中(在 Studio 和 JSON 中)
- 现在支持使用
Trace.{begin|end}AsyncSection
创建的 Slice。
- 注意:以下
- 指标
- 电源 - 添加了
PowerMetric.deviceSupportsHighPrecisionTracking
、PowerMetric.deviceBatteryHasMinimumCharge()
和PowerMetric.deviceSupportsPowerEnergy()
- 已将
Metric.getResult
重命名为getMeasurements
,以匹配返回类型 - 为所有启动检测失败添加了 log.w / exception 标签。这不会更改当前行为(因此某些错误会抛出,而其他错误会静默地检测不到启动),只是更易于理解。通常,如果应用
Log.w()
且未能报告启动指标,则表示应用缺少非帧事件,并且在检测到启动时会抛出异常(帧时间信息除外,来自界面/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
或基准 build 类型时启用基准配置文件生成和基准测试。(Ib8f05、b/324837887) - 修复了在 AGP 8.3.0-alpha15 之前在 AAR 中添加库基准配置文件的问题。(I1d2af、b/313992099)
- 修复了生成任务结束时基准配置文件和启动配置文件输出网址的问题。(I802e5、b/313976958)
自 1.2.0 以来的其他重大变更
- 轨迹捕获
- 将启动 Perfetto 时的 EXITCODE 2 错误从错误降级为已记录的警告
- 默认在基准测试中启用 AIDL 跟踪(需要 API 28)(Ia0af2、b/341852305)
- 默认在基准测试中启用 Porter 标记跟踪。例如,这会捕获唤醒锁跟踪点。(Icfe44、b/286551983)
- 延长了轨迹捕获开始超时时间,以避免在速度较慢的设备上开始跟踪时发生崩溃(I98841、b/329145808)
- 添加了具有 JSON、textproto 和 proto 二进制(未解码)变体的公共 API
PerfettoTraceProcessor.Session.queryMetrics
API。借助这些 API,您可以查询TraceProcessor
中内置的指标 (I54d7f、b/304038382) - 在 Perfetto 轨迹记录上启用阻塞开始,以降低跟踪记录开头缺少数据的风险。仅在 API 33 及更高版本上受支持。Ie6e41、b/310760059
- JSON 输出
- 在 JSON 输出的基准测试上下文中添加了其他信息:
context.artMainlineVersion
- Art Mainline 模块的整数版本(如果设备上存在,否则为-1
)context.build.id
- 等于 android.os.Build.IDcontext.build.version.codename
- 等于 android.os.Build.VERSION.CODENAMEcontext.build.version.abbreviatedCodename
- 对应于预发布代码名称(包括发布 build)的第一个字母 (Ie5020)
- 向 JSON 输出添加了
profilerOutput
列表,以便更轻松地使用性能分析轨迹工具(例如 Perfetto、方法轨迹)(I05ddd、b/332604449) - 在基准测试模块中使用 Android Test Orchestrator 时添加了一条警告,因为这会导致每个模块的输出 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 包含这些提交内容。
bug 修复
- 修复了
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)搭配使用时,系统会通过 API 建模自动执行此操作;当使用 AGP 8.1 或更高版本(例如 D8 版本 8.1)时,系统会针对所有 build 自动执行此操作。建议不使用 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 包含这些提交内容。
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,以防止在微基准测试中消除无用代码。(If6812、b/286091643) - Microbenchmark 现在会正确抛出,以防止方法跟踪干扰测量。在某些设备上,如果强制启用方法跟踪(通过插桩参数或
MicrobenchmarkConfig
),并且在方法跟踪后尝试进行测量,就会发生这种情况。受影响的设备运行的是 API 26-30 或受此干扰影响的特定 ART Mainline 模块版本,并且可以在运行时通过ProfilerConfig.MethodTracing.affectsMeasurementOnThisDevice
检测到。(Iafb92、b/303660864)
bug 修复
- 将建议的最高 AGP 版本提升至 9.0.0-alpha01。(I5bbb0)
- 向基准测试上下文添加了编译模式 (If5612、b/325512900)
- 默认启用 AIDL 跟踪(需要 API 28)(Ia0af2、b/341852305)
- 在 JSON 输出的基准测试上下文中添加了其他信息:
context.artMainlineVersion
- Art Mainline 模块的整数版本(如果设备上存在,否则为 -1)context.build.id
- 等于android.os.Build.ID
context.build.version.codename
- 等于android.os.Build.VERSION.CODENAME
context.build.version.abbreviatedCodename
- 对应于预发布代码名称的第一个字母(即使在发布 build 中也是如此)(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 包含这些提交内容。
bug 修复
- 当 macrobench 指标针对所有迭代返回零值时,抛出更清晰的异常 (Iab58f、b/314931695)
- 向 microbench ProGuard 规则添加了其他权宜解决方法规则,包括对监听器规则和其他观察到的警告 / 错误的支持。(I14d8f、b/329126308、b/339085669)
- 方法跟踪会在 Macrobenchmark 期间作为单独的阶段运行,并且不会再影响测量结果。(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 轨迹记录。请注意,配置错误可能会导致内置 Metric 类失败。(Idfd3d、b/309841164、b/304038384) - 为清楚起见,已将
PowerMetric.deviceSupportsPowerEnergy
重命名为PowerMetric.deviceSupportsHighPrecisionTracking
(I5b82f) - 添加了
PowerMetric.deviceBatteryHasMinimumCharge()
和PowerMetric.deviceSupportsPowerEnergy()
,以便根据设备功耗测量功能更改或跳过基准测试。(I6a591、b/322121218)
bug 修复
- 添加了与之前的基准配置文件进行比较的功能(I824c8、b/269484510)
- 添加了用于停用警告的 DSL (Ic4deb、b/331237001)
- 将基准测试变体停用时出现的异常更改为信息日志(I8a517、b/332772491)
- 简化了捕获 Macrobenchmark 方法轨迹的操作,使其范围限定在实际
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 包含这些提交内容。
新功能
- 添加了具有 JSON、textproto 和 proto 二进制(未解码)变体的公共 API
PerfettoTraceProcessor.Session.queryMetrics
API。借助这些 API,您可以查询 TraceProcessor 中内置的指标 (I54d7f、b/304038382) - 向 JSON 输出添加了
profilerOutput
,以便更轻松地使用性能分析轨迹工具(例如 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
,并重新排列了参数,以便更常用的参数(模式)在参数列表中靠前,从而减少了指定参数名称的需要。(Ibf0b0、b/315830077、b/322167531) - 将
Metric.getResult
重命名为getMeasurements
,以匹配返回类型 (I42595)
bug 修复
- 修复了问题,以确保在
automaticGenerationDuringBuild
处于关闭状态时,基准测试使用生成的基准配置文件(Ic144f、b/333024280) - 修复了
BaselineProfile
Gradle 插件属性替换项,以便在自定义nonMinified
或基准 build 类型时启用基准配置文件生成和基准测试。(Ib8f05、b/324837887) - 修复了 macrobenchmark 中的方法轨迹刷新问题,因此即使在速度较慢的设备上,也应能完全捕获有效的方法轨迹。(I6349a、b/329904950)
- 在 Perfetto 轨迹记录上启用阻塞开始,以降低跟踪记录开头缺少数据的风险。仅在 API 33 及更高版本上受支持。Ie6e41、b/310760059
- 在基准测试模块中使用 Android Test Orchestrator 时添加了一条警告,因为这会导致每个模块的输出 JSON 文件被重复覆盖。(Ia1af6、b/286899049)
- 强制使用英文逗号 (,) 作为千位分隔符,以便在 Studio 输出中保持一致性,同时忽略设备语言区域 (I3e921、b/313496656)
TraceSectionMetric
现在支持使用Trace.{begin|end}AsyncSection
创建的 slice。(I91b32、b/300434906)- 为所有启动检测失败添加了 log.w / exception 标签。这不会更改当前行为(因此某些错误会抛出,而其他错误会静默地检测不到启动),只是更易于理解。通常,如果应用
Log.w()
且未能报告启动指标,则表示应用缺少非帧事件,并且在检测到启动时会抛出异常(帧时间信息除外,来自界面/RT 切片)。(Id240f、b/329145809) - 请先取消后台 dexopt 作业,然后再运行 Macrobenchmark,以减少干扰。(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 规则在 microbench 中实现了实验性 R8 支持。请注意,此支持目前处于实验阶段,需要 AGP 8.3 才能缩减库模块测试。使用以下代码在基准模块的
build.gradle
中启用 R8 缩减/优化,这应该会显著提升性能,具体取决于工作负载。(I738a3、b/184378053)android { buildTypes.release.androidTest.enableMinification = true }
bug 修复
- 修复了方法跟踪警告与 microbench 输出位于同一行的问题。(I0455c、b/328308833)
版本 1.3.0-alpha01
2024 年 2 月 21 日
发布了 androidx.benchmark:benchmark-*:1.3.0-alpha01
。版本 1.3.0-alpha01 中包含这些提交内容。
API 变更
- 重命名了
MicrobenchmarkConfig
布尔值参数,以避免使用不必要的字词“应”(Ia8f00、b/303387299) - 添加了
BenchmarkRule.measureRepeatedOnMainThread
,以便主线程基准测试(例如涉及 View 或 Compose 界面的基准测试)可以避免触发 ANR,尤其是在 CI 中的大型套件期间。(I5c86d) - 添加了
FrameTimingGfxInfoMetric
,这是FrameTimingMetric
的实验性替代实现,测量结果直接来自平台,而不是从 Perfetto 轨迹中提取。(I457cb、b/322232828) - 添加了在各个
warmUp
迭代期间转储 ART 配置文件的功能。(I17923) - 对
TraceSectionMetric
API 进行了多项更改:- 添加了
Mode.Min
、Mode.Max
- 添加了标签参数,以将部分名称替换为指标标签
- 向输出添加了模式名称,以阐明指标含义
- 将默认值更改为“总和”,因为此指标的大多数用途都是针对重复事件。请注意 CI 使用方式的这种变化,因为这可能会导致数据中断或破坏解析。(Ic1e82、b/301892382、b/301955938)
- 添加了
bug 修复
- 改进了基准配置文件 Gradle 插件中在指定的受管设备不存在时显示的错误消息 (Idea2b、b/313803289)
- 修复了在 AGP 8.3.0-alpha15 之前在 AAR 中添加库基准配置文件的问题(I1d2af、b/313992099)
- 修复了生成任务结束时的基准配置文件和启动配置文件输出网址(I802e5、b/313976958)
- 调整了数据源超时设置,以尝试修复
java.lang.IllegalStateException: Failed to stop [ProcessPid(processName=perfetto, pid=...)]
(I8dc7d、b/323601788) - 添加了两个插桩参数,用于替换着色器丢弃行为,以解决在对不使用
ProfileInstaller
1.3 的应用进行基准测试时发生崩溃的问题:androidx.benchmark.dropShaders.enable=true/false
:可用于跳过所有着色器丢弃(包括在StartupMode.Cold
启动时执行的丢弃),尤其是在对尚未使用 ProfileInstaller 1.3 的应用进行基准测试时androidx.benchmark.dropShaders.throwOnFailure=true/false
:可用于在尝试丢弃着色器时容忍失败,例如在没有 ProfileInstaller 1.3 (I4f573) 的情况下对应用进行基准测试时
- 当预计需要超过几秒钟时,跳过界面线程上的轨迹跟踪;在抛出时清理轨迹跟踪。(I6e768)
- 当文件名长度超过 200 个字符时,抛出异常,以免在写入或后处理文件时发生不明确的崩溃。(I4a5ab)
- 修复了以下问题:轨迹开头和结尾处的未终止帧可能会配对在一起,这会错误地报告为单个超长帧。(I39353、b/322232828)
- 在 API 30-33 上重新安装软件包时,请在 API 30 及更高版本上使用
--skip verification
来清除用户 build 中的 ART 配置文件。这有助于绕过导致某类设备出现故障的 Play 保护机制警告。(Ic9e36) - 当应用不是系统界面或启动器等系统应用时,请使用
am force-stop
终止应用。(I5e028) - Macrobenchmark 现在会等待
1 second
,以便目标应用刷新 ART 配置文件(之前它会等待500 ms
)。(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 包含这些提交内容。
bug 修复
- 修复了基准配置文件 srcset 未在基准变体中设置的问题。此外,修复了库中导致循环依赖项的
automaticGenerationDuringBuild
。(I28ab7、b/333024280) - 当应用不是系统界面或启动器等系统应用时,请使用
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 修复
- 从基准配置文件 Gradle 插件中移除了 AGP 版本为 8.3.0 或更高版本时的异常。
- 修复了在 AGP 8.3.0-alpha15 之前在 AAR 中添加库基准配置文件的问题。
版本 1.2.2
2023 年 12 月 1 日
发布了 androidx.benchmark:benchmark-*:1.2.2
。版本 1.2.2 中包含这些提交内容。
基准配置文件
- 执行日志将以本地文件 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
- 编译
- Macrobenchmark 现在会正确地完全重置每次编译的编译状态 - 这需要在 Android 14 之前重新安装 APK,因此如果您希望在被测内容中保留状态(例如用户登录),强烈建议您在 Android 14 及更高版本上进行基准测试。
- 您还可以通过单独控制应用编译并使用
CompilationMode.Ignore()
或插桩参数跳过编译来解决此问题
插桩参数
- 支持
androidx.benchmark.dryRunMode.enable
插桩参数(已在 Microbenchmark 中提供),以加快验证运行速度(例如在创建基准测试时或在提交前测试中) - 支持
androidx.benchmark.profiling.mode=StackSampling
和MethodTracing
。 - 添加了
androidx.benchmark.enabledRules
,以允许运行时过滤基准配置文件与 Macrobenchmark 规则测试 - 添加了
androidx.benchmark.perfettoSdkTracing.enable
参数,以便使用 tracing-perfetto 启用跟踪,例如 Compose 重组跟踪。请注意,与StartupMode.COLD
搭配使用时,由于跟踪库会在应用启动期间加载和启用,因此时间会受到严重影响。
- 支持
要求
- Macrobenchmark 现在要求目标应用中安装
ProfileInstaller
1.3.0 或更高版本,才能启用配置文件捕获 / 重置和着色器缓存清除功能。
- Macrobenchmark 现在要求目标应用中安装
新的实验性 Metric API
- 添加了实验性
TraceSectionMetric
,可从应用中的trace("") {}
代码块中提取简单的时间信息,或使用 TraceMetric 来利用 PerfettoTraceProcessor
的完整查询功能。 - 添加了实验性
PowerMetric
,用于捕获功耗信息 - 添加了实验性
MemoryCountersMetric
来统计页面故障 - 添加了实验性
PerfettoTraceProcessor
API,用于在内部从系统轨迹(也称为 Perfetto 轨迹)中提取指标
- 添加了实验性
修复
- 修复了在从多个 APK(例如从 app bundle)安装的应用中安装或提取配置文件时发生崩溃的问题。
- 修复了
FrameTimingMetric
忽略帧 ID 不一致的帧(通常是 API 31 及更高版本上涟漪期间的帧)的问题(I747d2、b/279088460) - 修复了对大于 64MB 的轨迹进行解析时出现的错误 (Ief831、b/269949822)
- 阐明了设备(尤其是模拟器)操作系统映像未正确配置为跟踪或编译时出现的错误
- 针对无电池设备(微型设备和宏观设备)跳过电池电量检查
- 改进了文件输出,针对无效输出目录的错误更清晰,默认值更安全
- 通过一致地丢弃着色器缓存(也通过
MacrobenchmarkScope.dropShaderCache
公开),提高了StartupMode.COLD
的稳定性 - 修复了
startActivityAndWait
的 Leanback 回退。
Microbenchmark
- 功能
- 性能分析已移至单独的阶段(在其他指标之后),因此一次测试运行可以同时显示准确的时间和性能分析结果。
- 实验性 API
- 添加了实验性
MicrobenchmarkConfig
API,用于定义自定义指标以及配置跟踪和性能分析。可用于捕获方法轨迹或捕获轨迹点(但请注意跟踪开销)。 - 添加了实验性 API,用于在不使用 JUnit 的情况下将
BenchmarkState
与BenchmarkRule
分开控制 - 添加了实验性
PerfettoTrace
记录,以便在基准测试 API 之外使用自定义配置捕获 Perfetto 轨迹。
- 添加了实验性
- 修复了以下问题
- 解决了 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 插件无法看到这些文件。(I8dbcc、b/303034735、b/296453339) - 阐明了从 macrobenchmark 模块注入目标应用时的
tracing-perfetto
加载错误消息。
版本 1.2.0-rc01
2023 年 9 月 20 日
发布了 androidx.benchmark:benchmark-*:1.2.0-rc01
。版本 1.2.0-rc01 中包含这些提交内容。
bug 修复
- 现在,如果 Perfetto SDK 跟踪在基准测试中未能成功初始化,系统会抛出异常(并附带补救说明)。(I6c878、b/286228781)
- 修复了在将 ART 方法轨迹转换为 Perfetto 格式时发生的 OOM 崩溃问题。(I106bd、b/296905344)
- (Macrobenchmark) 在 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)
bug 修复
- 通过进一步清理输出文件名称,避免输出文件名称中出现“=”和“:”,修复了写入/移动和拉取文件(尤其是参数化测试产生的文件)失败的问题。(I759d8)
版本 1.2.0-beta03
2023 年 8 月 9 日
发布了 androidx.benchmark:benchmark-*:1.2.0-beta03
。版本 1.2.0-beta03 中包含这些提交内容。
API 变更
- 添加了参数,以将
TraceSectionMetric
过滤为仅包含目标软件包,此参数默认处于启用状态(Ia219b、b/292208786)
bug 修复
- 将
fullTracing.enable
插桩参数重命名为了perfettoSdkTracing.enable
,以与工件名称和其他引用保持一致。fullTracing.enable
将继续作为后备参数运行。(I7cc00) - Benchmark 库内部跟踪点(包括微基准循环/阶段跟踪)现在将显示在 Studio 系统轨迹查看器中,并嵌套在 Perfetto 中的正确进程下。(I6b2e7、b/293510459)
- 移除了 API 31+ 上的宏基准 NOT-PROFILEABLE 错误,并在运行 eng/userdebug 且已取得 root 权限的设备上跳过可分析检查。(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)
bug 修复
- 当操作系统的跟踪配置错误时在宏基准中报告错误,正如最近在 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 中包含这些提交内容。
bug 修复
- 修复了 Studio 中的 Benchmark 输出有时会抑制警告的问题,并解决了 Studio 中不显示 Benchmark 输出的前导空格的问题。(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)
bug 修复
- Macrobenchmark 支持
androidx.benchmark.profiling.mode = MethodTracing
。(I7ad37、b/285912360) - Microbenchmark 性能分析已移至单独的阶段,因此会在测量后按顺序发生,而不是取代测量。
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
参数改成了非 null 参数,并设置了等效的默认值,以使文档中的默认过滤器行为更加清晰。(I3816e)
bug 修复
- 在
dryRunMode
中禁用了IsolationActivity
和 Perfetto 跟踪,以大幅提高性能,因为这些占据了大部分的运行时。(Ie4f7d) - 支持使用插桩测试参数
androidx.benchmark.profiling.mode=StackSampling
和androidx.benchmark.profiling.sampleFrequency
在 Macrobenchmark 中进行调用堆栈采样。(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 中包含这些提交内容。
bug 修复
- 修复了
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 跟踪支持,其中包括 Microbenchmark 和实验性
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 中包含这些提交内容。
bug 修复
- 修复了在具有多个 APK 的 app bundle 中重新安装配置文件或从中提取配置文件时
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 及更高版本中,得益于新的平台功能,Macrobenchmark 不再重新安装目标应用来重置编译状态。以前,在每次运行基准测试之前,都必须有一个已取得 root 权限的设备,或者处理被删除的所有应用状态(例如用户登录)。(I9b08c、b/249143766)
bug 修复
- 修复了
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 中包含这些提交内容。
bug 修复
- 允许将
None
传递给androidx.benchmark.enabledRules
插桩,以停止生成所有基准/基准配置文件。(I3d7fd、b/258671856) - 修复了应用模块(即,非自插桩测试 APK)中的
PerfettoTrace
捕获问题 (I12cfc) - 修复了 Studio 输出中的基准配置文件 adb 拉取参数的顺序(I958d1、b/261781624)
- 现在,当您尝试运行 Macrobenchmark 时,Arm 模拟器 API 33 能被正确识别,并可正确输出警告。(69133b、b/262209591)
- 在 Macrobenchmark 测试中跳过无电池设备的电池电量检查(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
,该 API 会等待基准配置文件可稳定地用于 N 次迭代。(I923f3) - 添加了使用
BaselineProfileRule
生成基准配置文件时指定输出文件名前缀的功能。(I7b59f、b/260318655)
bug 修复
- 提高了文件输出写入的安全性,这应该可以防止输出文件无法被静默地写入/附加,尤其是在 API 21/22 上。(If8c44、b/227510293)
- 修复了
simpleperf
跟踪输出以正确创建并放置文件。这应该还可以更全面地解决 Gradle 无法成功拉取文件的问题。(I12a1c、b/259424099) - 改进了 profileinstaller 版本过旧时输出的 profileinstaller 错误消息。现在,此 API 会提醒您更新 profileinstaller 版本 (1.2.1) 以衡量 API 31 到 33 上的基准配置文件,而不是指明它不受支持。(Ia517f、b/253519888)
- 修复了错误消息“Print 需要使用 API <=23”中的多个 shell 命令失败的问题,包括失败的 perfetto 捕获二进制文件设置和失败的轨迹捕获(Ib6b87、b/258863685)
- 自动将生成的配置文件规则排序以尽可能减少随时间推移的变更次数(在将配置文件规则签入源代码控制系统时)。(Ie2509)
- 修复了在 Android 13 (API 33) 之下未取得 root 权限的 build 上触发
Expected no stderr from echo 3 > /proc/sys/vm/drop_caches
消息时出现的崩溃问题(I6c245、b/259508183)
已知问题
- 由于 profileinstaller 清单中缺少广播注册表(尚未发布),MacrobenchmarkScope.dropShaderCache()
可能会崩溃。(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,用于测量 Macrobenchmark 中的能耗和功耗。(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)
会在 Macrobenchmark 测试的总膨胀时间中报告指标inflateMs
。还移除了 API 29 要求,因为TraceSectionMetric
可与目标 API 级别较低的androidx.tracing.Trace
搭配使用,并在目标应用中使用forceEnableAppTracing
。(Id7b68、b/231455742)
bug 修复
- 通过验证所有输出/错误,提高了所有内部 shell 命令的安全性。(I5984d、b/255402908、b/253094958)
- 在基准配置文件
adb pull
命令中指定设备,以便能在连接了多个设备(最多一个模拟器)时直接复制拉取命令(I6ac6c、b/223359380) - 针对 Macrobenchmark 测试 APK 未设置为自插桩的情形添加了错误消息。此错误消息会阻止在目标应用的进程内进行 Macrobenchmark 测试。在此过程中,宏基准将无法编译/终止/冷启动应用,也无法控制其自身权限 (I4279b)
- 修复了
measureRepeated()
中StartupMode.COLD
无法在setupBlock
后终止目标进程的问题。现在,setupBlock
与应用交互将不会使应用进程保持运行,也不会导致冷启动测量无效。(I8ebb7)
版本 1.2.0-alpha06
2022 年 10 月 24 日
发布了 androidx.benchmark:benchmark-*:1.2.0-alpha06
。版本 1.2.0-alpha06 中包含这些提交内容。
API 变更
- 在 Android 13 (API 33) 中,
BaselineProfileRule
不再需要 root 权限,并且不再处于实验阶段。(Ie0a7d、b/250083467、b/253094958)- 这项变更还修复了在未获 root 权限的设备上如何将应用的配置文件刷入磁盘的问题,但需要更新目标应用的 profileinstaller 依赖项。
- 如需在未取得 root 权限的设备上使用
BaselineProfileRule
或CompilationMode.Partial(warmupIterations)
,您还必须将目标应用更新为使用androidx.profileinstaller.profileinstaller:1.3.0-alpha01
。这样可以正确地将配置文件刷入磁盘,以便进行编译/提取。
bug 修复
- 修复了 API 33 及更高版本上的
SampledProfiling
崩溃问题。(I40743、b/236109374)
版本 1.2.0-alpha05
2022 年 10 月 5 日
发布了 androidx.benchmark:benchmark-*:1.2.0-alpha05
。版本 1.2.0-alpha05 中包含这些提交内容。
bug 修复
- 修复了 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 中包含这些提交内容。
新功能
在 Macrobenchmark 中添加了对
dryRunMode.enable
插桩参数的支持(已在 Microbenchmark 中提供),以加快本地开发和验证应用自动化(例如在提交前测试中)。这会将迭代计数替换为 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' } }
bug 修复
- 修复了
StartupTimingMetric
,使其不再需要通过MacrobenchmarkScope.startActivityAndWait()
启动测量的 activity。这意味着,该指标可以从通知、Context.startActivity()
、基于应用内 activity 的导航或 shell 命令等中选取启动模式。(Ia2de6、b/245414235) - 通过降低帧检测的严格程度修复了以下 bug:尝试等待在模拟器上完成启动时,
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)
bug 修复
- 为
startActivityAndWait
添加了 Leanback 回退。(01ed77、b/242899915)
版本 1.2.0-alpha02
2022 年 8 月 24 日
发布了 androidx.benchmark:benchmark-*:1.2.0-alpha02
。版本 1.2.0-alpha02 中包含这些提交内容。
API 变更
MacrobenchmarkScope.killProcess()
默认为am force stop
,即使已取得 root 权限也不例外,但生成基准配置文件期间除外。可使用可选的布尔值参数将其替换。(02cce9、b/241214097)
bug 修复
- 支持为系统应用生成基准配置文件。(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 跟踪记录的应用中启用 Perfetto SDK 跟踪功能 (I2cc7f)
添加了
androidx.benchmark.enabledRules
插桩参数,以允许过滤仅针对基准运行 MacroBenchmark 的情况,或过滤仅针对生成基准配置文件运行 MacroBenchmark 的情况。传入“Macrobenchmark”或“BaselineProfile”即可仅运行一种类型的测试,例如在模拟器上生成BaselineProfiles
时。您也可以使用逗号分隔列表。(I756b7、b/230371561)例如,在 Macrobenchmark 的 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
,用于在 Macrobenchmark 中测量每个系统类别的总功耗和能耗。(I3b26b、b/224557371)
bug 修复
- 修复了以下问题:在未取得 root 权限的 build 上的各 Macrobenchmark 之间,系统未正确重置已编译的方法。遗憾的是,每次迭代都需要重新安装该 APK,这会清除每个 Mmacrobenchmark 的应用数据。(I31c74、b/230665435)
- 修复了 API 21/22 上的跟踪记录崩溃问题(If7fd6、b/227509388、b/227510293、b/227512788)
- 改进了 activity 启动完成检测,以修复启动 Macrobenchmark 期间的“无法读取任何指标”异常。(Ia517c)
版本 1.1.1
版本 1.1.1
2022 年 11 月 9 日
发布了 androidx.benchmark:benchmark-*:1.1.1
。版本 1.1.1 中包含这些提交内容。
bug 修复
- 修复了在某些 Android11 (API 30) 及更高版本的设备上发生的
android.system.ErrnoException: open failed: EACCES
问题。这是从1.2.0-alpha01
中择优挑选的修复程序。(aosp/2072249)
版本 1.1.0
版本 1.1.0
2022 年 6 月 15 日
发布了 androidx.benchmark:benchmark-*:1.1.0
。版本 1.1.0 中包含这些提交内容。
- 此版本与
androidx.benchmark:benchmark-*:1.1.0-rc03
完全相同。
自 1.0.0 以来的重要变更
支持 Jetpack Macrobenchmark,让您能够衡量整个应用的交互情况(例如启动和滚动),并能够捕获轨迹和衡量轨迹部分。
支持基准配置文件
CompilationMode.Partial
,用于衡量基准配置文件的效果。@BaselineProfileRule
,用于为特定关键用户历程自动生成基准配置文件。
在 Microbenchmark 运行期间,支持分配指标和性能剖析。
版本 1.1.0-rc03
2022 年 6 月 1 日
发布了 androidx.benchmark:benchmark-*:1.1.0-rc03
。版本 1.1.0-rc03 中包含这些提交内容。
bug 修复
避免在每次基准测试迭代中重新安装目标软件包。(aosp/2093027、b/231976084)
从
pressHome()
中移除了300ms
延迟。(aosp/2086030、b/231322975)通过优化后台使用的 Shell 命令,加快了 Macrobenchmark 迭代速度。(aosp/2086023、b/231323582)
使用 Macrobenchmark 生成基准配置文件时,支持受管理的 Gradle 设备。(aosp/2062228、b/228926421)
版本 1.1.0-rc02
2022 年 5 月 11 日
发布了 androidx.benchmark:benchmark-*:1.1.0-rc02
。版本 1.1.0-rc02 中包含这些提交内容。
- 请注意,此版本包含一项行为变更,应用现在会在每次基准测试之间完全重新安装,以确保测量结果准确。
bug 修复/行为变更
修复了以下问题:应用编译在 Macrobenchmark 测试之间未正确重置,而且在未取得 root 权限的 build 中,应用编译完全无法重置。这修复了运行多项测试经常会导致
CompilationMode
对测量结果几乎没有影响的问题。为了解决此问题,目标应用现在会完全重新安装每个测试方法,这将清除每次 Macrobenchmark 测试之间的应用数据。(I31c74、b/230665435)由于这会防止应用在测试前设置状态,因此现在可以跳过编译/重新安装来解决此问题。例如,您可以使用 shell 命令
cmd package compile -f -m speed <package>
完全编译目标,然后绕过 Macrobenchmark 的编译步骤。例如,在 Macrobenchmark 的 build.gradle 中:
android { defaultConfig { testInstrumentationRunnerArgument 'androidx.benchmark.compilation.enabled, 'false' } }
或者在 Gradle 命令行中:
./gradlew macrobenchmark:cC -P android.testInstrumentationRunnerArguments.androidx.benchmark.compilation.enabled=false
添加
androidx.benchmark.enabledRules
插桩参数以支持在 Macrobenchmark 与生成测试的基准配置文件之间共享模块。传入“Macrobenchmark”或“BaselineProfile”即可仅运行一种类型的测试,例如在模拟器上生成BaselineProfiles
时。(I756b7、b/230371561)例如,在 Macrobenchmark 的 build.gradle 中:
android { defaultConfig { testInstrumentationRunnerArgument 'androidx.benchmark.enabledRules', 'BaselineProfile' } }
或者在 Gradle 命令行中:
./gradlew macrobenchmark:cC -P android.testInstrumentationRunnerArguments.androidx.benchmark.enabledRules=BaselineProfile
版本 1.1.0-rc01
2022 年 4 月 20 日
发布了 androidx.benchmark:benchmark-*:1.1.0-rc01
。版本 1.1.0-rc01 中包含这些提交内容。
bug 修复
- Android Studio 中的基准配置文件输出链接现在使用唯一的文件名。这样,输出始终会反映使用
BaselineProfileRule
的最新结果。(aosp/2057008、b/228203086)
版本 1.1.0-beta06
2022 年 4 月 6 日
发布了 androidx.benchmark:benchmark-*:1.1.0-beta06
。版本 1.1.0-beta06 中包含这些提交内容。
bug 修复
- 修复了 API 21/22 上的跟踪记录崩溃问题(If7fd6、b/227509388)
- 改进了 activity 启动完成检测,以修复启动 Macrobenchmark 期间的“无法读取任何指标”异常。(Ia517c)
- 修复了使用
CompilationMode.None()
时 Macrobenchmark 的启动指标。在此变更生效之前,CompilationMode.Partial()
的运行速度似乎慢于Compilation.None()
。(611ac9)
版本 1.1.0-beta05
2022 年 3 月 23 日
发布了 androidx.benchmark:benchmark-*:1.1.0-beta05
。版本 1.1.0-beta05 中包含这些提交内容。
bug 修复
- 使用
CompilationMode.None
时,在跳过配置文件安装后终止软件包。(aosp/1991373) - 修复了使用
StartupMode.COLD
时 Macrobenchmark 无法收集启动指标的问题。(aosp/2012227 b/218668335)
版本 1.1.0-beta04
2022 年 2 月 23 日
发布了 androidx.benchmark:benchmark-*:1.1.0-beta04
。版本 1.1.0-beta04 中包含这些提交内容。
bug 修复
修复了在 Android 10 中缺少指标的问题,还修复了因系统在轨迹中未正确捕获进程名称而导致出现的
NoSuchElementException
。(Ib4c17、b/218668335)在 Android Q (API 29) 及更高版本中使用
PowerManager
进行温控调频检测。这可显著降低温控调频检测发生误报的频率(在 90 秒冷却期之后重试基准测试),并显著提高在用户 build 上进行基准测试的速度。同时这也使得即使时钟处于锁定状态,系统仍可进行热限制检测(如果锁定值对于设备的物理环境而言过高)。(I9c027、b/217497678、b/131755853)过滤对
measureRepeated
线程的 Simpleperf 采样性能剖析,目的就在于简化检查(Ic3e12、b/217501939)支持来自多进程应用中已命名界面子进程的指标(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 变更
- 在 macrobenchmark 库中的实验性标记下方添加了
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() // ... } ) }
bug 修复
- 修复了以下问题:在 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 中包含这些提交内容。
bug 修复
- 与其他性能剖析输出类似,微基准堆栈采样/方法跟踪性能分析结果现在会在 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 中包含这些提交内容。
bug 修复
- 修复了性能分析器参数启用设置被忽略的问题。(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)
bug 修复
- 修复了
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)
bug 修复
- 每次迭代时唤醒设备,以确保可以测试界面 - 需要停用锁屏功能。(Ibfa28、b/180963442)
- 修复了模拟器和未取得 root 权限的设备在 StackSampling 分析模式下多次崩溃的问题(Icdbda、b/202719335)
- 取消了每次迭代结束时 0.5 秒的休眠时间 - 如果您发现此次更改后缺少一些指标,请提交 bug。(Iff6aa)
- 降低了数据丢失的几率,并减少了跟踪记录的内存开销(Id2544、b/199324831、b/204448861)
- 改为内存占用较小的 sched 存储格式,将轨迹大小缩减了约 40%。(Id5fb6、b/199324831)
- 将启动指标的实现更新为始终在 renderthread 结束时结束。这将使各个平台版本间的测量结果更为一致,并且更贴近应用内衡量结果。(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
,能够为应用的关键用户历程生成基准配置文件。后面提供了详细文档。(Ibbefa、b/203692160) - 移除了为 Java 调用方添加的 measureRepeated 接口变体,因为它会导致在完成/解析该方法是产生歧义。Java 调用方将需要再从 measureRepeated 返回 Unit.Instance。如果由此给您带来不便,请提交 bug,我们会在未来版本中细探这一问题。(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)
bug 修复
- 修复了跟踪记录未尽早开始以及缺少指标数据的问题。这应该可以修复由库本身引起的“在基准运行期间无法读取任何指标”异常。(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 中包含这些提交内容。
bug 修复
- 支持在没有对 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 变更
- 使滚动 macrobenchmark 可以往回运行到 API 23(If39c2、b/183129298)
- 向界面和 JSON 输出添加了新型采样指标,侧重于每次迭代多个样本的百分位数。(I56247、b/199940612)
- 整个基准库都改为使用浮点指标(在 Studio 界面中会被截断)。(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)
bug 修复
- 修复了
ProfileInstaller
,以更方便使用基准配置文件的应用使用CompilationMode.BaselineProfile
运行 MacroBenchmark。(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)
bug 修复
- 已在 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)
bug 修复
- 降低了热节流检测的激进性,并在频繁检测到节流时重新计算基准。(I7327b)
- 修复了 FrameTimingMetric,以支持 Android S Beta 版(Ib60cc、b/193260119)
- 使用
EmptyActivity
使目标应用退出强行停止状态,以便更好地支持CompilationMode.BaselineProfile
。(Id7cac、b/192084204) - 将轨迹文件扩展名更改为
.perfetto-trace
,以符合平台标准。(I4c236、b/174663039) - StartupTimingMetric 现在会输出“fullDrawnMs”指标,以测量直到应用完成渲染所用的时间。如需为您的应用定义此指标,请在初始内容准备就绪时(例如,从数据库或网络加载初始列表项时)调用 Activity.reportFullyDrawn。(无需对 ComponentActivity 进行 build 版本检查即可使用 reportFullyDrawn 方法。)请注意,您的测试必须运行足够长的时间才能捕获此指标(startActivityAndWait 不会等待 reportFullyDrawn)。(If1141、b/179176560)
- 将界面元数据附加到轨迹的时间缩短了 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)
bug 修复
用于抑制基准错误的 Gradle 示例代码已更新为使用一个非废弃的 API,其语法也支持 .gradle.kts 用户。
例如:
testInstrumentationRunnerArguments["androidx.benchmark.suppressErrors"] = "EMULATOR,LOW-BATTERY"
版本 1.1.0-alpha02
2021 年 5 月 18 日
Benchmark 版本 1.1.0-alpha02 为基准化分析引入了一个重要组件 - Macrobenchmark。除了提供用于衡量 CPU 循环的基准之外,Macrobenchmark 还可用于衡量整个应用的互动(如启动和滚动)和捕获跟踪记录。如需了解详情,请参阅库文档。
发布了 androidx.benchmark:benchmark-*:1.1.0-alpha02
。版本 1.1.0-alpha02 中包含这些提交内容。
新功能
添加了 Macrobenchmark 工件(androidx.benchmark:benchmark-macro-junit4
和 androidx.benchmark:benchmark-macro
)
- 从应用(在本地或 CI 中)中捕获启动、滚动/动画性能指标
- 从 Android Studio 中捕获和检查跟踪记录
bug 修复
- 解决了 Android 12 上输出目录的 shell 权限问题(注意 - 可能需要将 Android Gradle 插件更新到 7.0.0 Canary 版以及将 Android Studio 更新为 Arctic Fox [2020.3.1],以继续在受影响的设备上捕获输出文件)。(Icb039)
- 在 BenchmarkPlugin 中支持配置缓存(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 控制台输出以及
- 性能剖析支持 - 您现在可以捕获基准运行的性能剖析数据,以检查代码运行缓慢的原因。Benchmark 支持捕获方法跟踪记录或 ART 中的方法采样。您可以使用 Android Studio 中的性能剖析器(依次选择“File > Open”)来检查这些文件。
- Benchmark Gradle 插件现在提供默认设置,以便简化设置过程:
testBuildType
默认设置为发布,以避免使用内置代码覆盖率的依赖项。发布 buildType 也会配置为默认 buildType,以便 Android Studio 能够在首次打开项目时自动选择正确的 build 变体。(b/138808399)signingConfig.debug
用作默认的签名配置 (b/153583269)
** 问题修复 **
- 显著降低了预热过渡开销,其中每个基准的首次测量值都因人为原因而高于其他测量值。该问题在非常小的基准(1 毫秒或更短)中更加明显。(b/142058671)
- 修复了从命令行运行时针对每个基准输出的
InstrumentationResultParser
错误。(I64988、b/154248456)
已知问题
- 命令行、Benchmark 的 Gradle 调用不直接输出结果。若要解决该问题,您可以查看 Studio,也可以解析 JSON 输出文件以获取结果。
- Benchmark 报告无法从已安装应用 ID 以“android”或“download”(不区分大小写)结尾的应用的设备中拉取报告。遇到该问题的用户应将 Android Gradle 插件升级到 4.2-alpha01 或更高版本。
版本 1.0.0
Benchmark 版本 1.0.0
2019 年 11 月 20 日
发布了 androidx.benchmark:benchmark-common:1.0.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 的主要功能
使用 Benchmark 库,您可为应用代码编写性能基准测试并快速获得分析结果。
它可以防止出现构建和运行时配置问题并稳定设备性能,确保衡量值的准确性和一致性。直接在 Android Studio 中或在持续集成中运行基准化分析,以观察代码性能随时间的变化情况,并防止出现回归。
主要功能包括:
- 时钟稳定
- 自动设置线程优先级
- 支持界面性能测试,例如在 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 跟踪记录
bug 修复
- 修复了由于优先级设置导致 JIT 无法在预热前结束的指标不稳定问题 (b/140773023)
- 统一了 Android Gradle 插件 3.5 和 3.6 的 JSON 输出目录
版本 1.0.0-beta01
2019 年 10 月 9 日
发布了 androidx.benchmark:benchmark-common:1.0.0-beta01
、androidx.benchmark:benchmark-gradle-plugin:1.0.0-beta01
和 androidx.benchmark:benchmark-junit4:1.0.0-beta01
。版本 1.0.0-beta01 中包含这些提交内容。
新功能
- 在每次预热之前运行垃圾回收,以减少从一个基准泄漏到下一个基准的内存压力 (b/140895105)
bug 修复
- 添加了
androidx.annotation:android-experimental-lint
依赖项,以便在未使用实验性 API 时,Java 代码将正确生成 lint 错误,类似于 Kotlin 实验性注解针对 Kotlin 调用方提供的内容。 - 现在可正确检测 Android Gradle 插件 3.6 中输出的
additionalTestOutputDir
插桩参数的使用情况,了解 AGP 何时处理数据副本。 - 修复了 JSON 中未检测到的时钟频率,以正确打印
-1
(b/141945670)。
版本 1.0.0-alpha06
2019 年 9 月 18 日
发布了 androidx.benchmark:benchmark-common:1.0.0-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 现标记为实验性
bug 修复
- 修复了时钟锁定脚本,该脚本在缺少
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 的情况下使用 Benchmark 库的新文档,两者可用于不同的构建系统(例如 Bazel 或 Buck),以及在 CI 中运行时。如需了解详情,请参阅在不使用 Gradle 的情况下构建基准和在持续集成环境中运行基准测试。
新功能
- Gradle 插件
- 现在自动停用测试覆盖范围,并默认设置
AndroidBenchmarkRunner
(b/138374050) - 增加了在运行基准和使用 AGP 3.6+ 时,对基于 AGP 的新数据副本的支持
- 现在自动停用测试覆盖范围,并默认设置
- 添加了 JSON 格式
- 输出总基准测试运行时间 (b/133147694)
- 现在,使用名称字符串(例如
@Parameters(name = "size={0},depth={1}")
)的@Parameterized
基准以 JSON 输出格式输出每个基准的参数名称和值 (b/132578772)
- 模拟运行模式 (b/138785848)
- 添加了“模拟运行”模式,仅运行每个基准循环一次以检查是否有错误/崩溃,而不捕获测量值。该模式非常有用,例如可在预提交中快速运行基准,以确认它们未损坏。
API 变更
- 更改了模块结构,拆分了库 (b/138451391)
benchmark:benchmark-junit4
包含具有 JUnit 依赖项的类:AndroidBenchmarkRunner
和BenchmarkRule
。这两个类均已移入androidx.benchmark.junit4
软件包中benchmark:benchmark-common
包含其余逻辑,其中包括 BenchmarkState API- 通过这种拆分,该库将来可以在没有 JUnit4 API 的情况下支持基准化分析
- 配置警告现在被视为错误,并且会使测试崩溃 (b/137653596)
- 这样做是为了进一步鼓励准确测量,尤其是在 CI 中
- 可以使用插桩参数将这些错误回退为警告。例如:
-e androidx.benchmark.suppressErrors "DEBUGGABLE,LOW_BATTERY"
bug 修复
- 写入 Q 设备上的外部存储空间时出现的错误会提供更具描述性的消息,并提供有关如何解决相应问题的建议
- 在基准运行期间,屏幕会自动打开,而不是在屏幕关闭时失败
外部贡献
- 感谢 Sergey Zakharov 为 JSON 输出改进以及修复屏幕关闭问题做出的贡献!
版本 1.0.0-alpha03
2019 年 7 月 2 日
发布了 androidx.benchmark:benchmark:1.0.0-alpha03
和 androidx.benchmark:benchmark-gradle-plugin:1.0.0-alpha03
。点击此处可查看此版本中包含的提交内容。
新功能
- 在完整的 JSON 报告中公开每个基准因热节流而导致的休眠持续时间
bug 修复
- 在 Android 插件和 Android 块之后,不再需要应用 Gradle 插件
- 在使用分区存储的 Android 10 设备上添加了对基准报告的支持
版本 1.0.0-alpha02
2019 年 6 月 6 日
发布了 androidx.benchmark:1.0.0-alpha02
和 androidx.benchmark:benchmark-gradle-plugin:1.0.0-alpha02
。点击此处可查看此版本中包含的提交内容。
请注意,我们将 JSON 架构视为 API。我们计划遵循与其他 API 相同的稳定性约束:进入 Beta 版后架构即变得稳定(极偶尔会有例外情况),并在最终版本中进行修复,在次要版本中仅添加新内容,而在主要版本中更改/移除内容。
API 变更
翻新了 JSON 架构。对 JSON 架构的后续更改很可能仅限于新增特性:
- 重新组织了结果对象结构,以支持将来的更多指标组 (b/132713021)
- 在顶级对象中添加了测试运行上下文信息(例如,设备和 build 信息以及时钟是否处于锁定状态)(b/132711920)
- 现在,时间指标名称中带有“ns”(b/132714527)
- 扩充了每个报告指标的统计信息(最大值、中位数、最小值),并移除了简化的“nanos”摘要统计信息 (b/132713851)
移除了 XML 输出 (b/132714414)
从
BenchmarkState.reportData
API 中移除了热限制检测 (b/132887006)
bug 修复
- 修复了
./gradlew lockClocks
在某些最新的 OS 设备上不粘滞的问题 (b/133424037) - 停用了模拟器的限制检测 (b/132880807)
版本 1.0.0-alpha01
2019 年 5 月 7 日
发布了 androidx.benchmark:benchmark:1.0.0-alpha01
。点击此处可查看此版本中包含的提交内容。