Как автоматически выявлять задержки при рендеринге UI

«Как автоматически выявлять задержки при рендеринге UI» — вопрос из категории UI и Views, который задают на 23% собеседований Android Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Для выявления задержек рендеринга используйте Choreographer и FrameMetrics:

  1. Choreographer:
Choreographer.getInstance().postFrameCallback(object : Choreographer.FrameCallback {
    override fun doFrame(frameTimeNanos: Long) {
        val frameTimeMs = frameTimeNanos / 1_000_000
        val currentTime = SystemClock.uptimeMillis()
        val delay = currentTime - frameTimeMs

        if (delay > 16) { // >16ms = пропущен кадр (60fps)
            Log.w("FrameDelay", "Frame delayed by $delay ms")
        }
        Choreographer.getInstance().postFrameCallback(this)
    }
})
  1. FrameMetrics (API 24+):
window.addOnFrameMetricsAvailableListener({ _, frameMetrics, _ ->
    val totalDuration = frameMetrics.getMetric(FrameMetrics.TOTAL_DURATION)
    if (totalDuration > 16_000_000) { // наносекунды
        Log.w("FrameMetrics", "Slow frame: ${totalDuration / 1_000_000}ms")
    }
}, Handler())

Дополнительно:

  • Включите GPU Rendering Profile в настройках разработчика
  • Используйте Systrace для детального анализа
  • Проверяйте onDraw на тяжелые операции
  • Избегайте вложенных ViewGroups и сложных layout-иерархий