Давайте узнаем о нюансах загрузки нашей любимой ОС и пройдем все этапы от BIOS-а до загрузки Android-приложения
На картинке ниже представлен краткий процесс загрузки ОС Android. Но как видно на картинке, процесс останавливается на запуске Launcher-а. Мы же пройдем весь процесс, вплоть до запуска обычного приложения.
Этап 1. Bootrom
Bootrom — это небольшой кусочек защищенной от записи флеш-памяти, встроенный в процессорный чип. Он содержит самый первый код, который выполняется процессором при его включении. Далее, он запускает BootLoader.
Этап 2. BootLoader
BootLoader выполняет первичный запуск специфичных настроек перед запуском ядра. То есть дословно, копирует файлы в рабочую память устройства и передает управление коду, расположенному в разделе boot, что по сути есть ядро Linux.
Этап 3. Ядро
Ядро запускает настройку кэша, защищенную память, планировщик задач и загружает драйверы. Когда ядро завершит настройку и запуск своих подсистем, он первым делом запустить корневой и самый главный процесс init(). Все процессы запускаемые после него являются дочерними.
Этап 4. init()
Процесс init() подключает директории /sys, /dev, /proc и запускает службы(daemon), которые указаны в файле init.rc. Например, Service Manager, Media Server. Формат init.rc достаточно простой и по сути представляет собой набор команд, разделенных на блоки. Каждый блок определяет стадию загрузки или, выражаясь языком разработчиков Android, действие. И наконец init() доходит до запуска среды выполнения Android путем запуска службы Zygote.
Этап 5. Среда выполнения Android
Zygote — ключевой компонент любой Android-системы, который ответственен за инициализацию, старт системных служб, запуск и остановку пользовательских приложений и многие другие задачи. Zygote запускается с помощью небольшого приложения /system/bin/app_process. Задача app_proccess — запустить виртуальную машину Art/Dalvik, код которой располагается в разделяемой библиотеке /system/lib/libandroid_runtime.so, а затем поверх нее запустить Zygote.
Когда все это будет сделано и Zygote получит управление, он начинает формирование среды исполнения Java-приложений с помощью загрузки всех Java-классов фреймворка (сейчас их более 2000).
Этап 6. system_server
Затем Zygote запускает system_server, включающий в себя большинство высокоуровневых (написанных на Java) системных сервисов, в том числе Window Manager, Status Bar, Package Manager и, что самое важное, Activity Manager, который в будущем будет ответственен за получение сигналов о старте и завершении приложений.
Этап 7. Activity Manager
После этого Zygote открывает сокет /dev/socket/zygote и уходит в сон, ожидая данные. В это время запущенный ранее Activity Manager посылает широковещательный интент Intent.CATEGORY_HOME, чтобы найти Launcher-приложение, отвечающее за формирование рабочего стола, и отдает его имя Zygote через сокет. Zygote, в свою очередь, форкается и запускает Launcher-приложение поверх виртуальной машины. Вуаля, у нас на экране появляется рабочий стол, найденный Activity Manager и запущенный Zygote, и статусная строка, запущенная system_server в рамках службы Status Bar.
Этап 8. Запуск «своего» приложения
А теперь давайте запустим свое приложение(например, Telegram), которое мы установили из Google Play Store. После тапа по иконке искомого приложения Launcher-приложение пошлет интент с именем этого приложения, его примет Activity Manager и передаст команду на старт приложения демону Zygote.
Когда Zygote получает запрос на старт приложения от Activity Manager, он не запускает новую виртуальную машину, а просто форкается, то есть копирует самого себя и затем запускает поверх полученной копии виртуальной машины нужное приложение. Копия ART/Dalvik VM создаёт главный поток приложения(MainThread).