Как система создает новый процесс и стартует приложение?

Посмотреть в Telegram: @AndroidSobes/117
Мы разобрали, что происходит, когда пользователь кликает на иконку приложения, от вызова startActivity() до создания нового процесса. Следующий вопрос: как создается новый процесс и стартует приложение.

1. ActivityManagerService стартует новый процесс методом startProcessLocked().

2. Вызов startProcessLocked() делегируется в Process и далее делегируется в класс ZygoteProcess, который недоступен в публичном API.

3. Класс ZygoteProcess работает с процессом zygote через сокет соединение. Вызов ZygoteProcess.start() делегируется в startViaZygote(), в котором аргументы метода start() преобразуются в ArrayList<String> в виде флагов, подобных флагам командной строки, и их значений.

4. Далее список аргументов передается в метод zygoteSendArgsAndGetResult(). В этом методе осуществляется передача аргументов в процесс zygote и получение результата. Работа с сокетом происходит через класс ZygoteState, который хранит локальный сокет и input/output стримы.

5. Zygote форкает себя и вызывает ZygoteInit.main(), который находит статический метод main() приложения в классе ActivityThread и стартует его.
Статический метод main() – это входная точка любого Java-приложения. В приложениях под Android этот метод написан за нас и находится в классе ActivityThread.

Метод ActivityThread.main() инициализирует ресурсы, необходимые для работы Android-приложения, и создает очередь сообщений главного потока. Для этого:

1. Вызывается статический метод Looper.prepareMainLooper(). Этот метод делегирует вызов в метод prepare() и сохраняет созданный Looper в статической переменной sMainLooper. Если при вызове prepareMainLooper() переменная sMainLooper не null, то бросается исключение.

2. Создается объект ActivityThread. При этом на лупере главного потока создается объект Handler, который хранится как приватная переменная класса ActivityThread и реализует метод handleMessage(). Именно в этом методе обрабатываются сообщения системы, регулирующие жизненные циклы компонентов приложения.

3. Вызывается метод Looper.loop(). На данном этапе создана очередь сообщений и связанный с ней handler. Можно сказать, что Java-приложение уже инициализировано, но еще не стартовало как Android-приложение, т.к. Application.onCreate() еще не вызван.