2. 帧率抖动指标与采集工具

2.1 现象识别:从“卡顿”到量化指标

用户描述的“掉帧”、“卡顿”是模糊的感性体验。问题排查的第一步是将感性转化为可量化、可复现的指标。

核心量化指标:帧时间 (Frame Time) 与 掉帧次数 (Jank Count)。 帧时间指 GPU/CPU 渲染一帧所花费的毫秒数;掉帧次数指在固定时间窗口内帧时间超过绘制周期(一般为 16.67ms @60Hz 或 8.33ms @120Hz)的次数。

故障树:帧率抖动 → 指标异常

  • 帧时间柱状图右偏:大量帧超过 16.67ms,呈长尾分布 → 渲染管线阻塞。
  • 掉帧次数突增:连续掉帧超过 3 帧 → 可能为密集后台活动或 GC。
  • 帧时间中位数正常但最大帧时间极高 → 偶发大任务(如网络请求回调、埋点写入)。
判断规则:若在 2 秒窗口内掉帧次数 > 5,或帧时间最大值超过 50ms,则优先怀疑后台线程干扰,而非主线程性能瓶颈。

2.2 数据采集:两大核心工具链

Google 官方提供两代工具:Systrace(旧但广泛兼容)与 Perfetto(新一代统一 trace 平台)。以下对比适用于后台活动排查场景。

对比维度SystracePerfetto
适用 Android 版本4.1 – 10(基本支持)9.0+(推荐 10+)
录制方式命令行 adb shell atraceadb shell perfetto / 配置协议 / 图形界面
可观测标签gfx, input, view, am, wm 等更细粒度(GPU, power, scheduler)
帧时间导出需手动解析 ftrace内建 trace_processor 提供 SQL 查询
后台活动视图静态跟踪可实时 Streaming,支持长时录制

Systrace 基础用法(线索采集)

  1. 连接设备,开启开发者选项中的“系统跟踪”。
  2. 执行命令:
    adb shell atrace gfx input view am wm --async_start
    # 复现卡顿场景(操作 3-5 秒)
    adb shell atrace --async_dump > /data/local/tmp/trace.ctrace
    adb pull /data/local/tmp/trace.ctrace .
  3. 在浏览器打开 chrome://tracing 加载 .ctrace 文件。
  4. 查找主线程 (UI Thread) 上的 Choreographer#doFrame 标记,查看相邻帧的时间间隔。
常见陷阱:Systrace 在 Android 10 后被标记 deprecated,部分厂商定制 ROM 可能截断 ftrace buffer。若设备为 Android 12+,优先使用 Perfetto。

Perfetto 录制配置(精确数据采集)

Perfetto 使用 protobuf 配置文件,可精确指定需要采集的 buffer size、持续时间、数据源。

最小化后台活动干扰跟踪配置示例(保存为 config.pbtx):

buffers {
  size_kb: 204800
}
data_sources {
  config {
    name: "linux.ftrace"
    ftrace_config {
      ftrace_events: "sched/sched_switch"
      ftrace_events: "power/suspend_resume"
      ftrace_events: "irq/irq_handler_entry"
      atrace_categories: "gfx"
      atrace_categories: "input"
      atrace_apps: "com.example.myapp"
    }
  }
}
duration_ms: 10000

录制与导出命令:

adb push config.pbtx /data/local/tmp/
adb shell perfetto --txt -c /data/local/tmp/config.pbtx -o /data/local/tmp/trace.perfetto-trace
# 等待 10 秒后
adb pull /data/local/tmp/trace.perfetto-trace .

通过 Perfetto UI 加载 .perfetto-trace 文件后,可使用 SQL 模式查询帧时间分布:

SELECT
  ts, dur,
  CAST(dur AS REAL) / 1e6 AS frame_time_ms
FROM
  slice
WHERE
  name GLOB 'Choreographer#doFrame*'
ORDER BY
  ts;

2.3 结果对比排查表

将采集到的指标与典型后台活动特征对照,可快速缩小排查范围:

现象帧时间柱状图特征掉帧次数分布怀疑后台活动
界面偶尔微卡少量帧落在 20-30ms每 2s 偶发 1-2 次掉帧定时器/闹钟回调
滑动时连续掉帧帧时间集中在 30-50ms连续掉帧 >5 次全量日志写入 / 网络请求 onResponse
进入后台 3 秒后恢复一段密集掉帧后恢复正常掉帧集中在特定时间窗口后台 service 唤醒 / JobScheduler
30% 以上的帧 >33ms柱状图出现明显双峰掉帧次数占 30%+GC 或 CPU 降频 / thermal

2.4 帧率抖动数据采集流程(SVG)

帧率抖动数据采集流程 用户感知卡顿 Systrace(旧设备) Perfetto(新设备) atrace/gfx标签 config.pbtx + perfetto 帧时间柱状图 掉帧次数统计 采集时长:5-10秒 帧时间精度:1ms

2.5 数据采集阶段自查清单

  1. 确认设备已开启开发者选项 & USB 调试。
  2. 根据 API 级别选择 Systrace (≤10) 或 Perfetto (≥9)。
  3. 录制时长建议 ≥ 5 秒,包含至少一次完整 UI 操作(如滑动列表)。
  4. 获取 trace 文件后,立即检查是否包含 Choreographer#doFrame 事件;若无,增加 gfx 标签。
  5. 对于 Perfetto,确认 trace 文件大小不超过 buffer size 的 80%,避免溢出丢失帧事件。
预防性建议:在开发阶段就将 Perfetto 录制脚本集成进 CI pipeline,每次回归测试自动采集 10 秒 trace,与基线帧时间柱状图对比。当掉帧次数增加 >20% 时自动告警,提前发现后台活动引入的帧率抖动。