Metrics:帧与卡顿统计 · AndroidX 源码指南
AAndroidX 源码指南
测试与性能
测试与性能 · 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,越新越准。

相关页面