Android Zygote 啟動流程
Zygote 進程介紹
介紹
- 在 Android 中,DVM、ART、和應(yīng)用程序進程以及系統(tǒng)關(guān)鍵服務(wù)的 SystemServer 進程都是由 Zygote 進程創(chuàng)建,它被稱為孵化器
- 通過 fork 方式,創(chuàng)建應(yīng)用程序進程和 SystemServer 進程,由于 Zygote 進程在啟動的時候會創(chuàng)建 DVM 或者 ART,因為通過 fork 而創(chuàng)建的應(yīng)用程序和 SystemServer 進程可以在內(nèi)部獲取一個 DVM 或者 ART 實例
Zygote 啟動
- Zygote 的啟動是由 init.rc 腳本文件拉起來的。由 Android Init Language 編寫而成的
- 這些 zygote 啟動腳本都放在 Android 源碼的
system/core/rootdir目錄中
//init.rc
import /init.${ro.zygote}.rc
在 init.rc 中,啟動 Zygote 并不是直接將啟動的文件寫死,而是根據(jù) ro.zygote 的屬性值來決定導(dǎo)入哪個版本的文件。
ro.zygote 取值有 4 種,也就意味著 Zygote 支持 4 種版本
init.zygote32.rc
init.zygote32_64.rc
init.zygote64.rc
init.zygote64_32.rc
init.zygote32.rc
只支持 32 bit 應(yīng)用程序
service zygote /system/bin/app_process -Xzygote /system/bin --zygote --start-system-server
class main
priority -20
user root
group root readproc reserved_disk
socket zygote stream 660 root system
# onrestart write /sys/android_power/request_state wake
# onrestart write /sys/power/state on
# onrestart restart audioserver
# onrestart restart cameraserver
# onrestart restart media
onrestart restart netd
onrestart restart wificond
writepid /dev/cpuset/foreground/tasks
- 根據(jù) Service 類型語句的格式,得知函數(shù)名為 zygote,執(zhí)行程序路徑為 /system/bin/app_process/,類名為 main
init.zygote32_64.rc
表示既支持 32 bit,又支持 64 bit 應(yīng)用程序
service zygote /system/bin/app_process32 -Xzygote /system/bin --zygote --start-system-server --socket-name=zygote
class main
priority -20
user root
group root readproc reserved_disk
socket zygote stream 660 root system
onrestart write /sys/android_power/request_state wake
onrestart write /sys/power/state on
onrestart restart audioserver
onrestart restart cameraserver
onrestart restart media
onrestart restart netd
onrestart restart wificond
writepid /dev/cpuset/foreground/tasks
service zygote_secondary /system/bin/app_process64 -Xzygote /system/bin --zygote --socket-name=zygote_secondary
class main
priority -20
user root
group root readproc reserved_disk
socket zygote_secondary stream 660 root system
onrestart restart zygote
writepid /dev/cpuset/foreground/tasks
- 腳本會啟動兩個 Service,也就說會啟動兩個 Zygote 進程,一個名稱叫 zygote,執(zhí)行程序路徑為 /system/bin/app_process32,作為主模式,另一個是 zygote_secondary,執(zhí)行程序路徑為 /system/bin/app_process64,作為輔模式
init.zygote64.rc 和 init.zygote64_32.rc
與上兩個腳本類似,不在贅述
Zygote 啟動過程
main() 函數(shù)
腳本啟動 Zygote 后首先執(zhí)行 frameworks/base/cmds/app_process/app_main.cpp/main() 中的代碼

- main 會啟動 zygote,systemserver 和 application 三種類型的進程。根據(jù)傳入的參數(shù)區(qū)別去啟動不同類型的進程。
- 啟動進程的方法是使用
AppRuntime類去調(diào)用AndroidRuntime啟動 Android 進程。
AndroidRuntime.cpp
- 該文件位于
frameworks/base/core/文件夾中 - 該文件是用于啟動 Android 服務(wù)的,包括 Zygote,SystemServer,application 等

ZygoteInit.java
- ZygoteInit.java 文件位于
/frameworks/base/core/java/com/android/internal/os/ZygoteInit.java中 - ZygoteInit的main方法主要做了4件事:
- 創(chuàng)建一個Server端的Socket。
- 預(yù)加載類和資源。
- 啟動SystemServer進程。
- 等待AMS請求創(chuàng)建新的應(yīng)用程序進程。

Zygote 進程總結(jié)
- 創(chuàng)建一個 AppRuntime 并調(diào)用其 start 方法,啟動 Zygote 進程
- 創(chuàng)建 Java 虛擬機,并為 Java 虛擬機注冊 JNI 方法
- 通過 JNI 調(diào)用 ZygoteInit 的 main() 函數(shù)進入 Zygote 的 Java 框架層
- 通過 registerZygoteSocket() 創(chuàng)建服務(wù)端 Socket,并通過 runSelectLoop() 方法等待 AMS 請求創(chuàng)建新的應(yīng)用進程
- 啟動 SystemServer 進程

浙公網(wǎng)安備 33010602011771號