LIVE

Скорость запуска мобильного приложения: что на неё влияет

Быстрый первый экран ещё не означает, что мобильное приложение готово к работе. Интерфейс уже появился, а кнопки не реагируют, данные подгружаются, авторизация проверяется — пользователь смотрит на…

Ратмир Чеботарев·Обновлено: 11 ноября 2026 г.·8 мин

Скорость запуска мобильного приложения: что на неё влияет

Быстрый первый экран ещё не означает, что мобильное приложение готово к работе. Интерфейс уже появился, а кнопки не реагируют, данные подгружаются, авторизация проверяется — пользователь смотрит на красивую заставку, пока приложение занято своими внутренними делами. В метриках это может выглядеть как удачный запуск. В проде — как приложение, которое зависло.

Скорость запуска мобильного приложения зависит от нескольких вещей: состояния процесса, объёма работы до первого отображения, сложности начального экрана и задач, которые разработчики оставили на главном потоке. Поэтому вопрос «сколько секунд приложение запускается?» без уточнения сценария и метрики обычно приводит к ответу, который мало что объясняет.

Холодный, тёплый и горячий старт: почему один запуск не равен другому

На Android различают три состояния запуска. Условно это три разных маршрута, хотя с точки зрения пользователя все они начинаются с нажатия на иконку.

При холодном старте процесса приложения ещё нет в памяти. Системе нужно создать его, загрузить приложение и выполнить начальную настройку. Это наиболее тяжёлый сценарий: здесь проявляются ранняя инициализация SDK, создание объектов, чтение настроек и всё остальное, что команда решила сделать «до показа главного экрана».

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

Сравнивать результаты этих запусков напрямую нельзя. Если приложение открывается за долю секунды при возвращении из фона, это ничего не говорит о холодном старте после выгрузки процесса. И наоборот: долгий первый запуск не обязательно означает, что каждое последующее открытие будет таким же медленным.

Для диагностики нужно разделять сценарии. Минимальный набор включает:

  • запуск после принудительной остановки или перезапуска процесса;
  • возврат к приложению из фона;
  • повторное открытие, когда приложение и нужный экран ещё находятся в памяти.

На Android у этих сценариев есть ориентиры платформы: менее 500 мс для холодного, менее 200 мс для тёплого и менее 150 мс для горячего запуска. Это рекомендации по оптимизации, а не универсальный норматив и тем более не обещание, что приложение на любом устройстве уложится в эти значения.

Результат запуска имеет смысл только вместе со сценарием: холодный старт и возврат из фона измеряют разную работу приложения.

На iOS тоже стоит отдельно смотреть реальные пользовательские сценарии и повторяемость запуска. Переносить на неё Android-ориентиры механически нельзя: универсального целевого времени для обеих платформ нет, а состав и условия измерения могут различаться.

От создания процесса до первого кадра: где приложение тратит время

Холодный запуск на Android состоит из нескольких этапов. Система создаёт процесс и объекты приложения, затем активность, после этого строится разметка и отрисовывается первый кадр. На любом этапе можно добавить лишнюю работу. Иногда это делает один конкретный компонент, иногда — целый парад SDK, каждый из которых при старте хочет успеть инициализироваться первым.

Особенно заметны две причины задержек: тяжёлая работа на главном потоке и сложная иерархия интерфейса. Главный поток занят обработкой событий и отрисовкой. Если на нём же синхронно читают данные, разбирают большие конфигурации, поднимают сторонние библиотеки или ждут сеть, интерфейс не сможет показать кадр вовремя. Поток не становится быстрее от того, что задачу назвали «быстрой инициализацией».

Сложный первый экран тоже требует времени. Много вложенных представлений, вычислений и условий увеличивают работу до первого кадра. Это не значит, что любой богатый интерфейс медленный. Причина в конкретной реализации и объёме того, что приложение обязано выполнить до отображения.

На iOS Apple рекомендует выносить необязательные долгие операции из методов запуска и с главного потока. Например, синхронизацию с сетью можно выполнять асинхронно после появления начального интерфейса, если продукт допускает временно показать уже сохранённые данные. Это решение требует аккуратности: устаревшее состояние должно быть понятным, а обновление — не ломать экран после его появления.

