测试与性能
测试与性能 · androidx.test
Baseline Profile:记录关键路径,不伪造优化
用真实用户流程生成 profile,并用 Macrobenchmark 比较编译模式。
最后更新 2026-08-01
复制即用
@get:Rule
val baselineProfileRule = BaselineProfileRule()
@Test
fun generate() = baselineProfileRule.collect(
packageName = "com.example.app",
) {
pressHome()
startActivityAndWait()
device.findObject(By.text("主要功能")).click()
}生成与接入流程
- 独立 generator 模块:
:baselineprofile(androidTest + BaselineProfileRule)。 - 运行生成:
./gradlew :baselineprofile:generateBaselineProfile(或 managed device)。 - 产物落入:
app/src/main/baseline-prof.txt(打包进 APK)。 - 配合 ProfileInstaller:启动时安装 profile,见 profileinstaller。
验证收益
@Test
fun startupComparison() = benchmarkRule.measureRepeated(
packageName = "com.example.app",
metrics = listOf(StartupTimingMetric()),
startupMode = StartupMode.COLD,
) {
startActivityAndWait()
}对比 CompilationMode.None(未安装 profile)与 Partial(已安装)的启动耗时。
常见陷阱
- 流程太长/不稳定:生成流程应短、稳定、代表高价值用户旅程。
- 覆盖不了用户没走过的路径:冷门功能不会进 profile。
- 规则随代码失效:把生成和基准纳入版本发布流程,不是只跑一次。
- 忘打包装入:确认 baseline-prof.txt 在发布产物里。
- 不解决真正性能问题:它不修复主线程 I/O、无效重组或低效算法。
要点
- Baseline Profile 收集关键路径上运行到的类和方法规则,随应用发布后帮助运行时提前编译。它不会修复主线程 I/O、无效重组或低效算法,也不会自动覆盖用户从未走过的功能。
- 生成流程应短、稳定、代表高价值用户旅程,并在独立 generator 模块中运行。生成成功只是产出了规则;还要确认 profile 被打进发布产物,并用 Macrobenchmark 对比
CompilationMode.None、Partial等条件下的启动或交互指标。 - 规则随代码变化会失效,因此把生成和基准纳入版本发布流程,而不是只在第一次接入时运行。