Как происходит запуск Android приложения
Что проверяют
Знаете ли вы про процесс Zygote и понимаете ли, что влияет на время холодного старта.
Как отвечать
По шагам.
1. Намерение. Лаунчер отправляет намерение на запуск главной активити. Оно уходит через Binder в системную службу активностей.
2. Процесс. Служба проверяет, есть ли процесс приложения. Если нет, она обращается к Zygote. Это особый процесс, который заранее загрузил ядро фреймворка и общие классы и просто ответвляет себя. Благодаря этому новый процесс стартует быстро, а общая память разделяется между приложениями по принципу копирования при записи.
3. Инициализация приложения. В новом процессе запускается основной цикл, создаётся Looper главного потока, затем создаётся объект Application и вызывается его onCreate.
4. Активити. Создаётся объект активити, вызываются onCreate, onStart, onResume, раздувается разметка.
5. Первый кадр. Только после измерения, размещения и отрисовки пользователь видит содержимое. До этого показывается стартовое окно с фоном темы.
Виды запуска, которые надо назвать: холодный (процесса нет, всё сначала), тёплый (процесс жив, активити пересоздаётся) и горячий (приложение просто возвращается на передний план).
Что влияет на скорость холодного старта, и это практическая часть ответа:
- тяжёлая работа в
Application.onCreate: инициализация десятка библиотек последовательно. Лечится ленивой инициализацией и библиотекой App Startup, которая объединяет инициализаторы и убирает лишние провайдеры контента; - провайдеры контента сторонних библиотек запускаются до
onCreateприложения и незаметно добавляют время; - синхронные обращения к диску и настройкам на старте;
- размер и структура кода: помогают базовые профили, дающие предкомпиляцию горячих путей.
Измеряют время до первого кадра штатными метриками и профилировщиком.
Где спотыкаются
Не знают про Zygote и считают, что процесс создаётся с нуля.
Инициализируют всё подряд в Application.onCreate.
Считают стартовое окно частью своей разметки.
Не различают холодный и тёплый запуск при замерах.