Типичный антипаттерн выглядит так: приложение стартует, синхронно проверяет доступность сервера, загружает профиль, собирает конфигурацию, поднимает аналитику и только затем показывает интерфейс. Каждая операция по отдельности может казаться разумной. Вместе они превращают старт в очередь из задач, где пользователь ждёт, пока система завершит работу, которая не вся нужна для первого контакта с приложением.

Порядок запуска лучше оценивать по назначению каждой операции:

1. Что необходимо для безопасного показа начального экрана?

2. Что нужно для первого действия пользователя?

3. Что может завершиться после отображения интерфейса?

4. Что вообще не требуется запускать при каждом открытии?

Это не повод без разбора переносить всё в фон. Например, если приложение не может показать корректное состояние без проверки сессии, такую проверку нельзя просто выкинуть из критического пути. Но можно отделить её от задач, которые не влияют на первый доступный пользователю сценарий.

Первый экран и готовность к работе: TTID и TTFD

Для Android важны две разные метрики. TTID показывает время до первого кадра интерфейса. TTFD измеряет время до полной интерактивности. Первая отвечает на вопрос, когда экран появился. Вторая — когда приложение действительно готово к использованию.

Разница между ними принципиальна. Приложение может быстро нарисовать оболочку экрана, но ещё загружать данные, выполнять проверки и блокировать действия. Если команда ориентируется только на TTID, можно оптимизировать заставку и одновременно оставить пользователя перед интерфейсом, который пока ничего не умеет. Формально прогресс. Практически — замаскированное ожидание.

TTID полезен для оценки первого визуального отклика. TTFD ближе к тому, что человек воспринимает как готовность приложения. При этом понятие готовности зависит от продукта: для банковского приложения критично доступное состояние счёта, для медиаплеера — возможность управлять воспроизведением, для заметок — открытие редактора или списка записей. Метрика не заменяет выбор сценария, который действительно важен.

Встречается и обратная ошибка: пытаться сделать TTFD равным TTID любой ценой. Если интерфейс показывает рабочий экран раньше, чем доступны необходимые данные или безопасные действия, скорость оплачивается ошибками состояния. Пользователь нажимает на элемент, приложение ещё не готово, затем появляются повторные запросы, дублирующиеся действия или загадочная блокировка кнопки. Костыль с быстрым экраном переносит проблему на следующий этап.

Для анализа запуска полезно держать рядом несколько наблюдений: время до первого кадра, время до первой полезной операции и состояние интерфейса в момент, когда действие стало доступно. Тогда видно, где задержка — в создании экрана, получении данных или логике готовности. И не приходится объявлять запуск быстрым только потому, что на экране успела появиться надпись.

Что измеряют Android и Apple: ориентиры, пороги и процентили

Android приводит целевые значения запуска для разных состояний приложения: менее 500 мс для холодного, менее 200 мс для тёплого и менее 150 мс для горячего. Это именно ориентиры для оптимизации, а не обязательные сроки для всех приложений и устройств.

Отдельно Android vitals обозначает чрезмерные значения TTID: от 5 секунд при холодном запуске, от 2 секунд при тёплом и от 1,5 секунды при горячем. Эти пороги описывают проблемную область метрики. Их не следует превращать в цель качества: если приложение стабильно укладывается в значение ниже порога, это ещё не доказывает, что запуск комфортный или что пользователь успевает выполнить нужное действие.

У Apple для диагностики запуска есть шаблон App Launch в Instruments, а также показатели Xcode Organizer и MetricKit. В Xcode Organizer можно смотреть медиану, то есть 50-й процентиль, и 90-й процентиль. Медиана показывает типичный результат в распределении, а 90-й процентиль помогает заметить более медленные запуски, которые теряются за средним впечатлением. Метрика запуска в этом контексте отсчитывается от нажатия на значок до отрисовки первого экрана. Это показатель первого отображения, а не автоматически измерение полной интерактивности.

При чтении данных важно не смешивать разные уровни:

