Skip to content

jank-monitoring-demo ​

1. 实验目标 ​

用最小 Android 实现验证两类卡顿监控手段(对应 docs/07-performance-testing-debug/05):

  • Choreographer FPS 统计:postFrameCallback 每帧回调,统计最近 1 秒帧数 → 实时 FPS
  • Looper Printer 主线程卡顿检测(BlockCanary 核心思路):拦截 DispatchMessage 前后时间戳,单条消息耗时 > 阈值即告警
  • 触发卡顿:主线程 sleep 模拟掉帧,观察 FPS 下跌与卡顿告警联动

2. 工程要点 ​

  • Choreographer.getInstance().postFrameCallback:帧回调里累加帧间耗时,每秒算一次 FPS
  • Looper.getMainLooper().setMessageLogging:监听 >>>>> Dispatching / <<<<< Finished 配对,计算单条消息耗时
  • onPause / onDestroy 必须移除帧回调并恢复原 Printer,否则泄漏
  • 阈值常量 JANK_THRESHOLD_MS = 100ms(>16.6ms 单帧预算即算卡顿)

3. 运行方式 ​

bash
cd labs/android/host
./gradlew installDebug

设备/模拟器打开 Android Host → 打开卡顿监控实验室。

4. 预期现象 ​

  • 页面静止时 FPS 稳定在 60(模拟器可能低一些)
  • 点"轻卡顿 (150ms)":FPS 短暂下跌 + 日志出现 检测到主线程卡顿:单条消息耗时 ~150ms
  • 点"重卡顿 (500ms)":FPS 明显掉到个位数 + 卡顿告警(对应真实场景的掉帧)

5. 常见误区 ​

误区实际情况
只统计 FPS 就能定位卡顿函数FPS 只能告诉你"卡了",Looper/Perfetto Trace 才能定位"谁卡的"
Choreographer 帧回调可以不管生命周期不 removeFrameCallback 会持续回调,页面销毁后泄漏
卡顿检测只靠主线程耗时还需结合 CPU 采样 / Trace(Perfetto、Systrace)确认占用来源

6. 对应知识库文档 ​

7. 关键源码 ​

站点构建时间:2026/8/24 23:43:17