天天看點

Android系統zygote程序初始化及程序孵化

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

Android系統zygote程式初始化及程式孵化

其中在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孵化的應用程序

Android系統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共享類及共享資源。