Мы
разобрали, что происходит, когда пользователь кликает на иконку приложения, от вызова 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()
еще не вызван.