Что смотримЧто это показываетЧего не подтверждает
TTID на AndroidВремя до первого кадраЧто экран уже полностью интерактивен
TTFD на AndroidВремя до полной готовности к использованиюЧто пользовательский сценарий сам по себе удобен
Медиана запусковРезультат около середины распределенияЧто медленных запусков почти нет
90-й процентильПоведение заметно медленной части запусковПричину задержки без дополнительной диагностики
Пороги Android vitalsЗначения, которые считаются чрезмерными для соответствующего типа стартаУниверсальную цель производительности

Результаты стоит читать в контексте устройства, сборки и состояния процесса. Один удачный замер не характеризует всё приложение. Как и один плохой: он может указать на проблему, но не объяснить её источник. На iOS для поиска причин Apple предлагает анализировать запуск через Instruments, а затем сопоставлять выводы с данными Organizer или MetricKit. На Android сначала полезно понять, какой этап задерживает первый кадр и что в это время занимает главный поток.

Как облегчить старт: главный поток, отложенная инициализация и профили кода

Оптимизация холодного старта начинается не с выбора модного фреймворка. По имеющимся данным нельзя заранее вывести, насколько конкретный язык, база данных, SDK или low-code-платформа ускорят запуск конкретного приложения. Без измерений на сборке и целевых устройствах подобные обещания остаются красивой теорией. Время расходуется в конкретных операциях, а не в абстрактном названии стека.

Рабочий порядок обычно такой:

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

В Android Baseline Profiles помогают предварительно оптимизировать указанные пути кода. В документации платформы заявлено примерно 30% ускорения выполнения кода с первого запуска. Это не означает, что время запуска любого приложения сократится ровно на 30%: эффект относится к выполнению кода и зависит от того, какие пути профилируются и какую долю задержки они занимают. Если приложение ждёт сеть или строит тяжёлый экран, профиль не отменит ожидание и не упростит интерфейс сам по себе.

Важен и порядок внедрения. Если добавить профили, не измерив исходное состояние, получится приятная цифра без ответа на вопрос, что именно улучшилось для пользователя. Если вынести сеть из главного потока, но оставить блокирующую инициализацию нескольких компонентов, запуск может почти не измениться. Если упростить экран, но измерять только горячее возвращение, эффект холодного старта останется за кадром.

Поэтому метрики запуска мобильного приложения должны быть связаны с пользовательским сценарием и этапом готовности. Для первого кадра смотрят TTID и аналогичные показатели отображения. Для реальной доступности функций — TTFD или специально выбранный момент готовности. Для стабильности результата — распределение запусков, включая медленную часть, а не один удачный тест на устройстве разработчика.

Скорость запуска — следствие решений, принятых в коде и архитектуре старта. Удачное приложение показывает необходимый интерфейс без лишней очереди синхронных задач и доводит его до рабочего состояния без долгого скрытого хвоста. Остальное легко превратить в косметику: миллисекунды на заставке снаружи, легаси-инициализация внутри. Первая оптимизация выглядит красиво в отчёте. Вторая нужна пользователю.

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

Чем отличаются холодный, тёплый и горячий запуск приложения?
При холодном запуске процесса приложения ещё нет в памяти, поэтому системе нужно создать его и выполнить начальную настройку. При тёплом запуске приложение работает или восстанавливается из фона, а при горячем процесс и активность в основном остаются в памяти.
Какие ориентиры времени запуска приводит Android?
Для оптимизации Android приводит ориентиры менее 500 мс для холодного, менее 200 мс для тёплого и менее 150 мс для горячего запуска. Это не универсальные нормативы для всех устройств и приложений.
Что такое TTID и TTFD?
TTID измеряет время до первого кадра интерфейса, а TTFD — время до полной интерактивности приложения. Появление экрана само по себе не означает, что приложение уже готово к использованию.
Почему приложение показывает экран, но ещё не реагирует на действия?
Интерфейс может появиться до завершения загрузки данных, проверок и других задач. Если эти операции блокируют главный поток или оставляют ключевые действия недоступными, экран отображается раньше, чем приложение становится готовым.
Как измерить скорость запуска приложения на iOS?
Для диагностики запуска Apple предлагает шаблон App Launch в Instruments, а также показатели Xcode Organizer и MetricKit. В Xcode Organizer можно смотреть медиану и 90-й процентиль; показатель запуска отсчитывается от нажатия на значок до отрисовки первого экрана.