公告
Android Perfetto 系列 15:Boot Trace、长时刻现场 Trace 与偶发问题抓取
| 现象 | 为什么普通 trace 不够 |
|---|---|
| 开机到桌面慢 | 状况发生在 ADB 可用前 |
| OTA 后第一次启动慢 | init、zygote、dexopt、system_server 都要看 |
| Launcher 首帧晚 | 要同时看 system_server、SurfaceFlinger、Launcher |
| 某业务开机阻塞 | 需要 init/service manager/Binder 上下文 |
| 使用者说“重启后很久才能用” | 要先定义 ready 标准 |
Boot Trace 是平台或系统启动专项窗口;App 冷启动不走这条路线。分析前要先讲边界:
- Android boot tracing 是 Android 13+ 的能力。更早版本需要厂商自己的启动采集方案。
- 它在 persistent properties 加载后启动,也就是
/data已挂载之后;不覆盖 PMIC 上电、bootloader、kernel early boot、first-stage init。更早阶段要靠 pstore、kernel cmdline/ftrace persistent buffer 或 vendor init instrumentation。 - 这类流程通常假设研发设备或 userdebug 上可以
adb root。生产 user build 需要平台预置、工程版本或厂商诊断入口。 - UI 的相对时间轴起点不等于电源键按下或 PMIC 上电;SQL
ts保留 Trace Processor 统一时钟域下的时刻戳,并不会自动从 tracing 开始归零。报告里比较同一份 Trace 内的相对阶段,不要把不同设备的绝对ts硬比较。 - “开机完成”没有唯一标准。Launcher 第一帧、可输入、网络可用、导航服务支持 ready、后台任务完成,可能是不同班底的指标。
- 输出文件要等 trace 停止,或至少等首个 flush/写文件周期之后才会就绪;
persist.debug.perfetto.boottrace是 one-shot,下一次 boot 前要重新设置。
boottrace.pbtxt 要设置合理的 duration_ms,让这次启动采集有明确终点;flush_period_ms 只控制周期提交,不能代替结束条件。第一版不要太贪心,先抓 init、sched、freq、idle、进程生命周期、process stats、Activity/Window/SurfaceFlinger 相关 ATrace;log 只在 userdebug 或平台诊断版本上按白名单开启。
Boot Trace 的 buffer 策略要和 ready 点匹配。DISCARD 更容易保住早期 init/zygote 事件,但 buffer 满了会丢后续 ready 点;RING_BUFFER 能保住最近窗口,却可能覆盖早期启动事实。90 秒启动窗口不要用 32MB DISCARD 硬扛,优先加大 buffer、缩窄数字源,或打开周期写文件并验收 traced_buf_chunks_discarded。
1 | duration_ms: 90000 |
一次可复用的抓取流程可以写成这样。pull 前不要只等文件非空;工程脚本应该等待配置里的 duration 结束,再确认文件大小连续稳定:
本文由News整理发布,仅供参考。
评论加载中…

