《深入解析Android 卷I》對(duì)zygote解釋的非常有意思,他是這樣說的
zygote
是Android系統(tǒng)中創(chuàng)建Java世界的盤古塔粒,他創(chuàng)建了第一個(gè)Java虛擬機(jī),同時(shí)他又是女媧需频,它成功地移植了framwork的核心System_server
進(jìn)程台妆。
- 第一天:創(chuàng)建AppRunntime對(duì)象暂刘,并調(diào)用他的
start()
方法如贷,此后的活動(dòng)有AppRunntime控制漾根。 - 第二天:調(diào)用
startVm()
創(chuàng)建Java虛擬機(jī)厚宰,然后調(diào)用startReg()
來注冊(cè)JNI函數(shù)腌巾。 - 第三天: 通過JNI調(diào)用
com.android.internal.os.ZygoteInit
類的main函數(shù),從此進(jìn)入Java世界铲觉。然而這個(gè)事件剛開始開創(chuàng)的時(shí)候什么都沒有澈蝙。 - 第四天:調(diào)用
registerZygoteSocket()
,通過這函數(shù)他可以響應(yīng)子孫后代的請(qǐng)求同時(shí)zygote調(diào)用了preloadClasses()
和preloadResources()
開始為Java世界添加類和資源 - 第五天:zygote 覺得自己的工作壓力太大了撵幽,遍通過調(diào)用
startSystemServer()
分裂一個(gè)子進(jìn)程system_server
來為Java世界服務(wù)灯荧。 - 第六天:zygote完成了Java世界的初創(chuàng)工作,他已經(jīng)很滿足了盐杂。下一步該做的就是
runSelectLoopMode()
后逗载,便沉沉的睡去哆窿。 - 未來很多天:當(dāng)接受子孫后代的請(qǐng)求的時(shí)候,他就會(huì)醒來厉斟,幫他們打Boss挚躯,然后再睡去。
(感覺好像玄幻小說有沒有擦秽,編程正式趣味無窮把砭!)
少主SystemServer的功法
出生
//這個(gè)方法定義在dalvik_system_Zygote.c中
pid = Zygote.forkSystemServer(parsedArgs.uid, parsedArgs.gid, parsedArgs.gid, debugFlags null );
使命
handleSystemServerProcess(parsedArgs);
這個(gè)方法主要在RuntimeInit.java
實(shí)現(xiàn)有兩方面
public static final void zygoteInit(String[] argv) throws ZygoteInit.MethodAndArgsCaller{
zygoteInitNative(); //與Binder通信系統(tǒng)建立聯(lián)系号涯,加入進(jìn)程隊(duì)列中
......
invokeStaticmain(); //拋出異常導(dǎo)致com.android.server.SystemServer類的main函數(shù)調(diào)用目胡,通過這種方法可以減少浪費(fèi)之前函數(shù)調(diào)用多占用的一些調(diào)用堆棧。
}
SystemServer的總結(jié)
ZygoteInit 分裂產(chǎn)生的SystemServer其實(shí)就是調(diào)用com.android.server.SystemServer的main函數(shù)链快。流程圖: