Лаг — это не «слабый телефон», а сигнал архитектуры
Когда лента дёргается при скролле, пользователь винит устройство. На деле чаще виноваты лишние recompositions, тяжёлые операции на main thread и отсутствие прогрева JVM/ART. Ниже — семь приёмов, которые мы реально применяем в проде.
1. Сначала измерь, потом оптимизируй
Открой Android Studio Profiler: CPU, Memory, Energy. Зафиксируй baseline на целевом устройстве до любых правок. Без цифр ты будешь «улучшать» вслепую и ломать то, что уже работало.
2. Macrobenchmark для холодного старта
Macrobenchmark показывает реальный cold start и scroll jank. Сравнивай сборки
по коммитам, а не «на глаз». Одна лишняя инициализация в
Application.onCreate легко съедает 200–400 мс.
3. Baseline Profile — бесплатный буст
Сгенерируй baseline profile для критичных экранов: главная, лента, оплата. ART начнёт компилировать горячие пути раньше, и первый скролл станет заметно плавнее. Это один из самых недооценённых инструментов в 2026 году.
4. LazyColumn: стабильные ключи и лёгкие item
Всегда задавай key для элементов списка. Не тяни тяжёлую логику
в itemContent: форматирование дат, парсинг JSON и маппинг DTO —
вне композиции или в remember с правильными ключами.
LazyColumn {
items(items, key = { it.id }) { post ->
PostCard(post = post, onClick = onPostClick)
}
}
5. Кеширование с умом
Двухуровневый кеш (память + Room/DataStore) снимает повторные сетевые запросы. Для картинок — Coil с resize под размер View. Не грузи 4K, если карточка 360dp.
6. Состояние в Compose: меньше подписок — меньше лагов
Поднимай state ближе к тому, кому он нужен. Широкий
mutableStateListOf на корне экрана заставляет перерисовываться
пол-дерева. Разбивай на ViewModel + derivedStateOf там, где
нужна агрегация без лишних эмитов.
7. Фоновые задачи — только off main
Coroutines + правильный dispatcher: Dispatchers.IO для диска и
сети, Default для CPU. Никакого Thread.sleep и
синхронного парсинга в UI-потоке «на минутку» — именно так рождаются ANR.
Итог
Скорость — это привычка команды, а не разовый спринт. Прогоняй benchmark после каждого крупного PR, держи perf-бюджет (например, cold start < 1.2 с) и не жертвуй плавностью ради ещё одной анимации на весь экран.