第2章 Perfetto 简介:Perfetto 的诞生,与 Systrace 的关系与差异
讲 Android 性能分析,Systrace 曾经是绕不开的工具。但我记得 2018 年那会儿,用 Systrace 抓一个 30 秒的 trace,手机烫得跟暖宝宝似的。文件动不动就几百兆,打开 HTML 报告还得等半天。那时候我就在想——有没有更轻量、更现代化的替代方案?
后来 Perfetto 出现了。说实话,第一次用的时候,我差点没反应过来:抓完 trace 手机几乎没温度,文件小了一大截,分析界面直接在浏览器里跑。嗯,这感觉对了。
2.1 Perfetto 的诞生背景
Perfetto 是 Google 在 2018 年推出的下一代性能分析工具。它的名字来自意大利语 "perfetto",意思是「完美」。虽然离完美还有距离,但相比 Systrace,它的进步是跨越式的。
为什么会诞生 Perfetto?说白了,Systrace 遇到了几个硬伤:
- 性能开销高——抓 trace 时系统明显变慢,影响分析准确性
- 数据源有限——主要靠 ftrace 和 atrace,想加自定义数据很麻烦
- 格式老旧——输出 HTML 文件,机器解析不友好,自动化困难
- 配置僵化——改个参数要重新输一长串命令
我参与过一个项目,线上出现间歇性掉帧,用 Systrace 抓了十几次都没抓到根因。后来换成 Perfetto 长时间后台录迹,才锁定是某个后台线程在特定条件下抢占了主线程 CPU 时间。那次之后,我就彻底转向 Perfetto 了。
2.2 与 Systrace 的核心差异
两者的差异,我用一个表格来对比,这样更直观:
| 对比维度 | Systrace | Perfetto |
|---|---|---|
| 推出时间 | 2012 年左右 | 2018 年(持续迭代至今) |
| 数据格式 | 文本 + HTML(systrace 报告) | Protobuf 二进制(.perfetto-trace) |
| 抓取开销 | 高(长时间抓取手机明显发热) | 低(后台抓取几乎无感) |
| 数据源 | ftrace + atrace(有限) | ftrace + atrace + heapprofd + traced + 自定义数据源 |
| 配置方式 | 命令行参数(每次修改需重输) | 配置文件(.pbtx 文本协议) |
| 分析界面 | 本地 HTML 文件 | Web UI(ui.perfetto.dev)或本地打开 |
| 适用场景 | 短时、快速验证 | 长时间录迹 + 深度分析 + 自动化流水线 |
你想想看,同样是抓 30 秒 trace,Systrace 可能会让系统帧率掉 10% 以上,而 Perfetto 可以控制在 2% 以内。这对于定位帧率抖动来说,太关键了——你不能让工具本身成为干扰源。
核心结论:Perfetto 不是 Systrace 的简单升级,而是从架构层面重新设计的一套性能分析体系。它的目标是「零扰动」录迹和「无限」数据源扩展。
2.3 Perfetto 的核心优势
我挑几个在帧率抖动定位中最常用的优势来说:
- 低开销长时间录迹——可以在后台连续抓取几分钟甚至几十分钟,非常适合复现偶发掉帧。
- 多数据源联合分析——同时看 CPU 调度、内存分配、IO 操作、GPU 渲染,一个问题多个角度交叉验证。
- 配置文件驱动——把抓取参数写成 .pbtx 文件,可以版本管理,团队复用。
- SQL 分析接口——Perfetto 内置了 SQLite 引擎,可以用 SQL 查询 trace 数据,做批量分析和自动化检测。
- 现代化的 Web UI——缩放、搜索、标记、对比,操作流畅度比 Systrace HTML 好太多。
小技巧:我个人习惯在配置文件中只开启需要的数据源,不要一股脑全开。比如只查帧率抖动,就只开 ftrace 和 gpu 相关的 track,能进一步降低开销。
2.4 从 Systrace 到 Perfetto 的迁移
如果你团队还在用 Systrace,我建议尽早开始迁移。命令行的变化其实不大:
Systrace 抓取命令:
python systrace.py -t 10 -o trace.html gfx input view
Perfetto 抓取命令:
perfetto -c /data/local/tmp/config.pbtx -o /data/local/tmp/trace.perfetto-trace
配置文件的写法也很直观,下面是一个简单的示例:
# config.pbtx
duration_ms: 10000
buffers: {
size_kb: 10240
}
data_sources: {
config: {
name: "linux.ftrace"
target_buffer: 0
}
}
data_sources: {
config: {
name: "android.gpu"
target_buffer: 0
}
}
注意:Perfetto 的配置文件对格式要求很严格,少一个冒号或者缩进不对都会导致启动失败。我曾经因为一个中文标点符号卡了半小时,建议用 VS Code 加 protobuf 插件来编辑。
2.5 实际案例:一次偶发掉帧的定位
最后分享一个真实例子。有个版本在用户反馈中偶尔出现列表滑动掉帧,QA 用 Systrace 抓了 20 次都没抓到。我换成 Perfetto,配置了 5 分钟的后台录迹,同时开启了 ftrace、gpu 和 heap 数据源。
抓到第三次时,trace 里出现了一个明显的帧间距拉长。通过 Perfetto UI 的「SQL 分析」功能,我查到了那个时间点的堆栈分配——是一个图片解码库在子线程持锁时间过长,导致主线程渲染被 Block。
嗯,那次修复之后,掉帧率从 3.2% 降到了 0.4%。如果没有 Perfetto 的低开销长时间录迹,这个问题可能到现在还查不出来。
Perfetto 的出现,让帧率抖动定位从「碰运气」变成了「有方法」。它的低开销特点,让我们能在真实用户场景下长时间录迹;它的丰富数据源,让我们能从多个维度交叉验证;它的现代化 UI,让分析过程更加高效。
说白了,如果你还在用 Systrace 做性能分析,是时候换个工具了。Perfetto 不仅能帮你更快定位问题,还能让你看到以前看不到的细节。