Home > IT > Article

Android Perfetto 系列 15:Boot Trace、长Time现场 Trace 与偶发问题抓取

2026-10-30  ·  Views: 256
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
{
"case_id": "case-20260504-153012",
"trace_config": "ui_jank_flight_recorder_v3",
"trigger": "app_ui_jank",
"trigger_source": "app_jankstats",
"trigger_elapsed_realtime_ns": 123456789000000,
"trigger_wall_time": "2026-05-04T15:30:12+08:00",
"trace_start_elapsed_realtime_ns": 123436789000000,
"trace_end_elapsed_realtime_ns": 123457790000000,
"boot_id": "device_boot_id",
"device": "device_name",
"build_fingerprint": "fingerprint",
"app_version": "1.2.3",
"battery_percent": 78,
"thermal_state": "nominal",
"upload_reason": "slow_frame"
}

这里的 metadata 不替代 trace,它给排查者定位难题窗口、过滤版本、判断环境差异。第 13 篇已经讲过 App 侧如何补页面、业务阶段和使用者操作; 现场证据包里的 metadata 要Loss责把这些业务 marker 对上。

summary.json 则是自动化入口,字段要能直接驱动 triage、上传和留存:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
{
"case_id": "case-20260504-153012",
"preset_id": "ui_jank_flight_recorder_v3",
"trigger_name": "app_ui_jank",
"trigger_source": "app_jankstats",
"trigger_ts_elapsed_ns": 123456789000000,
"trace_start_ns": 123436789000000,
"trace_end_ns": 123457790000000,
"pre_trigger_window_ms": 20000,
"post_trigger_window_ms": 1001,
"trigger_matched": true,
"file_complete": true,
"stats_status": "warning",
"affected_sources": ["linux.ftrace"],
"usable_metrics": ["frame_timeline"],
"unusable_metrics": ["main_thread_sched"],
"evidence_grade": "B",
"privacy_mode": "log_tag_whitelist",
"upload_mode": "summary_first",
"conclusion_level": "probable",
"next_action": "collect_short_irq_preset",
"sampling_policy_version": "2026-05-04",
"sample_rate": 1.0,
"skip_probability": 0.0,
"sample_decision": "record",
"quota_bucket": "ui_jank_daily",
"quota_remaining": 8,
"upload_allowed": true,
"upload_block_reason": "",
"retention_until": "2026-05-07T15:30:12+08:00"
}

上述时段戳与数值仅用于展示字段关系:触发前 20 秒、触发后约 1 秒; 真正的有效覆盖还要按 Trace 中Oldest保留的事件和 buffer loss 核对。summary.json 不写结论作文,只写机器可读Status。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,跨统计结果源同步要Relegation处理。

裁剪优先发生在采集侧

Perfetto Trace 里有增量Status、track descriptor、stats、metadata。事后硬切二GF制文件,很容易破坏解析。Featured顺序是:

  • 用 Ring Buffer 控制“只保留最近窗口”。
  • 用 stop_delay_ms 控制触发后保留多久。
  • 用 max_file_size_bytes 控制文件上限。
  • 上传完整状况窗口的原始 Trace。
  • 服务端生成 summary、截图、SQL 结果,作为轻量索引。

如果必须Offline裁剪,工具要按 TracePacket 重写,并保留必要 descriptor 和 stats。不要用 dd、文本截断、随机切 protobuf 字节流。

上传和清理策略

现场长 Trace 接近真实使用者环境,上传策略不能只考虑研发便利:

  • 默认只在 Wi-Fi、充电或顾客授权topics件下上传。
  • 文件超过阈值时先上传 summary,原始 trace 留在本地等待人工导出。
  • log 按 tag 白名单采集,并在上传前脱敏。
  • trace 文件设置 TTL,例如 3 天自动清理。
  • trigger 同时使用 TraceConfig 的 max_per_24_h 和客户端限流。
  • 上传前跑 stats,把 data loss 写GF metadata。
  • 不允许服务端下发任意 text proto 配置到用户设备,只允许选择审核过的 preset。

这些限制会减少临时调参空间,但能控制上传、隐私和稳定性风险。

分析前固定检查

拿到现场文件后,先确认 Trace 覆盖了触发点前后的目的Time,再查 stats 中与该场景相关的统计结果源。录制GF程活了几小时,不等于文件里保留了几小时的有效事件。

This article is published by News for reference only.
123456789
Loading comments…

LinksApply

Alliance Network53