Baseline Profile:记录关键路径,不伪造优化 · AndroidX 源码指南
AAndroidX 源码指南
测试与性能
测试与性能 · 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()
}

生成与接入流程

  1. 独立 generator 模块:baselineprofile(androidTest + BaselineProfileRule)。
  2. 运行生成./gradlew :baselineprofile:generateBaselineProfile(或 managed device)。
  3. 产物落入app/src/main/baseline-prof.txt(打包进 APK)。
  4. 配合 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.NonePartial 等条件下的启动或交互指标。
  • 规则随代码变化会失效,因此把生成和基准纳入版本发布流程,而不是只在第一次接入时运行。

相关页面