Android系統(tǒng)底層基于Linux Kernel, 當Kernel啟動過程會創(chuàng)建init進程, 該進程是所有用戶空間的鼻祖, init進程會啟動servicemanager(binder服務管家), Zygote進程(Java進程的鼻祖). Zygote進程會創(chuàng)建 system_server進程以及各種app進程,下圖是這幾個系統(tǒng)重量級進程之間的層級關系。

image.png
各大核心進程啟動后,都會進入各種對象所相應的main()方法,如下
進程main方法
| 進程 | 主方法 |
|---|---|
| init進程 | Init.main() |
| zygote進程 | ZygoteInit.main() |
| app_process進程 | RuntimeInit.main() |
| system_server進程 | SystemServer.main() |
| app進程 | ActivityThread.main() |
主方法介紹
Init.main()
init進程(pid=1)是Linux系統(tǒng)中用戶空間的第一個進程,主要工作如下:
創(chuàng)建一塊共享內存空間,用于屬性服務器
解析各個rc文件,并啟動對應的屬性服務進程
初始化epoll,一次設置signal、property,keychord 這三個fd對應的回調函數(shù)
進入無線循環(huán),執(zhí)行流程如下
檢查action_quene列表是夠為空,若不為空擇啟動相應的action
檢查是否需要重啟進程,若有擇將其重新啟動
進入epoll_wait狀態(tài) 直到新系統(tǒng)屬性變化事件(property_set屬性值變化),或者收到紫禁城的信號,或者收到鍵盤輸入時間,則會退出等待狀態(tài),執(zhí)行相應的回調函數(shù)
init啟動流程

image.png
zygote進程
Zygote是由init進程通過解析init.zygote.rc文件而創(chuàng)建的,zygote所對應的可執(zhí)行程序app_process,所對應的源文件是App_main.cpp,進程名為zygote。
Zygote啟動流程

image.png
解析init.zygote.rc中的參數(shù),創(chuàng)建appRuntime并調用AppRunTime.start方法;
調用AddroidRuntime的startVm()方法并創(chuàng)建虛擬機,在調用startReg()注冊JNI函數(shù);
通過JNI的方式調用ZygiteInit.mian進入java區(qū)域
通過 registerZygoteSocket()建立Socket通道,zygote作為通信的服務氣短,相應客戶端的請求;
preload 預加載通用類,加載color,drawable資源 openGL,共享庫、和webView 用于提高app的啟動效率
zygote完成了大部分工作 ,接下來通過startSystemServer()來fork system_server
進程,也是framework的載體
zygote 完成所有工作 調用runSelectLoop 進入掛起狀態(tài);
Activity的啟動過程

image.png
- 首先桌面點擊圖標 lancher才會用binder IPC 想system_server 發(fā)送startActivity請求
- system_server收到請求后,想Zygote發(fā)送創(chuàng)建進程請求
- zygote通過socket fork一個子進程 就是我們需要的App進程
- app進程通過BinderIPC 想system_server發(fā)送attchApplication請求
- system_server收到請求后進行一系類準備,然后發(fā)送scheduleLaunchActivity通知app進程
- app進程的binder線程(ApplicationThread)收到消息后通過Handler向主線程發(fā)送lancherActivity消息
- 主線程收到消息 通過反射創(chuàng)建 activity
- 調用activity的OnCreate方法