背景
在前面的文章“安卓系統(tǒng)啟動”http://www.reibang.com/p/747bdfe1b055
我們簡單梳理過系統(tǒng)啟動的流程查乒,但是zygote部分我們沒有細講,今天我們來看一下它到底做了什么
流程
1纹蝴、我們簡單回顧一下zygote從哪里來的娄涩,在系統(tǒng)啟動的init進程的時候捷雕,會加載一個init.rc文件
service zygote /system/bin/app_process -Xzygote /system/bin --zygote --start-system-server
socket zygote stream 666
onrestart write /sys/android_power/request_state wake
onrestart write /sys/power/state on
onrestart restart media
onrestart restart netd
2际跪、zygote進程是一個app_main.cpp 宪睹,在main方法里面徊哑,調(diào)用AppRuntime方法啟動虛擬機
// /frameworks/base/cmds/app_process64/app_main.cpp
int main(int argc, char* const argv[]){
......
// startVm啟動虛擬機
AppRuntime runtime(argv[0], computeArgBlockSize(argc, argv));
......
while (i < argc) {
const char* arg = argv[i++];
if (strcmp(arg, "--zygote") == 0) {
zygote = true;
niceName = ZYGOTE_NICE_NAME;
} else if (strcmp(arg, "--start-system-server") == 0) {
startSystemServer = true;
} else if (strcmp(arg, "--application") == 0) {
application = true;
} else if (strncmp(arg, "--nice-name=", 12) == 0) {
niceName.setTo(arg + 12);
} else if (strncmp(arg, "--", 2) != 0) {
className.setTo(arg);
break;
} else {
--i;
break;
}
}
......
// 啟動ZygoteInit的main方法
if (zygote) {
runtime.start("com.android.internal.os.ZygoteInit", args, zygote);
} else if (className) {
runtime.start("com.android.internal.os.RuntimeInit", args, zygote);
} else {
……
}
}
3笛钝、然后我們來java層ZygoteInit類的main方法
- 創(chuàng)建ZygoteServer质况,創(chuàng)建Server端的Socket
- 預(yù)加載了資源
- 啟動gc
- 啟動SystemServer進程
- 等待創(chuàng)建應(yīng)用進程的消息
public static void main(String argv[]) {
ZygoteServer zygoteServer = new ZygoteServer();
...
注冊socket監(jiān)聽
zygoteServer.registerServerSocket(socketName);
...
預(yù)加載資源
preload(bootTimingsTraceLog);
...
啟動gc
gcAndFinalize();
fork SystemServer進程
if (startSystemServer) {
Runnable r = forkSystemServer(abiList, socketName, zygoteServer);
// {@code r == null} in the parent (zygote) process, and {@code r != null} in the
// child (system_server) process.
if (r != null) {
r.run();
return;
}
}
等待創(chuàng)建應(yīng)用進程的消息
caller = zygoteServer.runSelectLoop(abiList);
}
總結(jié)
zygote到底干嘛用的?
1玻靡、孵化SytemServer進程
2结榄、孵化應(yīng)用進程
預(yù)加載的圖
問題
1、為什么用zygote孵化進程囤捻?
zygote是安卓系統(tǒng)的native進程臼朗,是所有進程的父進程,它是init進程fork出來的蝎土,因為zygote預(yù)加載了資源视哑,在孵化進程的時候更加高效,還有就是systemServer進程上的進程摻雜了很多東西誊涯,不如一個進程做fork來的專一
2挡毅、zygote為什么不用binder通信?
個人理解暴构,涉及到了交互流程復(fù)雜度跪呈,還有就是zygote進程和systemServer進程是父子關(guān)系段磨,如果使用binder做了mmap,就會同用一套數(shù)據(jù)耗绿。
binder是安卓層的跨進程通信苹支,socket是SystemServer和zygote之間的通信。
3误阻、zygote和systemServer债蜜、ActivityThread他們的模式都是在進行必要的native初始化后,隨即調(diào)用Java層某個類的main函數(shù)究反,從而進入Java的世界寻定,主要邏輯都是在Java層完成
4、SystemServer進程上面跑了ams奴紧,pms特姐,wms等系統(tǒng)服務(wù)