测试与性能
测试与性能 · androidx.test
Metrics:帧与卡顿统计
用 JankStats 统计帧时长、识别卡顿,并为数据附加 UI 状态上下文。
最后更新 2026-08-01
复制即用
import androidx.metrics.performance.JankStats
import androidx.metrics.performance.PerformanceMetricsState
val jankStats = JankStats.createAndTrack(window) { frameData ->
// 每帧回调:帧时长、是否卡顿、UI 上下文
if (frameData.isJank) {
reportJank(frameData.frameDurationUiNanos)
}
}
// 附加 UI 状态(可选,便于分析卡顿时用户在做什么)
val state = PerformanceMetricsState.getForHierarchy(window.decorView)
state.addState("screen", "detail_page")FrameData 常用字段
| 字段 | 含义 |
|---|---|
frameDurationUiNanos | 帧 UI 耗时(ns) |
isJank | 是否判定为卡顿 |
frameStartNanos | 帧开始时间 |
states | 该帧的 UI 状态上下文 |
常见陷阱
- 忘 state 上下文:不加
addState,卡顿数据无法定位场景。 - 主线程聚合:回调在主线程,别做重活,收集后异步上报。
- 旧 API 精度:API 24+ 依赖平台帧时间 API,越新越准。
- 只采不报:库只采集,需自行聚合上报。
要点
createAndTrack(window, listener)自动跟踪窗口帧;每帧回调FrameData。FrameData提供frameDurationUiNanos(帧耗时)、isJank(是否判定为卡顿)等。PerformanceMetricsState.addState(key, value)为后续帧附加 UI 上下文,便于定位问题场景。- 数据需自行聚合上报(本地记录或上传),库只负责采集。
- 各 API 级别精度不同:API 24+ 依赖平台帧时间 API,越新越准。