第4章 监控工具选型:Systrace、Perfetto、Instruments、Xcode Profiler
工欲善其事,必先利其器。动态化交付的启动速度优化,选对工具比一头扎进去瞎调试重要得多。我刚入行那会儿,拿着 Instruments 去追 Android 端的卡顿时间,折腾半天发现根本没用——不是工具不好,是没选对平台。所以今天这篇,我们就把主流工具撸一遍,说说它们各自适合什么场景、怎么配合着用。
4.1 选型先看平台,再看场景
你想想看,性能监控的本质是什么?是搞清楚这段时间 CPU/GPU/内存/调度都在干嘛。不同平台自带的能力差很多,我们按 OS 来画“势力范围”:
- Android:老牌 Systrace(SDK 自带),新型 Perfetto(Android 10+ 官方推荐)
- iOS:Instruments(Xcode 附带的性能分析神器),Xcode Profiler(其实是 Instruments 的 GUI 前端,但很多人单独叫它)
我个人习惯是根据调试颗粒度来选:想看全局帧率 → 直接上 Perfetto;追单个 UIKit 绘制 → 去 Instruments 的 Core Animation 模板。下面这张图帮你快速定位工具:
4.2 Android 双雄:Systrace vs Perfetto
Systrace 是老前辈了,Android 4.1 就开始内置。它通过 ftrace 内核机制捕捉调度、SurfaceFlinger、Input 事件。优点是兼容性好,Android 4 到 14 都能跑;缺点是数据量一上去就卡,而且不支持 SQL 查询。
Perfetto 是 Google 在 2019 年推出的下一代性能追踪系统。它比 Systrace 强在哪?我给你对比一下关键指标:
| 特性 | Systrace | Perfetto |
|---|---|---|
| 数据格式 | HTML / JSON(atrace 文本) | Protobuf 二进制(.perfetto-trace) |
| 分析能力 | 纯图形界面,靠肉眼扫 | SQL 查询 + 自动化直方图 |
| 收集时长 | 通常 10 秒内 | 可跑分钟级甚至连续录制 |
| 自定义标签 | 需调用 Trace.beginSection | 同样支持,且支持 track event |
记得我刚开始用 Perfetto 时,先跑了条 SQL 就查出了启动阶段最耗时的“包袱”:
-- 找出启动期间最长且没有子事件的 slice
SELECT name, dur
FROM slice
WHERE dur > 5000000
AND depth = 0
AND ts BETWEEN (SELECT ts FROM slice WHERE name = 'activityStart')
AND (SELECT ts + dur FROM slice WHERE name = 'activityStart')
ORDER BY dur DESC
LIMIT 5;
4.3 iOS 端的标配:Instruments & Xcode Profiler
Instruments 是 Xcode 自带的性能分析套件,内置模板多到让你眼花。我常用这几个:
- Time Profiler:定位 CPU 热点,找到启动阶段哪段代码吃掉了大部分时间
- Core Animation:监控帧率、离屏渲染、图层混合
- System Trace:像 Android 的 Perfetto,看系统调用、线程调度
- os_signpost:自定义埋点,配合 Instrument 的 Interval 模板
Xcode Profiler 这个叫法其实有点模糊。Xcode 14 后,苹果把调试导航栏里的性能面板重构了,直接叫“Profiler”。但底层跑的还是 Instruments 引擎。说白了,Xcode Profiler 是更易用的 UI 层,适合快速定点分析;Instruments 则更适合深入的系统级拆分。
启动场景下,我建议的自定义埋点写法(Swift):
// 在 AppDelegate.didFinishLaunching 开始阶段打点
os_signpost(.begin, log: OSLog(subsystem: "com.yourapp", category: "LaunchPerformance"),
name: "ColdStart",
signpostID: .exclusive)
// 在首帧渲染完成后打结束点
os_signpost(.end, log: OSLog(subsystem: "com.yourapp", category: "LaunchPerformance"),
name: "ColdStart",
signpostID: .exclusive)
然后用 Instruments 的「Hang Detection」模板就能直接看到 Waiting 阶段的时长。
4.4 实际投方案:你该怎么选?
别光记理论,我给你套实际经验总结:
- 纯 Android 项目:Perfetto 必上,Systrace 作为低版本保底。记得在 CI 里集成 Perfetto 的自动化录制脚本。
- 纯 iOS 项目:Time Profiler 走一遍,再用 Core Animation 查离屏渲染。Xcode Profiler 的「Performance」面板已经够用。
- Flutter / React Native 等跨端项目:核心逻辑层用各自的原生工具,JS 引擎层可以加 Profile.trace 或 DTrace。
- 线上监控:Tools 本身不适合线上,你需要用 metric_kit(iOS)或 Firebase Performance(Android)来做 A/B 对比。