Android Безумие
← К свежим постам График ускорения Android приложения

Производительность

Ускоряем приложение: 7 приёмов против лагов

Лаг — это не «слабый телефон», а сигнал архитектуры

Когда лента дёргается при скролле, пользователь винит устройство. На деле чаще виноваты лишние 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 с) и не жертвуй плавностью ради ещё одной анимации на весь экран.