Android系統在開機時會經過如下流程(圖檔來自網絡):

其中在step3時會由系統核心啟動第一個Init程序,該程序最重要的就是啟動Zygote,而我們的分析也由此開始。
Init程序啟動會執行init.rc腳本,這個腳本是Android特有的,在該腳本中配置了将要啟動的service就是zygote程序。該配置檔案如下:
#service service名稱 可執行程式的路徑 虛拟機啟動時需要的參數 代表虛拟機程式所在目錄 指明以ZygoteInit類作為虛拟機執行的入口 執行ZygoteInit之後孵化出第一個程序SystemServer
service zygote /system/bin/app_process -Xzygote /system/bin --zygote --start-system-server
class main
socket zygote stream root system #zygote socket服務端口
#onrestart 服務重新開機觸發操作
onrestart write /sys/android_power/request_state wake
onrestart write /sys/power/state on
onrestart restart media
onrestart restart netd
從該配置檔案看出Init程序執行/system/bin/app_process程式來啟動zygote,這個app_process程式其實就是/frameworks/base/cmds/app_process/app_main.cpp通過mk檔案編譯出的可執行二進制檔案。
接下來就是執行app_main的過程,該過程參照下圖:
圖檔說明:
淺藍色:zygote程序
黃色:systemserver程序
紅色:zygote和systemserver共同執行部分
深藍色:其他由zygote孵化的應用程序
做簡單總結:
1.init啟動zygote程序其實就是執行app_main.cpp程式,在該程式中擷取dalvik虛拟機去執行ZygoteInit.java。
2.在ZygoteInit.java函數執行三件事。首先就是去建立socket服務端監聽AmS的程序建立請求。其次就是去加載SDK中的類及各種資源。最後就是fork()啟動新程序SystemServer。
3.啟動的新程序SystemServer執行三件事。首先就是關閉socket非zygote程序允許監聽。其次就是擷取dalvik虛拟機去執RuntimeInit.java。最後就是在該程式中初始化各個系統服務。
從圖中可以看出,zygote的兩個重要作用:
(1)Socket服務端。該Socket服務端用于接收啟動新的Dalvik程序的指令。
(2)預加載Framework共享類及共享資源。