系统追踪 (System Tracing)
当应用出现丢帧(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
- 打开 Profiler 标签页。
- 选择 CPU/Memory 时间轴。
- 点击 Record,操作 App 复现卡顿,点击 Stop。
- 在 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 中,重点关注:
- Choreographer#doFrame: 这是每一帧的开始。如果它的长度超过 16.6ms (60fps) 或 11ms (90fps),就会丢帧。
- Recomposition: 寻找
Recomposer:recompose。如果它占据了大部分时间,说明重组逻辑太重。 - Layout: 寻找
Measure和Layout块。 - Draw: 寻找
Draw块。
如果看到某个具体的 Composable 函数(如 ChatList)占据了极长的条块,那就是优化目标。
4. 自定义 Trace
你也可以在自己的代码中添加 Trace 标记。
kotlin
import androidx.tracing.trace
@Composable
fun MyHeavyComponent() {
trace("MyHeavyComponent_Section") {
// 你的耗时逻辑
}
}