在 Android Studio 中使用 CPU 性能分析器锁定界面卡顿
SurfaceFlinger
https://perfetto.dev/docs/data-sources/frametimeline#janks-explained
注意: 本文所展示的是 Android Studio Chipmunk 更新后的卡顿检测界面,使用 Android 12 (API 级别 31) 或更高版本的真机或模拟器。
从实时交互记录轨迹
https://github.com/android/performance-samples/tree/main/JankStatsSample
1. 打开 JankStatsSample 并运行应用。
将鼠标指针悬停在帧上或点击帧,即可查看详细的帧信息。如果选中 All Frames 复选框,将有三种类型的帧。
绿色帧 不卡顿的正常帧
红色帧 由于应用进程运行时间超出预期并且错过了预期帧时长的截止时间,被视为卡顿的帧。从应用开发者的角度来看,可操作帧通常是红色帧。
黄色帧 被视为缓冲区填充的帧,这表示应用会在呈现前一帧之前不断将帧发送到系统。这通常是前一帧卡顿所致,应用开发者面对黄帧无能为力。
四个轨迹:
Application Wait for GPU Composition Frames on display
检查卡顿帧
https://github.com/android/performance-samples/blob/main/JankStatsSample/app/src/main/java/com/example/jankstats/JankyView.kt#L36
override fun onDraw(canvas: Canvas) {
simulateJank()
super.onDraw(canvas)
}
https://github.com/android/performance-samples/blob/main/JankStatsSample/app/src/main/java/com/example/jankstats/tools/simulateJank.kt#L29
fun simulateJank(
jankProbability: Double = 0.3,
extremeJankProbability: Double = 0.02
) {
val probability = nextFloat()
if (probability > 1 - jankProbability) {
val delay = if (probability > 1 - extremeJankProbability) {
nextLong(500, 700)
} else {
nextLong(32, 82)
}
try {
// 在分析器中通过轨迹使卡顿更易被锁定
trace("Jank Simulation") {
Thread.sleep(delay)
}
} catch (e: Exception) {
}
}
}
然后,您可以发现在 simulateJank 方法中调用了 Thread.sleep。显然,这是因为 JankStatsSample 应用是为了模拟卡顿而特别创建的。但值得注意的是,从卡顿帧的概览再到更详细的分析,可以找出实际代码。
AndroidX Tracing
https://developer.android.google.cn/reference/androidx/tracing/Trace
例如,此示例中的 trace(“Jank Simulation”) { … } 显示在相应线程的轨迹部分中。
override fun onDraw(canvas: Canvas) {
// simulateJank()
super.onDraw(canvas)
}
加载保存的轨迹
您也可以遵循以下步骤,保存轨迹并后续再加载。保存并加载轨迹后,您可以比较不同版本的跟踪记录或者与他人共享。
总结
文档
https://developer.android.google.cn/studio/profile/jank-detection#jank-detection-android-11
您还可以在下方查看 Google I/O 大会上的视频演讲 —— Android 应用性能近期更新,其中涵盖了非常丰富的关于性能方面的主题,包括如何避免卡顿帧。
△ Android 应用性能近期更新
推荐阅读