第3章:抓取SystemUI动画trace的环境准备
本章排查定位:在《问题排查型课程》六步法中,本章覆盖“数据采集”前置步骤。环境准备若不到位,后续trace将缺失关键SystemUI动画信号,导致“原因定位”失败。
3.1 现象识别:什么情况需要抓取SystemUI动画trace?
当设备上出现以下掉帧现象时,应启动trace采集流程:
- 锁屏/解锁动画出现明显卡顿、跳帧
- 通知栏下拉回弹不跟手,帧率低于30fps
- 快速切换最近任务时界面撕裂或黑屏瞬间
- 壁纸缩放、过渡动画出现断续或白色闪块
掉帧阈值判断规则(可通过dumpsys gfxinfo或systrace确认):
| 指标 | 正常 | 轻度掉帧 | 严重掉帧(需采集) |
|---|---|---|---|
| GPU渲染帧时长(Frame Time) | <16ms | 16~25ms | >25ms 或出现跳变 |
| 掉帧次数(Jank count) | 0~1次/秒 | 2~5次/秒 | ≥6次/秒 |
| VSync严重超时 | 无 | 偶尔 | 持续出现 |
故障树(Fault Tree)快速自查:
|─ 是否已开启“开发者选项” > GPU渲染分析 > 显示GPU视图更新?
|─ 是否已连接adb且设备为debug版本?
|─ 是否已确认SystemUI进程名(com.android.systemui)未被杀?
|─ 若以上全对但无trace,请进入本章环境准备流程。
|─ 是否已开启“开发者选项” > GPU渲染分析 > 显示GPU视图更新?
|─ 是否已连接adb且设备为debug版本?
|─ 是否已确认SystemUI进程名(com.android.systemui)未被杀?
|─ 若以上全对但无trace,请进入本章环境准备流程。
3.2 数据采集:抓取SystemUI动画trace的完整环境清单
3.2.1 手机root要求
虽然atrace基础功能无需root,但捕获SystemUI的图形流水线细节(如hwc、surfaceflinger)以及长时间高频率trace需要root权限。推荐两种方案:
| 方案 | Root类型 | 优点 | 局限 |
|---|---|---|---|
| userdebug/eng编译 | 系统原生root(adb root) | 无需刷Magisk,稳定 | 仅GMS/自有设备适用 |
| Magisk root | 临时root | 量产机也可用,灵活 | 部分OEM限制,需刷boot.img |
重要:若使用Magisk root,执行
adb root前需先确认magiskd正常运行;否则会报“adbd cannot run as root”。替代方案:使用adb shell su -c前缀执行atrace。
3.2.2 adb命令环境
最低adb版本要求:1.0.41(可通过adb version检查)。建议使用最新Platform Tools。关键命令清单:
# 检查设备是否识别
adb devices -l
# 若为root设备,获取root shell
adb root
adb shell
# 查看SystemUI进程是否存活
adb shell ps -ef | grep systemui
# 验证atrace可用性(非root用户也能运行基础版本)
adb shell atrace --list_categories
3.2.3 开启atrace标签
SystemUI动画掉帧涉及的核心atrace标签及作用:
| 标签名 | 覆盖范围 | 是否必需 |
|---|---|---|
gfx |
图形渲染管线(DrawFrame、doFrame) | ★ 必需 |
input |
触摸事件分发 | ★ 必需(动画由输入触发时) |
view |
View布局、绘制、measure | ★ 必需 |
hwc |
硬件合成器(合成图层) | ☆ 推荐 |
sched |
CPU调度、线程休眠/唤醒 | ☆ 推荐(排查掉帧关键) |
freq |
CPU频率变化 | ☆ 推荐 |
sync |
同步点与fence | △ 可选 |
binder_driver |
Binder IPC调用 | △ 可选(排查跨进程阻塞时使用) |
开启标签的命令示例(root环境):
adb shell atrace -b 32768 gfx input view hwc sched freq -t 10 -o /data/local/tmp/animation_trace.html
判断规则:
|─ 若掉帧伴随输入事件延迟 → 必须开启 input
|─ 若掉帧发生在合成阶段(画面撕裂) → 必须开启 hwc
|─ 若掉帧突然出现且恢复慢 → 必须开启 sched + freq
|─ 若掉帧仅发生在首次动画 → 重点关注 view 标签中的measure/layout
|─ 若掉帧伴随输入事件延迟 → 必须开启 input
|─ 若掉帧发生在合成阶段(画面撕裂) → 必须开启 hwc
|─ 若掉帧突然出现且恢复慢 → 必须开启 sched + freq
|─ 若掉帧仅发生在首次动画 → 重点关注 view 标签中的measure/layout
3.2.4 设置缓冲区大小
SystemUI动画通常持续1~3秒,但涉及高频信号(VSync、surfaceflinger事件),缓冲区不足会导致trace被截断,丢失关键帧。推荐缓冲区大小(-b参数)按场景调整:
| 场景 | 推荐缓冲区(KB) | 备注 |
|---|---|---|
| 单次简单动画(如解锁) | 8192 (8MB) | 基础标签启用 |
| 长动画或多项标签 | 32768 (32MB) | 含hwc/sched/freq |
| 压力测试或长时间录制 | 65536 (64MB) | 超多标签,持续时间>10秒 |
若trace文件中出现buffer overflow或truncated提示,请立即增大缓冲区至64MB或以上。
常见错误:
|─ 错误一:使用
正确:
|─ 错误二:非root设备尝试开启
|─ 错误一:使用
adb shell atrace时未指定输出文件,数据直接输出到终端导致格式错误。正确:
adb shell atrace ... -o /data/local/tmp/trace.htrace|─ 错误二:非root设备尝试开启
hwc标签,会报“Permission denied”,此时只能使用无标签或部分标签。
3.3 环境准备完整流程图
3.4 原因定位:环境准备常见失败检查表
当trace采集失败或数据异常时,按以下排查表逐一验证:
| 检查项 | 预期结果 | 失败处理 |
|---|---|---|
adb devices |
设备状态为“device” | 重新插拔USB或更换数据线 |
adb root |
输出“adbd is already running as root”或成功切换 | 确认设备为userdebug/eng或已刷Magisk;否则使用su -c |
atrace --list_categories |
列出包含gfx、input、view等 | 确认Android版本≥6.0(API 23),低版本需改用systrace |
| atrace输出文件大小 | ≥1MB(正常trace) | 检查缓冲区是否过小;是否未触发动画动作 |
| trace中是否含SystemUI进程 | 可见“com.android.systemui”时间片 | 确认动画期间SystemUI存活;使用ps -A | grep systemui |
3.5 修复动作与复测
根据排查表修复后,执行复测脚本验证环境:
#!/system/bin/sh
# 复测环境准备脚本(在adb shell中执行)
echo "=== 1. 检查进程 ==="
ps -A | grep -E "systemui|surfaceflinger" | wc -l
echo "=== 2. 检查root权限 ==="
id
echo "=== 3. 测试atrace基础标签 ==="
atrace -b 8192 gfx view -t 2 -o /dev/null && echo "atrace OK"
echo "=== 4. 检查输出路径可写 ==="
touch /data/local/tmp/test_trace.html && rm /data/local/tmp/test_trace.html && echo "路径可写"
若以上全部通过,则环境准备完成,可进入下一章“trace采集命令实战”。
3.6 预防:环境标准化
- 为团队所有测试机固定编译userdebug版本,避免root兼容问题
- 将常用atrace命令封装为脚本(如
get_sysui_trace.sh),内置最佳标签和缓冲区 - 在新设备接入时,运行本章复测脚本,通过后方可用于性能测试
- 建立“环境准备检查单”,纳入CI/CD流程
关键判断规则总结:
|─ 如果trace中缺少SystemUI的“Choreographer#doFrame”事件 → 确认已开启 gfx 标签
|─ 如果trace中出现大量“BufferQueue”阻塞 → 确认已开启 hwc 和 sync 标签
|─ 如果trace突然中断无数据 → 增大 -b 缓冲区至64MB,或缩短采集时长
|─ 如果系统提示“Permission denied” → 必须使用root或
|─ 如果trace中缺少SystemUI的“Choreographer#doFrame”事件 → 确认已开启 gfx 标签
|─ 如果trace中出现大量“BufferQueue”阻塞 → 确认已开启 hwc 和 sync 标签
|─ 如果trace突然中断无数据 → 增大 -b 缓冲区至64MB,或缩短采集时长
|─ 如果系统提示“Permission denied” → 必须使用root或
su -c方式