Appearance
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:帧回调里累加帧间耗时,每秒算一次 FPSLooper.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)确认占用来源 |