2. 测量初始组合耗时的工具链:Compose Metrics 开关配置、Baseline Profile 生成工具、Android Studio Profiler Trace 抓取、自定义 Trace 标记

初始组合耗时(First Composition)是 Compose 应用启动性能的关键指标。要精准分析该值,必须掌握一套端到端的工具链。本章将逐个讲解四种核心工具的原理、配置方法与实际使用流程,帮助你在项目中快速搭建可复用的测量体系。

2.1 工具链总览

四种工具并非孤立使用,而是形成“开关启测 → 极限预热 → 实时捕获 → 埋点归因”的闭环。

核心思路:先通过 Gradle 开关开启 Compose Metrics 采集,用 Baseline Profile 预热关键路径,再借助 Android Studio Profiler 抓取 Trace,最后利用自定义 Trace 标记在代码中标注分析区间。
适用场景:适用于需要将启动耗时从 400ms 压至 200ms 以下的性能敏感型项目;若只是简单预览,可以跳过 Baseline Profile 生成。

2.2 原理剖析

工具 原理 产出物
Compose Metrics 开关 编译期注入字节码,统计 Composition 节点创建、重组次数与耗时 JSON / 控制台日志
Baseline Profile 生成工具 运行 A/B 实验,记录预编译(AOT)所需的类和方法,生成 .prof 文件 baseline-prof 目录下的 .prof 文件
Android Studio Profiler Trace 基于 Perfetto 或 systrace 抓取系统级别的 Trace 事件 .trace / .perfetto-trace 文件
自定义 Trace 标记 通过 Trace.beginSection / endSection 在代码中标记时间区间 与 Profiler Trace 融合的标记

2.3 实现流程

推荐按以下顺序串联工具,避免数据混乱:

  1. 开启 Compose Metrics:在模块级 build.gradle.kts 中设置编译选项。
  2. 生成 Baseline Profile:运行 Gradle 任务 generateBaselineProfile,预热目标页面。
  3. 添加自定义 Trace 标记:在关键 Composable 函数入口/出口处插入标记。
  4. 抓取 Profiler Trace:连接真机,运行应用并通过 Android Studio Profiler 录制启动阶段。
  5. 分析数据:叠加 Metrics 日志与 Trace 时间线,找出瓶颈。

2.4 配置与命令详解

2.4.1 Compose Metrics 开关配置

在模块级 build.gradle.kts 中添加以下配置,启用编译时指标收集:

android {
    buildFeatures {
        compose = true
    }
    composeOptions {
        kotlinCompilerExtensionVersion = "1.5.4"
    }
    kotlinOptions {
        freeCompilerArgs += listOf(
            "-P",
            "plugin:androidx.compose.compiler.plugins.kotlin:metricsDestination=" +
                    project.buildDir.absolutePath + "/compose-metrics"
        )
    }
}
效果:构建后会在 build/compose-metrics 目录下生成 metrics.json,包含每个 Composable 函数的组合次数、重组次数、跳过率等。

2.4.2 Baseline Profile 生成工具

在 app/build.gradle.kts 中配置基准模块:

plugins {
    id("androidx.baselineprofile")
}

android {
    baselineProfile {
        // 指定要包含的 ABI,通常为 arm64-v8a
        variantFilter { variant ->
            if (variant.buildType.name == "release") {
                variant.enable = true
            }
        }
    }
}

执行生成命令:

./gradlew app:generateBaselineProfile -Pandroid.testInstrumentationRunnerArguments.androidx.benchmark.enabledRules=BaselineProfile

生成的文件位于 app/src/main/baseline-prof 目录下,以 baseline-prof 格式保存。

2.4.3 Android Studio Profiler Trace 抓取

  • 连接已 Root 或 Android 12+ 的真机(模拟器数据不准确)。
  • 打开 Android Studio → View → Tool Windows → Profiler。
  • 选择设备与进程,点击“Record”按钮,选择记录类型(建议“Java/Kotlin Method Trace + System Trace”)。
  • 在手机上启动应用,完成初始组合后点击“Stop”。
  • 导出 .trace 文件或直接在 Profiler 中分析。
