Android Perfetto 系列 15:Boot Trace、长时间现场 Trace 与偶发问题抓取
现场测试经常会断 USB。普通现场长 Trace 优先用 --background-wait,它会等 data source 启动后再返回 PID,比直接 --background 少丢开头。
Android 12 及以上设备可将配置放进 /data/misc/perfetto-configs,再启动后台 trace;具体写入权限仍以设备为准:
1 | adb push field.pbtxt /data/misc/perfetto-configs/field.pbtxt |
如果 Android 12–17 的目的设备无法使用上述配置路径,也可以从 stdin 传入配置。生产 M2M 工具链更应该用审核过的 preset 或 binary TraceConfig,而不是让服务端下发任意文本配置:
1 | PID=$(adb shell perfetto --background-wait --txt \ |
停止时不要 kill 后立刻 adb pull。Perfetto 还要把尾部统计结果写完。至少等 perfetto 进程退出,并确认文件存在且大小稳定后再拉取:
1 | case "$PID" in |
如果脚本能控制两端,可以在发 kill 前启动 inotifyd 监听 close_write;设备上没有 inotifyd 时,在进程已退出后用连续大小稳定作为 fallback。文件大小稳定本身不是关闭证明;trigger 未命中、启动失败或文件为空时应有超时并退出,不能无限等待或继续拉取。
trigger 怎么用
Perfetto trigger 的价值是权限隔离:有权限的一方提前声明 trigger 名称和行为;普通 App 或系统组件只报告“事件发生了”,不能决定抓什么、抓多大、传哪里。
现场方案要把 trigger emitter 写清楚。UI jank 可以由 App 侧 JankStats / FrameMetrics / 自研阈值检测后激活 app_ui_jank,也可以由平台服务或测试 harness 代理激活。无论哪条路,都要做去重和限流,并在 metadata 里记录 trigger source、触发时刻和判断阈值。
App emitter 协议建议固定成一条 JSON 事件,并同时写入同 event_id 的 Track Event:
1 | { |
服务端或分析脚本用 event_id 和时刻窗口把外部 trigger 记录、trace 内 Track Event、FrameTimeline 慢帧对上。对不上时,这份 Trace 只能当平台侧上下文,不能直接归因到页面或业务动作。
测试环境可以用下面两种 shell 方法激活 trigger,但上面的 preset 设置了 producer_name_regex: "com\\.example\\.app":shell 工具的 producer 名若不匹配,trigger 会被过滤。测试时应使用匹配的 App producer 激活,或在仅用于实验室的配置里调整这项过滤,不能把命令执行成功当成 trigger 已命中。
1 | adb shell /system/bin/trigger_perfetto app_ui_jank |
也可以用一段只包含 activate_triggers 的配置激活同名 trigger:
本文由News整理发布,仅供参考。

