Skip to content

系统追踪 (System Tracing)

源:Compose 组合追踪

当应用出现丢帧(Jank)时,单纯看代码很难定位原因。是重组太慢?是 Layout 耗时?还是系统层面的调度问题?

System Tracing (Perfetto) 可以记录设备上发生的一切:线程调度、CPU 频率、垃圾回收以及我们的 Compose 阶段耗时。

1. 依赖配置

Compose 默认的 Trace 信息不够详细。你需要引入 Runtime Tracing 库来在 Perfetto 中显示 Composable 函数的名称。

kotlin
dependencies {
    implementation("androidx.compose.runtime:runtime-tracing:1.0.0-beta01")
}

注意:此库仅用于生成详细 Trace,不需要在 Release 包中包含(R8 会自动剥离,或者你可以只在 benchmark 变体中引入)。

2. 抓取 Trace

方法 A: Android Studio Profiler

  1. 打开 Profiler 标签页。
  2. 选择 CPU/Memory 时间轴。
  3. 点击 Record,操作 App 复现卡顿,点击 Stop
  4. System Trace 视图中,搜索你的 Composable 函数名。

方法 B: Perfetto 命令行 (推荐)

对于更精确的分析,使用命令行工具。

bash
# 录制 10 秒
adb shell perfetto -o /data/misc/perfetto-traces/trace.pftrace -t 10s \
sched freq idle am wm gfx view \
    atrace --app <your.package.name>

然后将文件拉出并在 ui.perfetto.dev 打开。

3. 分析 Trace

在 Perfetto 中,重点关注:

  1. Choreographer#doFrame: 这是每一帧的开始。如果它的长度超过 16.6ms (60fps) 或 11ms (90fps),就会丢帧。
  2. Recomposition: 寻找 Recomposer:recompose。如果它占据了大部分时间,说明重组逻辑太重。
  3. Layout: 寻找 MeasureLayout 块。
  4. Draw: 寻找 Draw 块。

如果看到某个具体的 Composable 函数(如 ChatList)占据了极长的条块,那就是优化目标。

4. 自定义 Trace

你也可以在自己的代码中添加 Trace 标记。

kotlin
import androidx.tracing.trace

@Composable
fun MyHeavyComponent() {
    trace("MyHeavyComponent_Section") {
        // 你的耗时逻辑
    }
}