1. Perfetto 简介
说起 Android 性能分析,以前大家第一反应是 systrace,再深入一点用 simpleperf 做 CPU 采样。但说实话,用久了你就会发现——这两个工具各管一摊,数据割裂,分析起来特别累。Perfetto 的出现,说白了就是把整个性能分析管线给统一了。
我个人习惯是先讲清楚它能做什么,再谈细节。Perfetto 是 Google 在 Android 10 之后主推的全平台性能追踪与分析框架。它不光是 systrace 的替代品,更是一个从内核到应用层、从采集到分析的全链路方案。
1.1 什么是 Perfetto
Perfetto 这个名字来自意大利语“完美”(perfetto),嗯,虽然实际用起来还没到完美,但理念上确实想一统天下。它的核心包含三部分:
- 数据采集端(traced)——运行在设备上,负责从内核 ftrace、atrace、sched、GPU、内存、文件系统等源头拉取 trace 数据。
- 数据处理管道(trace processor)——把原始二进制 trace 解析成可查询的 SQLite 数据库,方便你写 SQL 做复杂分析。
- 可视化前端(ui.perfetto.dev)——一个基于 Web 的 UI,拖入 trace 文件就能看到时间轴、切片、计数器、火焰图等等。
我最早接触 Perfetto 是在调一个开机启动性能的 case,systrace 只能看大概,而 Perfetto 把 init 进程的每个 stage、每个文件读写耗时都清晰标了出来——那一刻我就知道,这工具值得深挖。
1.2 与 systrace / simpleperf 的关系
很多人会问:既然有了 systrace,为什么还要用 Perfetto?我直接拿一张对比表来回答:
| 维度 | systrace | simpleperf | Perfetto |
|---|---|---|---|
| 定位 | 轻量级 trace 视图 | CPU Profiling 专用 | 全栈统一 trace & profiling |
| 数据源 | atrace + 部分 ftrace | perf_event_open + 硬件计数器 | ftrace + atrace + heapprofd + 自定义数据源 |
| 分析能力 | 基本时间轴 + 鼠标缩放 | 采样报告 + 火焰图 | 时间轴 + SQL 查询 + 自定义指标 + 火焰图 + 堆分析 |
| 扩展性 | 低(几乎不可自定义) | 中(可用脚本辅助) | 高(插件、TraceProcessor 自定义分析) |
| 版本支持 | Android 4.1+ | Android 5.0+ | Android 9+(推荐 10+) |
看到没?systrace 就像一个固定视角的监控摄像头,你只能看它拍到的画面。而 Perfetto 是一套完整的监控系统,所有数据都存在数据库里,你想怎么查就怎么查。
至于 simpleperf,它在纯 CPU 采样和硬件计数器方面依然有优势,但 Perfetto 的 perf 数据源已经可以做到类似的功能,并且能和 ftrace 事件在同一个时间轴上对齐。我曾经在分析一场卡顿问题时,同时开了 perf 和 heapprofd,用一条 SQL 就找到了“哪个函数分配了大量内存导致 GC 触发频繁”——这在过去要分别跑 simpleperf + 内存分析工具,然后人工拼时间轴,太折磨了。
1.3 核心功能与优势
讲完关系,我来总结一下 Perfetto 真正让我离不开的几个核心能力:
- 多数据源统一采样——CPU 调度、系统调用、进程内存、GPU 活动、I/O、网络、电池、FrameTimeline……你可以同时开启几十个 probe,所有数据按同一个时间戳对齐。这在分析复杂交互流程时特别管用。
- 强大的 TraceProcessor + SQL——这是 Perfetto 最酷的地方。所有 trace 数据导入后自动变成 SQLite 表,你可以直接写
SELECT语句计算“应用启动期间 Binder 调用的耗时分布”或者“连续丢帧时刻的 CPU 频率”。不需要写 C 扩展,不需要搞脚本解析。 - 低开销设计——用户态
traced进程采用共享内存、写时拷贝、批量传输等机制,对系统性能影响极小。我实测过开启 10 个常规 probe 后,整体 CPU 负载增加不到 0.5%。 - 可视化与分享——trace 文件是独立的
.perfetto-trace格式,可以压缩分享。在 ui.perfetto.dev 上打开就能看到时间轴、选择区域、添加标记、导出 SVG 报告。团队协作时,直接甩一个 trace 文件,对方在浏览器里打开,省去环境配置的麻烦。 - 自定义注入与插件——你可以在自己的 App 或系统服务里通过
TrackEventAPI 插入自定义切片,然后在 Perfetto 里看到自己的业务逻辑时间线。我在做某视频 App 的播放起播优化时,就是靠这个把“网络请求→解码器初始化→首帧渲染”的每个子阶段标出来,最终找到瓶颈是信号量超时等待。
一句话总结:Perfetto 不再是“另一个 trace 工具”,而是一个性能分析基础设施。它把过去分散在 systrace、simpleperf、meminfo、dumpsys 里的信息,用一个统一的管道输送到 SQL 数据库里供你深挖。
我的个人小经验:刚开始接触的时候别急着学那些复杂的 SQL 查询。先跑一个简单的 10 秒钟 trace,在 ui.perfetto.dev 上拖动 zoom,看看 CPU 频率和调度图怎么互动。等你对时间轴有感觉了,再去看 SQL 表结构。循序渐进,不然容易晕。
注意:Perfetto 对 Android 版本有要求。Android 9 上只能用部分功能(如 ftrace),Android 10+ 才完整支持 heapprofd、perf 数据源和 TrackEvent。如果你的项目还在 Android 8/9 上跑,可以考虑用 perfetto --txt 配置模式做一些基础 trace。我曾经在适配一个 Android 9 的平板时,发现 heapprofd 根本打不开,查半天才知道需要内核 CONFIG_PERF_EVENTS 选项,教训啊。
知识结构一览
下面这张图展示了 Perfetto 在整个性能分析体系中的定位,以及它和传统工具、核心能力的关系: