3. Perfetto简介与相比Systrace的优势

做性能分析的人,基本都跟Systrace打过交道。但说实话,用久了你会发现它有些地方挺让人头疼的——数据源有限、没法长时间抓取、分析起来也不够灵活。Perfetto就是Google为了解决这些问题而推出的下一代工具。我最早接触Perfetto是在一个Android大版本升级的项目中,当时Systrace已经扛不住我们复杂的trace需求了,硬着头皮切过去,结果发现真香。

3.1 Perfetto是什么?

Perfetto(意大利语“完美”的意思)是Google开发的跨平台性能追踪与分析套件。它从Systrace的骨架上做了彻底重构,支持Android、Linux、Chrome OS甚至macOS。说白了,它就是一个更强大、更现代、更好用的“Systrace Pro”。

它的核心组件包括:

  • 数据源层:支持ftrace、atrace、heapprofd(堆分析)、perf(硬件计数器)、logcat等
  • 守护进程(traced):在设备上负责收集和缓存trace数据
  • 命令行工具(perfetto):用于配置和启动追踪
  • Web UI(ui.perfetto.dev):可视化分析界面,支持SQL查询
  • SDK:允许开发者自定义track数据源
提示:如果你还在用Systrace抓trace,我建议尽快切换到Perfetto。Google已经明确表示Systrace将被废弃,新功能只会加到Perfetto里。

3.2 Perfetto vs Systrace:一张表看懂差异

我整理了一个对比表格,把核心差异列出来。你对比着看,就很清楚为什么要换工具了。

对比维度 Systrace Perfetto
数据源扩展性 固定支持ftrace/atrace,不可扩展 支持自定义数据源(通过SDK或protobuf协议)
追踪时长 通常不超过30秒,超时易丢数据 支持数十分钟甚至数小时的长时间追踪
文件大小 几十MB已是极限 轻松处理GB级数据,支持流式解析
分析能力 只能看时间轴和基本event 内置SQLite引擎,可写SQL做自定义分析
跨平台支持 仅Android Android + Linux + Chrome OS + macOS
UI交互 Chrome内置tracing页面,功能有限 独立Web UI,支持缩放、搜索、标记、统计
内存分析 不支持 内置heapprofd,可分析native内存分配

你看,从Systrace到Perfetto,几乎是全方位的升级。尤其是自定义数据源和SQL分析这两个能力,我在项目里用得非常频繁。

3.3 核心优势详解

3.3.1 更丰富的追踪数据源

Systrace只能抓ftrace和atrace两个数据源。Perfetto除了这两个,还支持:

  • heapprofd:追踪native堆内存分配,定位内存泄漏
  • perf:基于perf_event_open的硬件计数器采样
  • logcat:将logcat日志嵌入trace时间线
  • 自定义数据源:通过protobuf协议,让你的业务代码也能输出trace事件

我记得有一次排查开机启动慢的问题,Systrace只能看到系统服务调度,但无法知道我们自己的app在初始化阶段做了什么。我用Perfetto的SDK在代码关键路径加了自定义track,一下子就定位到是某个第三方库的同步IO拖慢了启动。这个痛点,Systrace根本没辙。

3.3.2 长时间追踪与超大文件处理

Systrace抓超过30秒就容易崩,而且生成的文件超过100MB基本就打不开了。Perfetto支持几十分钟甚至几个小时的连续追踪,文件大小可以到GB级。

为什么能扛住?因为Perfetto在设备端使用了环形缓冲区,并且分析端采用流式解析,不需要把整个文件都加载到内存。我自己用过一次长达2小时的trace,文件6.2GB,Perfetto UI依然可以流畅拖拽和缩放。换成Systrace,早就out of memory了。

3.3.3 SQL驱动的深度分析

这可能是Perfetto最让我惊喜的特性。它内置了SQLite数据库,所有trace数据都被组织成表。你可以直接写SQL查询来提取感兴趣的信息:

-- 查找所有耗时超过10ms的Binder调用
SELECT 
  name, 
  dur / 1e6 AS duration_ms 
FROM 
  slices 
WHERE 
  name GLOB 'binder*' 
  AND dur > 10e6 
ORDER BY 
  dur DESC 
LIMIT 20;

说白了,Systrace只能给你一张“照片”,Perfetto给了你一张可以编程操作的“电子表格”。我在做UI卡顿分析时,经常用SQL统计每个线程的CPU占用、锁等待时长、帧渲染超时次数等。相比手动数时间轴,效率提升了至少一倍。

避坑指南:我曾经在分析一个OOM问题时,用Systrace抓了半天也没看出所以然。换成Perfetto的heapprofd,配合SQL查询分配栈的聚合信息,五分钟就找到了泄露点——某个图片缓存池没有做LRU清理。嗯,从那以后我排查内存问题就没再用过Systrace了。

3.3.4 更强大的可视化与交互

Perfetto的Web UI(ui.perfetto.dev)比Systrace的Chrome内置页面好用太多:

  • 智能缩放:快捷键W/S放大缩小,用鼠标滚轮就能纵向展开track组
  • 搜索高亮:输入关键词后所有匹配项高亮显示,还有计数
  • 选区统计:选中一段时间,自动统计该区间内各项指标(CPU、磁盘IO、线程唤醒等)
  • 书签与注释:可在时间轴上添加标记,方便团队协作讨论
  • 导出与共享:支持导出HTML报告或JSON数据,方便远程分析

你想想看,以前用Systrace排查问题,经常要在几十秒的trace里用肉眼找异常点。现在选中可疑区间,直接看统计数据,效率完全不同。

3.4 Perfetto的整体架构

为了更好地理解它的设计,我画了一张架构图。Perfetto分为三层:数据源层、服务层、分析层。每层各司其职,而且支持插件化扩展。

Perfetto 三层架构 数据收集 → 服务处理 → 分析展示 数据源层 (Producers) ftrace atrace heapprofd perf 自定义SDK logcat / 其他protobuf源 服务层 (Service) traced 守护进程 数据缓存+环形缓冲区 配置与触发 trace.config / 命令行 Tracing SDK API + protobuf协议 分析层 (Consumer) Web UI (ui.perfetto.dev) SQLite查询引擎 CLI / Python API

3.5 使用场景与选型建议

什么情况下应该用Perfetto?我总结了几类典型场景:

  1. 应用启动优化:用atrace+自定义SDK抓冷启动全过程,定位哪个阶段耗时最长
  2. UI卡顿/丢帧:开启Choreographer帧率跟踪,结合SQL查帧渲染超时原因
  3. 内存泄漏排查:heapprofd抓native分配,SQL分析堆栈聚合
  4. 长时间后台行为分析:连续追踪数十分钟,看后台唤醒、锁竞争、功耗等
  5. 跨进程异常定位:利用Binder、IPC事件序列,理清调用链

如果你还在做Android 9以下的旧项目,并且Systrace够用,那不一定非要强切。但新项目——尤其是Android 10+、内核调优、大型应用优化——我建议直接用Perfetto,省得后面还要迁移。

注意事项:Perfetto虽然强大,但配置比Systrace稍微复杂一点。你需要熟悉protobuf格式的trace config,建议从官方提供的模板开始改。另外,生产环境抓trace要注意隐私合规,不要意外抓到用户敏感信息。

说实话,刚转到Perfetto时我也有过抱怨:为什么不能像Systrace一样一行命令搞定?但用了两周后,我再也回不去了。它的灵活性和分析深度,是Systrace完全无法比的。尤其是SQL分析,让我能像查数据库一样查系统性能——这种体验,做性能优化的你应该试试。