第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在性能优化工作流中的位置与关系。你可以把它当成一张“认知地图”。
1.5 怎么选:Systrace vs Perfetto
我帮你整理一个对比表,方便决策:
| 维度 | Systrace | Perfetto |
|---|---|---|
| 维护状态 | 已停止更新 | Google主力维护 |
| 数据格式 | JSON / HTML | Protobuf(类似二进制) |
| 文件解析速度 | 慢(大文件Chrome炸) | 快(官方UI + SQL引擎) |
| 内核事件 | 依赖ftrace | ftrace + 自定义probe |
| 分析灵活性 | 仅可视化 | SQL查询 + 自定义指标 |
| 适用Android版本 | 4.1 ~ 13 | 10+(推荐14+) |
| 是否开源 | 是(但代码散落) | 是(github.com/google/perfetto) |
我的建议:如果你正在维护一个Android 10以下的老项目,Systrace还能用,但尽量本地把数据转成Perfetto能读的格式。如果是新项目或者系统版本≥10,直接上Perfetto,别再走弯路了。我亲眼见过一个团队因为贪图Systrace“简单”,浪费了3天也没找到原因,换成Perfetto后一条SQL就锁定了问题。
1.6 你马上能做的小实验
- 手机连上电脑,打开开发者选项,USB调试。确保adb能用。
- 运行:
(抓5秒CPU调度+图形+View事件)adb shell perfetto -o /data/misc/perfetto-traces/test.trace -t 5s sched freq gfx view - 拉回文件:
adb pull /data/misc/perfetto-traces/test.trace - 打开浏览器访问
ui.perfetto.dev,把文件拖进去。你就能看到第一张时间轴图了。