Перейти к содержанию
Innovialabs

Как ускорить мобильное приложение: запуск, плавность и память

Практика3 мин

Коротко

Сначала измеряйте на реальном устройстве и в релизной сборке, потом оптимизируйте. Чаще всего помогают отложенная инициализация при запуске, кэширование и уменьшение изображений, виртуализация списков и перенос тяжёлой работы с главного потока.

Сначала измерить, потом ускорять

Оптимизация «на глаз» часто ускоряет не то. Порядок работы такой:

  1. Выберите метрику: время запуска, плавность или память.
  2. Измерьте на реальном устройстве среднего класса и в релизной (или profile) сборке — debug-сборки заметно медленнее.
  3. Найдите узкое место профайлером.
  4. Исправьте одну вещь и измерьте снова.

Что измерять

  • Холодный старт — запуск, когда процесса приложения ещё нет в памяти. Самый медленный и самый важный сценарий. Тёплый и горячий старты быстрее, их стоит смотреть отдельно.
  • Плавность (jank) — пропущенные кадры. При 60 Гц на кадр есть около 16,7 мс, при 120 Гц — около 8,3 мс. Не уложились — анимация и прокрутка дёргаются.
  • Память — пиковое потребление и утечки. Из-за них приложение выгружается системой в фоне или падает.

Инструменты по платформам

ПлатформаЗапускПлавностьПамять
AndroidMacrobenchmark, adb, Android Studio ProfilerProfiler, Perfetto, JankStatsMemory Profiler, LeakCanary
iOSInstruments: App Launch, Xcode OrganizerInstruments: Time Profiler, HitchesInstruments: Allocations, Leaks
FlutterDevTools (profile mode)DevTools: PerformanceDevTools: Memory
React NativeНативные профайлеры платформPerf Monitor, профайлер HermesНативные профайлеры

Быстрая проверка холодного старта на Android:

adb shell am force-stop com.example.app
adb shell am start -W -n com.example.app/.MainActivity

В выводе смотрите TotalTime. Для стабильных цифр используйте Macrobenchmark и несколько прогонов. Для продакшена полезны данные реальных пользователей: Android vitals в Google Play Console и метрики в Xcode Organizer.

Частые исправления

Ускорить запуск

  • Отложенная инициализация: аналитика, реклама, чат поддержки и прочие SDK не нужны до первого кадра. Запускайте их после отрисовки или по требованию.
  • Не делайте сетевых запросов и тяжёлых операций с базой синхронно при старте. Покажите кэш или скелетон.
  • На Android используйте Baseline Profiles — они ускоряют выполнение кода при первом запуске.
  • На iOS следите за числом динамически подключаемых библиотек: каждая добавляет работу при загрузке.

Изображения и кэш

  • Загружайте изображения в размере отображения, а не в исходном разрешении.
  • Используйте библиотеки с дисковым и memory-кэшем: Coil или Glide на Android, Kingfisher или SDWebImage на iOS, cached_network_image во Flutter.
  • Выбирайте эффективные форматы (например, WebP) и сжимайте ассеты.

Виртуализация списков

  • Длинные списки отрисовывайте лениво: RecyclerView или LazyColumn, UICollectionView или ленивые контейнеры SwiftUI, ListView.builder во Flutter, FlatList в React Native.
  • Задавайте стабильные ключи элементов, чтобы не перерисовывать весь список.
  • Упрощайте разметку ячеек: меньше вложенности, меньше тяжёлых эффектов.

Разгрузить главный поток

  • Парсинг JSON, работа с базой, обработка изображений — в фоновом потоке: корутины на Android, Swift Concurrency на iOS, изоляты во Flutter.
  • В React Native избегайте тяжёлых вычислений в JS-потоке во время анимаций.
  • Не пересоздавайте объекты и не пересчитывайте данные при каждой перерисовке.

Память

  • Отписывайтесь от слушателей и таймеров, когда экран закрыт.
  • Следите за ссылками на экраны из долгоживущих объектов — классическая причина утечек.
  • Ограничивайте размер кэшей.

Частые ошибки

  • Измерять в debug-сборке или только на флагманском телефоне.
  • Инициализировать все SDK в первые миллисекунды.
  • Загружать фото с камеры в полном размере в превью списка.
  • Оптимизировать без повторного замера и не знать, помогло ли.

Частые вопросы

Разработчики обычно тестируют на мощных устройствах с быстрым интернетом. У пользователей бывают бюджетные телефоны, мало свободной памяти и медленная сеть. Проверяйте на устройстве среднего класса и смотрите метрики реальных пользователей в консолях сторов.

Поможем с этим

Если хотите не разбираться самим, а получить результат — этим мы занимаемся каждый день.

Обсудить проект

Читайте также

Есть идея или задача? Расскажите нам

Ответим в течение рабочего дня и предложим решение. Консультация бесплатная.