注意:不要使用 Debug 签名包,否则 Trace 可能包含大量无关 debug 信息;建议使用 Release 包并开启可调试标志(debuggable = true)临时抓取。

2.4.4 自定义 Trace 标记 API

在 Composable 函数中包裹测量区间:

import android.os.Trace

@Composable
fun MyImportantScreen() {
    Trace.beginSection("MyImportantScreen_composition")
    // 实际 Composable 内容
    Column {
        // ...
    }
    Trace.endSection()
}

为避免遗漏 endSection,推荐使用工具类封装:

fun  trace(name: String, block: () -> T): T {
    Trace.beginSection(name)
    try {
        return block()
    } finally {
        Trace.endSection()
    }
}

// 调用
trace("ProfileCard_composition") {
    ProfileCard()
}

在 Profiler Trace 中会看到名为 MyImportantScreen_composition 的区间,与系统组件 Slot 时间线并列显示。

2.5 调试与验证

  • 验证 Metrics 是否产生:检查 build/compose-metrics 目录是否存在且包含 metrics.json。
  • 验证 Baseline Profile 是否生效:发布 Release 包后,使用 adb shell dumpsys package dexopt 查看 OAT 文件状态。
  • 验证 Trace 标记可见:在 Profiler 时间线中展开“Custom Trace”区域,检查自定义名称。

常见问题排查:

错误现象 可能原因 解决方法
Metrics JSON 文件为空 未正确配置 Compose 插件版本或路径 检查 kotlinCompilerExtensionVersion 是否匹配 Compose BOM
Baseline Profile 生成失败 未安装测试 APK 或设备不兼容 使用 Android 12+ 真机,并运行 connectedCheck 预置
Trace 中看不到自定义标记 Trace.beginSection 在非 UI 线程调用 确保标记位于 Main 线程或使用 Trace.beginAsyncSection

2.6 部署与持续集成

将工具链集成到 CI 流水线中,每次发布前自动生成 Baseline Profile 并分析 Metrics 波动:

  1. 在 CI 脚本中执行 ./gradlew assembleRelease generateBaselineProfile。
  2. 解析 metrics.json,若初始组合耗时相比基线增加超过 10ms,则报警。
  3. 将生成的 .prof 文件提交到版本库中,确保 Release 构建包含。

2.7 性能与稳定性优化建议

  • 避免过度埋点:仅在关键页面和组件添加自定义 Trace,防止 Trace 文件过大导致掉帧。
  • 使用 Release 包抓取 Trace:Debug 包中 Compose 的重组日志过多,会干扰初始组合时间线。
  • 定期更新 Baseline Profile:每次新增或重构页面后,重新生成 .prof 文件以包含最新代码路径。
  • 配合 Trace 与 Metrics 交叉定位:Metrics 告诉你在哪个 Composable 上消耗了时间,Trace 告诉你该 Composable 被调用的上下文与系统资源竞争情况。

2.8 本章工具链关系图

Compose初始组合耗时测量工具链 工具链配合关系 Compose Metrics 开关 Baseline Profile 生成 Profiler Trace 抓取 自定义 Trace 标记 编译时数据 预热后运行 时间线叠加 定位到具体 Composable 闭环:Metrics 提供统计 → Profile 缩小范围 → Trace 验证真实耗时 → 标记精细归因 → 反馈给 Metrics 优化

上图展示了工具链的流转方向:先由 Compose Metrics 开关收集编译时组合数据,驱动 Baseline Profile 生成;预热后的应用在 Profiler Trace 中录制初始组合,同时自定义 Trace 标记提供代码级细粒度的区间,最终交叉分析出瓶颈点。

实践建议:在项目初期,先单独启用 Compose Metrics 开关查看重组次数,再逐步引入其余工具。不要同时启用所有工具,避免数据过载。