第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,请进入本章环境准备流程。

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

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或以上。

常见错误:
|─ 错误一:使用adb shell atrace时未指定输出文件,数据直接输出到终端导致格式错误。
正确:adb shell atrace ... -o /data/local/tmp/trace.htrace
|─ 错误二:非root设备尝试开启hwc标签,会报“Permission denied”,此时只能使用无标签或部分标签。

3.3 环境准备完整流程图

SystemUI动画trace环境准备故障树 开始环境准备 设备是否已root? 是 否 使用 adb root 授权 使用 su -c 前缀 选择atrace标签 必需:gfx, input, view 推荐:hwc, sched, freq 设置缓冲区 -b 32768 开始抓取trace数据 提示:非root设备只能获取有限标签

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或su -c方式