第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 的核心优势

我挑几个在帧率抖动定位中最常用的优势来说:

  1. 低开销长时间录迹——可以在后台连续抓取几分钟甚至几十分钟,非常适合复现偶发掉帧。
  2. 多数据源联合分析——同时看 CPU 调度、内存分配、IO 操作、GPU 渲染,一个问题多个角度交叉验证。
  3. 配置文件驱动——把抓取参数写成 .pbtx 文件,可以版本管理,团队复用。
  4. SQL 分析接口——Perfetto 内置了 SQLite 引擎,可以用 SQL 查询 trace 数据,做批量分析和自动化检测。
  5. 现代化的 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 与 Systrace 关系与差异 Android 性能分析需求 Systrace(旧工具) Perfetto(新工具) 高开销 · 数据源有限 低开销 · 数据源丰富 帧率抖动精准定位 💡 演进关系:Systrace → Perfetto,不是替代,而是从架构到体验的全面革新。 Perfetto 继承了 Systrace 的核心分析思路,但在性能、扩展性和易用性上全面超越。

Perfetto 的出现,让帧率抖动定位从「碰运气」变成了「有方法」。它的低开销特点,让我们能在真实用户场景下长时间录迹;它的丰富数据源,让我们能从多个维度交叉验证;它的现代化 UI,让分析过程更加高效。

说白了,如果你还在用 Systrace 做性能分析,是时候换个工具了。Perfetto 不仅能帮你更快定位问题,还能让你看到以前看不到的细节。