Ответ вслух Senior Производительность и холодный старт обновлено

Рывки в ленте: поиск причины на любой платформе

Вопрос

Лента в приложении дёргается на скролле на средних Android-устройствах. Как будете искать и устранять причину?

Попробуйте сами

Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.

Показать ответ и разбор

Коротко

Воспроизвожу на устройстве того класса, где жалуются, в релизной сборке, и фиксирую метрику: процент медленных кадров. Снимаю трассу Perfetto или System Trace во время скролла и смотрю, что выходит за бюджет кадра: работа на главном потоке или поток рендеринга.

Что должно прозвучать в ответе

  • Воспроизвести на целевом устройстве, релизная сборка, метрика jank

  • Трассировка (Perfetto, System Trace): главный поток или рендеринг

  • Типичные причины: декодирование картинок, тяжёлая раскладка, лишние перерисовки, GC

  • Исправления: фоновая подготовка данных, стабильные ключи, кеш размеров, пулы

  • Проверка улучшения той же метрикой и защита от регрессии

Что могут спросить следом

  • Как найти лишние рекомпозиции в Compose?
  • Чем поможет JankStats?

Разбор

Воспроизвожу на устройстве того класса, где жалуются, в релизной сборке, и фиксирую метрику: процент медленных кадров. Снимаю трассу Perfetto или System Trace во время скролла и смотрю, что выходит за бюджет кадра: работа на главном потоке или поток рендеринга. Частые причины: декодирование больших картинок, тяжёлая раскладка вложенных контейнеров, лишние перерисовки элементов из-за нестабильных параметров или отсутствия ключей, сборка мусора из-за массовых аллокаций в onBind или в композиции. Исправляю точечно: картинки нужного размера и декодирование в фоне, стабильные ключи и неизменяемые модели, вычисления вне отрисовки. Проверяю той же метрикой, а в CI добавляю Macrobenchmark скролла, чтобы регрессия не вернулась.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.