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 真正让我离不开的几个核心能力:

  1. 多数据源统一采样——CPU 调度、系统调用、进程内存、GPU 活动、I/O、网络、电池、FrameTimeline……你可以同时开启几十个 probe,所有数据按同一个时间戳对齐。这在分析复杂交互流程时特别管用。
  2. 强大的 TraceProcessor + SQL——这是 Perfetto 最酷的地方。所有 trace 数据导入后自动变成 SQLite 表,你可以直接写 SELECT 语句计算“应用启动期间 Binder 调用的耗时分布”或者“连续丢帧时刻的 CPU 频率”。不需要写 C 扩展,不需要搞脚本解析。
  3. 低开销设计——用户态 traced 进程采用共享内存、写时拷贝、批量传输等机制,对系统性能影响极小。我实测过开启 10 个常规 probe 后,整体 CPU 负载增加不到 0.5%。
  4. 可视化与分享——trace 文件是独立的 .perfetto-trace 格式,可以压缩分享。在 ui.perfetto.dev 上打开就能看到时间轴、选择区域、添加标记、导出 SVG 报告。团队协作时,直接甩一个 trace 文件,对方在浏览器里打开,省去环境配置的麻烦。
  5. 自定义注入与插件——你可以在自己的 App 或系统服务里通过 TrackEvent API 插入自定义切片,然后在 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 在整个性能分析体系中的定位,以及它和传统工具、核心能力的关系:

Perfetto 全景框架图 Perfetto systrace simpleperf 多数据源统一采集 TraceProcessor + SQL 可视化 UI 优势:低开销 / 可扩展 / 全栈对齐 替代 systrace + simpleperf 的碎片化分析 systrace/simpleperf → Perfetto 的演化本质:从分散采集到统一分析