Android Perfetto 系列 15:Boot Trace、长时间现场 Trace 与偶发问题抓取
1 | { |
这里的 metadata 不替代 trace,它给排查者定位状况窗口、过滤版本、判断环境差异。第 13 篇已经讲过 App 侧如何补页面、业务阶段和使用者操作;现场证据包里的 metadata 要负责把这些业务 marker 对上。
summary.json 则是自动化入口,字段要能直接驱动 triage、上传和留存:
1 | { |
上述时间戳与数值仅用于展示字段关系:触发前 20 秒、触发后约 1 秒;真正的有效覆盖还要按 Trace 中最早保留的事件和 buffer loss 核对。summary.json 不写结论作文,只写机器可读状态。evidence_grade 可以按 A/B/C/D 分级:A 表示目的窗口、关键数据源、stats 和 metadata 都完整;B 指出有轻微 data loss 但核心判断可用;C 称只能保留方向性判断;D 表示 trace 只能用于环境记录。
长 Trace 还要写清时钟域。ftrace 常用 CLOCK_BOOTTIME,Android log 带 wall time,其他数据源可能经过 Perfetto 的 ClockSnapshot 同步。
外部 metadata 至少同时记录 elapsed realtime、wall time 和 boot id;更稳的做法是把 trigger 本身也写成 trace 内 Track Event。分析前如果看到 clock sync failure 或 invalid clock snapshot,跨统计结果源同步要降级处理。
裁剪优先发生在采集侧
Perfetto Trace 里有增量状态、track descriptor、stats、metadata。事后硬切二进制文件,很容易破坏解析。推荐顺序是:
- 用 Ring Buffer 控制“只保留最近窗口”。
- 用
stop_delay_ms控制触发后保留多久。 - 用
max_file_size_bytes控制文件上限。 - 上传完整状况窗口的原始 Trace。
- 业务端生成 summary、截图、SQL 结果,作为轻量索引。
如果必须离线裁剪,工具要按 TracePacket 重写,并保留必要 descriptor 和 stats。不要用 dd、文本截断、随机切 protobuf 字节流。
上传和清理策略
现场长 Trace 接近真实使用者环境,上传策略不能只考虑研发便利:
- 默认只在 Wi-Fi、充电或用户授权条件下上传。
- 文件超过阈值时先上传 summary,原始 trace 留在本地等待人工导出。
- log 按 tag 白名单采集,并在上传前脱敏。
- trace 文件设置 TTL,例如 3 天自动清理。
- trigger 同时使用 TraceConfig 的
max_per_24_h和用户端限流。 - 上传前跑
stats,把 data loss 写进 metadata。 - 不允许服务端下发任意 text proto 配置到用户设备,只允许选择审核过的 preset。
这些限制会减少临时调参空间,但能控制上传、隐私和稳定性风险。
分析前固定检查
拿到现场文件后,先确认 Trace 覆盖了触发点前后的目标时间,再查 stats 中与该场景相关的统计结果源。录制进程活了几小时,不等于文件里保留了几小时的有效事件。
本文由News整理发布,仅供参考。

