Следующий шаг после
старта процесса с java-приложением – это вызов коллбэка
Application.onCreate(). Инициализация приложения происходит в методе
ActivityThread.main() до зацикливания очереди сообщений вызовом
Looper.loop():
1. При создании объекта
ActivityThread инициализируется приватное поле типа
ApplicationThread;
2. На
ActivityThread вызывается метод
attach(), в котором на
ActivityManagerService вызывается метод
attachApplication(). Этот метод получает объект
ApplicationThread как параметр.
3. В
ActivityManagerService.attachApplication() происходит инициализация параметров, необходимых для старта приложения, и вызывается метод
ApplicationThread.bindApplication().
4. В методе
bindApplication() составляется объект
AppBindData, содержащий информацию о стартующем приложении, и отправляется сообщение через
Handler c кодом
BIND_APPLICATION в поле
what и объектом
AppBindData в поле
data. Хэндлер добавляет сообщение в
MessageQueue.
5. После окончания отработки
ActivityThread.main() и вызова метода
Looper.loop() сообщение из очереди обрабатывается в методе
handleMessage() хэндлера, созданного в
ActivityThread.
6. По what-коду сообщение передается в метод
handleBindApplication(), который вызывает
LoadedApk.makeApplication(), где создается объект класса
Application методом
Instrumentation.newApplication();
7. Далее с созданным объектом
Application в качестве параметра вызывается метод
Instrumentation.callApplicationOnCreate(app), который и вызывает метод
Application.onCreate().