Следующий шаг после старта процесса с 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().