1. 卡顿现象识别:肉眼观察帧率、系统Trace日志特征、用户反馈描述

排查卡顿的第一步是 “感知到卡顿”。在拿到用户报障或自己测试时,你需要从三个独立视角收集“卡顿已发生”的证据。本章建立一套现象判断树,帮你快速确认卡顿是否存在,并初步区分是短暂冻帧、持续掉帧还是交互延迟。

卡顿现象识别故障树 卡顿现象存在? 肉眼帧率 系统Trace日志 用户反馈描述 动画不连贯 触摸反应延迟 连续掉帧>3 主线程长期阻塞 “画面卡住” “点不动” 合并判断:任一维度确认即触发排查 🔽 进入数据采集阶段 说明: ① 三个维度互为补充,肉眼看到抖动但Trace正常时,优先信任Trace掉帧数据。 ② 用户反馈“卡”需要和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 > 310秒内坏帧超过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数据,定位导致掉帧的根本原因。