第1章·Systrace简介:它从哪来,用在哪

做Android性能优化,你迟早会撞上一个“神器”——Systrace。
说白了,它就是一套轻量级的跟踪工具,能帮我们抓取系统在一段时间内干了什么。CPU在跑哪些线程?渲染管线卡在哪一步?V-Sync有没有掉帧?这些数据,Systrace都能告诉你。

我个人习惯称它为“性能问题的X光机”。
你想想看,没有它的时候,我真遇到过这样的场景:App突然掉帧,但Logcat里一片安静。我盯着代码一行行看,怎么也找不到根因。最后是Systrace一开,5秒就锁定了“主线程被Binder调用阻塞了200ms”。嗯,从那一刻起,我就再也不敢在性能优化中跳过Systrace了。

1.1 什么是Systrace

Systrace是Google在Android 4.1(Jelly Bean)时期推出的系统级跟踪工具。它基于Linux内核的ftrace机制,可以收集CPU调度、磁盘I/O、图形渲染、Binder通信等系统事件的时间戳与耗时。
开发者只需要运行一行命令,就能生成一个.html报告。在Chrome里打开,上下翻滚,就能看到五彩斑斓的线程时间轴——每个色块代表一个耗时片断,重叠、等待、丢帧一目了然。

避坑指南:我曾经误以为Systrace只能在root设备上用。其实非root设备也能抓,只是能跟踪的事件会少一些(比如缺少内核调度细节)。但日常分析常见的渲染问题,非root完全够用。

1.2 发展历史:从Systrace到Perfetto

说历史,其实很简单:Systrace是“老将”,Perfetto是“新王”。

  • Android 4.1~Android 9:Systrace统治时代。脚本systrace.py配合atrace,能抓30多个category。但文件大了以后,Chrome打开经常卡死。
  • Android 10+:Google推出Perfetto,取代Systrace。底层改用更高效的protobuf编码,支持流式记录、SQL分析、更细粒度的跟踪。同时提供ui.perfetto.dev在线分析器,不再依赖Chrome原生Trace Viewer。
  • 现在(Android 15):Perfetto已经成为官方第一优先工具。Systrace虽然还能用,但Google已停止维护。我的建议:新项目直接上Perfetto,老项目能迁移也尽快迁移。

我跟你讲个实际体验:以前用Systrace抓5秒的文件,Chrome加载要半分钟,稍微拖动一下就掉帧。换到Perfetto之后,同样数据量,打开几乎是秒级,而且还能用SQL做聚合查询——“找出所有超过8ms的VSync回调”,一条SQL搞定。爽快。

1.3 适用场景:什么时候该掏出Systrace/Perfetto

不是所有bug都要上跟踪工具。但下面这几个场景,我建议你第一时间想到它们:

场景典型表现跟踪能定位什么
帧率抖动(掉帧/卡顿)滑动列表、动画一卡一卡主线程耗时、渲染管线阻塞、GPU过载
启动速度慢冷启动超过2秒Application onCreate、Activity生命周期、ContentProvider加载
耗电异常App待机耗电快Alarm唤醒、WakeLock持有时长、网络请求频次
ANR(应用无响应)系统弹出“应用无响应”主线程长时间阻塞、死锁、Binder调用超时
触摸响应延迟点击后界面反应慢Input通道分发延迟、焦点切换耗时

我印象最深的是有一次线上反馈“锁屏后解锁掉帧”。我抓了一夜Systrace,发现是锁屏后有一轮全量ContentObserver回调,在主线程做了数据库查询。那个问题藏得很深,没有跟踪工具根本想不到是数据库操作导致的UI卡顿。

1.4 知识体系一图看

下面这张SVG图展示了Systrace/Perfetto在性能优化工作流中的位置与关系。你可以把它当成一张“认知地图”。

Systrace / Perfetto 知识体系 性能问题征兆 掉帧 / 启动慢 / 耗电 / ANR / 触摸延迟 Systrace(老) Android 4.1起 | ftrace + atrace Perfetto(新) Android 10+ | protobuf + SQL分析 数据兼容互转 跟踪数据分析 时间轴浏览 · Slice分析 · 线程状态 · 帧渲染阶段 定位根因 & 修复 红色:问题→橙色:修复

1.5 怎么选:Systrace vs Perfetto

我帮你整理一个对比表,方便决策:

维度SystracePerfetto
维护状态已停止更新Google主力维护
数据格式JSON / HTMLProtobuf(类似二进制)
文件解析速度慢(大文件Chrome炸)快(官方UI + SQL引擎)
内核事件依赖ftraceftrace + 自定义probe
分析灵活性仅可视化SQL查询 + 自定义指标
适用Android版本4.1 ~ 1310+(推荐14+)
是否开源是(但代码散落)是(github.com/google/perfetto)

我的建议:如果你正在维护一个Android 10以下的老项目,Systrace还能用,但尽量本地把数据转成Perfetto能读的格式。如果是新项目或者系统版本≥10,直接上Perfetto,别再走弯路了。我亲眼见过一个团队因为贪图Systrace“简单”,浪费了3天也没找到原因,换成Perfetto后一条SQL就锁定了问题。

1.6 你马上能做的小实验

  1. 手机连上电脑,打开开发者选项,USB调试。确保adb能用。
  2. 运行:
    adb shell perfetto -o /data/misc/perfetto-traces/test.trace -t 5s sched freq gfx view
    (抓5秒CPU调度+图形+View事件)
  3. 拉回文件:
    adb pull /data/misc/perfetto-traces/test.trace
  4. 打开浏览器访问 ui.perfetto.dev,把文件拖进去。你就能看到第一张时间轴图了。