1. 卡顿现象识别:肉眼观察帧率、系统Trace日志特征、用户反馈描述
排查卡顿的第一步是 “感知到卡顿”。在拿到用户报障或自己测试时,你需要从三个独立视角收集“卡顿已发生”的证据。本章建立一套现象判断树,帮你快速确认卡顿是否存在,并初步区分是短暂冻帧、持续掉帧还是交互延迟。
1.1 肉眼观察帧率 —— 最直觉的“红牌”
人眼对 40–60 fps 的抖动最敏感。在真机或模拟器上启动目标页面,反复执行滑动、转场、动画,重点关注以下场景:
| 观察场景 | 典型卡顿表现 | 严重等级 |
|---|---|---|
| 列表快速滑动 | 滑动停止后内容仍“粘滞”0.5~1秒才对齐 | ★ 中 |
| 页面转场动画 | 启动页/返回动画掉帧,出现明显“跳帧” | ★ 高 |
| 手势跟手性 | 手指已经滑动,界面延迟100ms以上才响应 | ★ 高 |
| 连续缩放/旋转 | 手势期间画面闪烁、撕裂或突然卡住 | ★ 极高 |
实训技巧: 打开开发者选项中的“Profile GPU Rendering → On screen as bars”,可以看到实时柱状图。若柱状图持续超过16ms水平线(60fps基准),则肉眼可判断为卡顿。
1.2 系统Trace日志特征 —— 客观数值测量
Android系统自动记录帧渲染时间,通过 systrace 或 Perfetto 可提取以下关键指标:
# 使用平台工具抓取短时Trace(无需root)
adb shell perfetto -t 10s -o /data/misc/perfetto-traces/trace.perfetto \
-f /sdcard/perfetto_config.pbtx
# 查看掉帧信息(示例片段)
FrameMissed: 12 (持续1秒内掉帧数量)
DisplayFrame: target_ms=16.67 actual_ms=68.5 (单帧耗时)
JankyFrames: 5 (坏帧,单帧超过16.67ms的两倍)
Trace日志中的掉帧模式需关注三类典型特征:
- 连续掉帧(Jank cluster):3帧及以上连续超过32ms,通常意味着主线程有长耗时任务。
- 单次大跳帧(Big Spike):某帧耗时 >100ms,常见于布局骤变或大图片解码。
- 周期性掉帧(Pattern Jank):每间隔10~15帧掉一次,可能是定时器或GC导致。
| Trace特征 / 指标 | 说明 | 排查方向 |
|---|---|---|
| Frame duration > 16ms | 单帧耗时超过vsync时间 | 检查渲染管线每个阶段耗时 |
| Janky frames per 10s > 3 | 10秒内坏帧超过3个 | 立即进入数据采集 |
| Choreographer#doFrame 延迟 | 输入事件积压 | 检查主线程是否有阻塞 |
| CPU调度无停顿但GPU帧未完成 | GPU丢帧 | 过度绘制 / 大纹理 |
1.3 用户反馈描述 —— 语义还原问题场景
用户使用自然语言描述的卡顿,提取关键词映射到技术指标:
| 用户反馈原文 | 映射到技术现象 | 典型权重 |
|---|---|---|
| “打开页面要等很久” | Activity启动至第一帧耗时>500ms | 高 |
| “滑着滑着突然卡一下” | 偶发Jank cluster,通常涉及IO或网络 | 高 |
| “点按钮没反应,过一会儿才跳” | 主线程被长任务阻塞,事件被丢弃 | 极高 |
| “动画一顿一顿的” | 每几帧掉一帧,模式性卡顿 | 中 |
注意: 用户反馈的主观程度可能与实际Trace严重度不匹配。必须用客观Trace数据校准。例如用户说“卡”,但Trace显示只有1~2帧轻微掉帧,应降低优先级。相反,用户未反馈但Trace显示连续掉帧,需主动预警。
1.4 判断规则:卡顿发生与否的决策树
将上述三个维度组合,形成以下判断规则:
Rule 1:肉眼可见连续2次以上的画面抖动 → 标记为“可疑卡顿”
Rule 2:Trace中任意1秒内 Janky frames >= 3 → 确认为“确认卡顿”
Rule 3:用户反馈“卡”且 Trace 中存在任何单帧 > 100ms → 确认为“严重卡顿”
Rule 4:肉眼抖动 + 用户反馈 + Trace掉帧≥1 → 直接进入排查流程
在实际排查中,优先检查 连续掉帧(Jank cluster),因为偶发掉帧可能是系统波动,不必过度投入。只有以下情况才视为需要修复的卡顿事件:
- 连续3帧掉帧,或者
- 单帧耗时超过48ms(即约3帧的vsync窗口),或者
- 用户上报时附带视频证据且Trace时间戳重合。
本章核心是建立“卡顿已发生”的共识标准。下一阶段(第2章起)将使用 Android Studio Profiler 具体采集CPU、内存、GPU数据,定位导致掉帧的根本原因。