第4章 监控工具选型:Systrace、Perfetto、Instruments、Xcode Profiler

工欲善其事,必先利其器。动态化交付的启动速度优化,选对工具比一头扎进去瞎调试重要得多。我刚入行那会儿,拿着 Instruments 去追 Android 端的卡顿时间,折腾半天发现根本没用——不是工具不好,是没选对平台。所以今天这篇,我们就把主流工具撸一遍,说说它们各自适合什么场景、怎么配合着用。

核心观点:没有万能的工具,只有最合适的组合。Android 端看 Systrace / Perfetto,iOS 端靠 Instruments / Xcode Profiler,混搭项目学会跨平台交叉验证。

4.1 选型先看平台,再看场景

你想想看,性能监控的本质是什么?是搞清楚这段时间 CPU/GPU/内存/调度都在干嘛。不同平台自带的能力差很多,我们按 OS 来画“势力范围”:

  • Android:老牌 Systrace(SDK 自带),新型 Perfetto(Android 10+ 官方推荐)
  • iOS:Instruments(Xcode 附带的性能分析神器),Xcode Profiler(其实是 Instruments 的 GUI 前端,但很多人单独叫它)

我个人习惯是根据调试颗粒度来选:想看全局帧率 → 直接上 Perfetto;追单个 UIKit 绘制 → 去 Instruments 的 Core Animation 模板。下面这张图帮你快速定位工具:

监控工具选型决策树 启动速度性能监控 Android 平台 iOS / macOS 平台 Systrace (旧) Perfetto (新) Instruments Xcode Profiler 低版本兼容 深度分析/流水线 系统级追踪 快速调试 💡 选型建议 Android 10+ 优先上 Perfetto,低版本用 Systrace 兜底 iOS 首选 Instruments Time Profiler + 自定义 os_signpost 埋点 图:工具选型决策树 | 核心依据:平台 + 分析深度

4.2 Android 双雄:Systrace vs Perfetto

Systrace 是老前辈了,Android 4.1 就开始内置。它通过 ftrace 内核机制捕捉调度、SurfaceFlinger、Input 事件。优点是兼容性好,Android 4 到 14 都能跑;缺点是数据量一上去就卡,而且不支持 SQL 查询。

我的习惯:测试老机型(Android 8 以下)时,我必用 Systrace。但但凡项目高于 Android 10,我肯定推荐 Perfetto。

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;
注意:Perfetto 的录制配置支持 ftrace 数据源 + 堆内存 💥 追踪,但会显著增加电量消耗。线上产品慎用全量录制,最好只在 debug 版本跑。

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 则更适合深入的系统级拆分。

我曾经踩过的坑:在 iOS 14 上,我直接用 Xcode Profiler 的 Energy Log 去检查启动电量,结果发现数据是 0。后来才发现,必须要在设备设置里手动开启“开发者模式”,并且拔掉数据线才能采集真实数据。嗯,这里一定要注意。

启动场景下,我建议的自定义埋点写法(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 实际投方案:你该怎么选?

别光记理论,我给你套实际经验总结:

  1. 纯 Android 项目:Perfetto 必上,Systrace 作为低版本保底。记得在 CI 里集成 Perfetto 的自动化录制脚本。
  2. 纯 iOS 项目:Time Profiler 走一遍,再用 Core Animation 查离屏渲染。Xcode Profiler 的「Performance」面板已经够用。
  3. Flutter / React Native 等跨端项目:核心逻辑层用各自的原生工具,JS 引擎层可以加 Profile.trace 或 DTrace。
  4. 线上监控:Tools 本身不适合线上,你需要用 metric_kit(iOS)或 Firebase Performance(Android)来做 A/B 对比。
我的铁三角组合:Perfetto 查系统全局瓶颈 + Instruments Time Profiler 扣细节 + 自定义 os_signpost/Trace 做定点切片。三管齐下,90% 的启动问题半小时内定位。