首页 > 技术 > 正文

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

2026-10-30  ·  阅读:260
1
2
echo 'activate_triggers: "app_ui_jank"' | \
adb shell perfetto --txt -c -

STOP trigger 适合“根因在触发之前”的议题,比如慢帧、ANR 前兆、音频 underrun。START trigger 适合“事件发生后还要继续观察”的状况,比如温度进入 hot 状态后继续抓 10 秒。

使用 START trigger 时,不要再同时配置普通 duration_ms;触发窗口由 trigger_config 管。

trigger 未命中的收尾也要写进工具链。按 TraceConfig 的官方语义,STOP_TRACING 和 START_TRACING 在 trigger_timeout_ms 到期且没有任何 trigger 命中时,session 会被停止且不返回统计结果——输出文件是空的,这是设计行为,不是采集失败。脚本要把这种结果显式记录成 trigger_matched=false 并清理空文件,不要把空 trace 当成“没有发生难题”的证据。反过来,trigger 一旦命中,session 在 stop_delay_ms 后就结束了;要维持长期 flight recorder 覆盖,平台侧要有守护逻辑负责重启下一轮 session,并给每轮生成新的 case id 和输出文件名,避免覆盖上一次现场。

snapshot 适合调参

有些场景不想停止原 Trace,只想每隔几秒拿一张当前窗口的快照,例如调 CPU policy、thermal 参数、电源策略。--clone-by-name 这个命令行入口是 Perfetto v49.0 加入的;session 克隆能力本身也要 Android 14+ 的平台侧支持或厂商合入,最终以 adb shell perfetto --help / --version 为准。

配置里给 session 起名:

1
2
3
4
5
6
unique_session_name: "thermal_snapshot"

buffers {
size_kb: 65536
fill_policy: RING_BUFFER
}

启动后,按需克隆当前 Ring Buffer。原 session 会继续运行:

1
2
3
4
adb shell perfetto --clone-by-name thermal_snapshot \
-o /data/misc/perfetto-traces/thermal_snap_1.pftrace

adb pull /data/misc/perfetto-traces/thermal_snap_1.pftrace

snapshot 不是问题现场的唯一方案。它适合“反复观察走向”的实验,不适合需要一次性封存事故现场的触发型问题。

detached mode 少用

--detach 会让 tracing session 脱离 perfetto 命令生命周期,由 traced 业务继续持有 session。官方文档明确不推荐常规使用,因为它容易泄漏 session,让设备长时段处在 tracing 状态。

必须用 detached mode 时,配置里要打开 write_into_file,并准备检查和停止命令:

1
2
3
4
5
6
adb shell perfetto --detach=field_session --txt \
-c /data/misc/perfetto-configs/field.pbtxt \
-o /data/misc/perfetto-traces/field.perfetto-trace

adb shell perfetto --is_detached=field_session
adb shell perfetto --attach=field_session --stop

工程脚本里要有兜底清理:启动前检查旧 session,测试结束后停止 session,超过 TTL 自动停止。

Bugreport 是现场兜底入口

现场问题经常由使用者、测试或运维先触发 bugreport。需要跟 bugreport 合包的长 Trace,要在 TraceConfig 里显式声明:

1
2
3
4
5
6
7
8
unique_session_name: "field_ui_jank_bugreport"
bugreport_score: 100
bugreport_filename: "field-ui-jank.pftrace"

buffers {
size_kb: 65536
fill_policy: RING_BUFFER
}

bugreport_score > 0 才会成为 bugreport 候选;分数越高,越优先被保存。bugreport_filename 从 Android 15 / Perfetto v42 起可用于 --save-all-for-bugreport 的可读文件名,旧版本会按默认名字保存。它和普通 -o /path/trace.perfetto-trace、--upload 是不同路径:前者服务兼容 bugreport,后两者服务本次命令输出或 framework reporting。

研发或平台脚本可以用这两条命令验证 bugreport 行为:

1
2
adb shell perfetto --save-for-bugreport
adb shell perfetto --save-all-for-bugreport

Android 12/13 上,bugreport 保存会取走 trace 资讯并提前停止 session;Android 14 及以上版本会创建只读 snapshot,原 session 可以继续运行。报告里要写清 Android 版本和验证命令输出,不要把 bugreport 合包当成普通后台 trace 的等价路径。

现场证据包里应该有什么

只拿 .perfetto-trace 不够。现场证据包至少要能回答“这是什么场景、什么时候触发、文件是否完整”。

1
2
3
4
5
6
7
case-20260504-153012/
trace.perfetto-trace
config.pbtxt
metadata.json
stats.sql.txt
log_excerpt.txt
summary.json

metadata.json 提议包含这些字段:

本文由News整理发布,仅供参考。

123456789
评论加载中…

友情链接申请友链

联盟矩阵53