Zygote Service
在本章我們會(huì)接觸到這兩個(gè)單詞:
Zygote [生物] 受精卵, 接合子, 接合體
Spawn:產(chǎn)卵
通過(guò)這兩個(gè)單詞,我們就可以大體知道Zygote是干什么的了,就是叫老母雞下蛋。通過(guò)“Zygote”產(chǎn)出不同的子“Zygote”。從大的架構(gòu)上講,Zygote是一個(gè)簡(jiǎn)單的典型C/S結(jié)構(gòu)。其他進(jìn)程作為一個(gè)客服端向Zygote發(fā)出”孵化”請(qǐng)求,Zygote接收到命令就“孵化”出一個(gè)Activity進(jìn)程來(lái)。
Zygote系統(tǒng)代碼組成及其調(diào)用結(jié)構(gòu):
Zygote.java
提供訪問(wèn)Dalvik “zygote”的接口。主要是包裝Linux系統(tǒng)的Fork,以建立一個(gè)新的VM實(shí)例進(jìn)程。
ZygoteConnection.java
Zygote的套接口連接管理及其參數(shù)解析。其他Actvitiy建立進(jìn)程請(qǐng)求是通過(guò)套接口發(fā)送命令參數(shù)給Zygote。
ZygoteInit.java
Zygote的main函數(shù)入口。
Zygote系統(tǒng)代碼層次調(diào)用
main()
startSystemServer()…
runSelectLoopMode()
Accept socket connection
Conntecion.RunOnce()
Read argument
folkAndSpecialize
folkAndSpecialize使用Native函數(shù)Dalvik_dalvik_system_Zygote_forkAndSpecialize
//native 的獲取
dalvik\vm\native
//dalvik_system_Zygote.c
const DalvikNativeMethod dvm_dalvik_system_Zygote[] = {
{ "fork", "()I",
Dalvik_dalvik_system_Zygote_fork },
{ "forkAndSpecialize", "(II[II[[I)I",
Dalvik_dalvik_system_Zygote_forkAndSpecialize },
{ "forkSystemServer", "(II[II[[I)I",
Dalvik_dalvik_system_Zygote_forkSystemServer },
{ NULL, NULL, NULL },
};
在這里我們就有了Zygote服務(wù)的全貌理解,也在Code中印證了?!緫?yīng)yk_hu0621修正】{由于Android中沒(méi)有具體應(yīng)用程序的入口,都是通過(guò)啟動(dòng)Actvity來(lái)啟動(dòng)相關(guān)的Android應(yīng)用,而這個(gè) Android應(yīng)用則對(duì)應(yīng)著Linux進(jìn)程,Activity便Host在這個(gè)應(yīng)用程序上。}
{原文:Activity在本質(zhì)上是個(gè)什么東西,就是一個(gè)Linux進(jìn)程}
從分析中我們可以看到,Android使用了Linux的fork機(jī)制。在Linux中Fork是很高效的。
一個(gè)Android的應(yīng)用實(shí)際上一個(gè)Linux進(jìn)程,所謂進(jìn)程具備下面幾個(gè)要素,
a.要有一段程序供該進(jìn)程運(yùn)行,程序是可以被多個(gè)進(jìn)程共享的。
b..進(jìn)程專(zhuān)用的系統(tǒng)堆??臻g。
c.進(jìn)程控制塊,在linux中具體實(shí)現(xiàn)是task_struct
d.有獨(dú)立的存儲(chǔ)空間。
fork 創(chuàng)造的子進(jìn)程復(fù)制了父親進(jìn)程的資源,包括內(nèi)存的內(nèi)容task_struct內(nèi)容,在復(fù)制過(guò)程中,子進(jìn)程復(fù)制了父進(jìn)程的task_struct,系統(tǒng)堆??臻g和頁(yè)面表,而當(dāng)子進(jìn)程改變了父進(jìn)程的變量時(shí)候,會(huì)通過(guò)copy_on_write的手段為所涉及的頁(yè)面建立一個(gè)新的副本。所以只有子進(jìn)程有改變變量時(shí),子進(jìn)程才新建了一個(gè)頁(yè)面復(fù)制原來(lái)頁(yè)面的內(nèi)容,基本資源的復(fù)制是必須的,整體看上去就像是父進(jìn)程的獨(dú)立存儲(chǔ)空間也復(fù)制了一遍。
再看看下面Google在講解Dalvik虛擬機(jī)的圖片,我們就大體有了Android系統(tǒng)中Actvitiy的實(shí)際映射狀態(tài)有了基本的認(rèn)識(shí)。