Android核心分析 之九-------Zygote Service (轉)

Zygote Service

在本章我們會接觸到這兩個單詞:

  • Zygote [ 生物 受精卵 接合子 接合體
  • Spawn :產卵

通過這兩個單詞,我們就可以大體知道 Zygote 是幹什麼的了,就是叫老母雞下蛋。通過“ Zygote ”產出不同的子“ Zygote ”。從大的架構上講, Zygote 是一個簡單的典型 C/S 結構。其他進程作爲一個客服端向 Zygote 發出 ”孵化”請求, Zygote 接收到命令就“孵化”出一個 Activity 進程來。

Zygote 系統代碼組成及其調用結構:

  • Zygote.java

提供訪問 Dalvik  “zygote”的接口。主要是包裝 Linux 系統的 Fork ,以建立一個新的 VM 實例進程。

  • ZygoteConnection.java

Zygote 的套接口連接管理及其參數解析。其他 Actvitiy 建立進程請求是通過套接口發送命令參數給 Zygote

  • ZygoteInit.java

Zygote main 函數入口。

 

Zygote 系統代碼層次調用

 


main()

startSystemServer()…

runSelectLoopMode()

Accept socket connection

Conntecion.RunOnce()

Read argument

folkAndSpecialize


 

folkAndSpecialize 使用 Native 函數 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 服務的全貌理解,也在 Code 中印證了。【應 yk_hu0621 修正】{由於Android中沒有具體應用程序的入口,都是通過啓動Actvity來啓動相關的Android應用,而這個 Android應用則對應着Linux進程,Activity便Host在這個應用程序上。}

 

{原文:Activity在本質上是個什麼東西,就是一個Linux進程}

 

從分析中我們可以看到, Android 使用了 Linux fork 機制。在 Linux Fork 是很高效的。

 

一個 Android 的應用 實際上一個 Linux 進程,所謂進程具備下面幾個要素,


 

a.要有一段程序供該進程運行,程序是可以被多個進程共享的。

b.. 進程專用的系統堆棧空間。

c. 進程控制塊,在 linux 中具體實現是 task_struct

d. 有獨立的存儲空間。

 

fork  創造的子進程複製了父親進程的資源,包括內存的內容 task_struct 內容,在複製過程中,子進程複製了父進程的 task_struct ,系統堆棧空間和頁面表,而當子進程改變了父進程的變量時候,會通過 copy_on_write 的手段爲所涉及的頁面建立一個新的副本。所以只有子進程有改變變量時,子進程才新建了一個頁面複製原來頁面的內容,基本資源的複製是必須的,整體看上去就像是父進程的獨立存儲空間也複製了一遍。

 

再看看下面 Google 在講解 Dalvik 虛擬機的圖片,我們就大體有了 Android 系統中 Actvitiy 的實際映射狀態 有了基本的認識。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章