android源碼學(xué)習(xí)目錄
背景
從上文中我們知道Zygote進程是怎樣啟動的, 這里分析Android Zygote進程main函數(shù)都做了什么工作。
1.啟動入口
public static void main(String argv[]) {
.....
//創(chuàng)建一個server端的socket, name為zynote
zygoteServer.registerServerSocket(socketName);
// In some configurations, we avoid preloading resources and classes eagerly.
// In such cases, we will preload things prior to our first fork.
if (!enableLazyPreload) {
....
preload(bootTimingsTraceLog); //預(yù)加載類好資源
....
} else {
Zygote.resetNicePriority();
}
....
if (startSystemServer) {
startSystemServer(abiList, socketName, zygoteServer); //啟動SystemServer進程。
}
Log.i(TAG, "Accepting command socket connections");
//開始等待socket命令請求,也就是ActivityManagerService請求
zygoteServer.runSelectLoop(abiList);
zygoteServer.closeServerSocket();
} catch (Zygote.MethodAndArgsCaller caller) {
caller.run();
} catch (Throwable ex) {
Log.e(TAG, "System zygote died with exception", ex);
zygoteServer.closeServerSocket();
throw ex;
}
}
zygote進程main函數(shù)比較長,但它的主要工作可以總結(jié)為
- 創(chuàng)建一個server端socket
- 預(yù)加載類和資源
- 啟動SystemServer進程
- 啟動server端socket的監(jiān)聽,等待ActivityManagerService的請求。
這里我們要了解,zygote是一個孵化器進程,作為孵化器進程它自己最主要的工作就是創(chuàng)建好自身的環(huán)境為以后孵化進程做準備,在一個就是等待孵化請求,也就是這個server的socket接受請求,來孵化需要的進程。