Zygote進程, 一個在Android系統中扮演重要角色的進程. 我們知道Android系統中的兩個重要服務PackageManagerService和ActivityManagerService, 都是由SystemServer進程啟動的, 而這個SystemServer進程本身是Zygote進程在啟動的過程中fork出來的. 這樣一來, 想必我們就知道Zygote進程在Android系統中的重要地位了.
通過這篇文章, 我們可以一起了解一下Zygote進程. 它是什么? 它是怎么來的? 它都做了什么?
什么是Zygote? Zygote是Android系統中特有的進程, 不過說白了也只是名字特有而已, 言外之意, 不多說了. 總之我們先搞清楚一件事, Zygote一個最主要的作用, 就是加快Android應用程序啟動和運行速度.?
為什么這么說? 這就要知道Zygote進程在啟動時做了什么. Zygote進程運行時, 會初始化Dalvik虛擬機, 并運行它. Android的應用程序是由Java編寫的, 它們不能直接運行在Linux上, 只能運行在Dalvik虛擬機中. 并且, 每個應用程序都運行在各自的虛擬機中, 應用程序每次運行都要重新初始化并啟動虛擬機, 這個過程會消耗相當長時間, 是拖慢應用程序的原因之一. 因此, 在Android中, 應用程序運行前, 通過Zygote進程共享已運行的虛擬機的代碼與內存信息, 縮短應用程序運行所耗費的時間. 也就是說, Zygote進程會事先將應用程序要使用的Android Framework中的類與資源加載到內存中, 并組織形成所用資源的鏈接信息. 這樣, 新運行的Android應用程序在使用所需資源時不必每次形成資源的鏈接信息, 這樣就大大提升了程序的運行時間.
所以我們知道了, 原來Zygote進程起到了預加載資源和類到虛擬機提高應用程序提高的作用.?
想知道它是什么時候創建的嗎? 了解Linux系統的伙伴一定猜到了, 沒錯, 就是init進程. 我們知道, Android系統時基于Linux內核的, 而在Linux系統中, 所有的進程都是init進程的子孫進程.
zygote進程是由init進程創建各種deamon后創建的, 他可以啟動運行Android服務和應用程序.
zygote進程啟動時會初始并運行虛擬機, 而后將所需要的類和資源加載到內存中, 新進程創建的時候可以直接使用這些類和資源, 大大加快啟動運行數速度, 這就是cow技術.
所以, Zygote進程就是init進程fork出來的. 但是, Zygote是由java編寫而成的, 所以也要先初始化虛擬機, 由app_process進程裝載并運行ZygoteInit類.?
我們先來看看app_process是如何裝載并運行ZygoteInit的, 之后再來看看Zygote進程它做了什么.?
app_process創建一個AppRuntime變量,然后調用它的start成員函數, 由于AppRuntime類沒有重寫start函數, 所以調用的是其父類AndroidRuntime中的start函數. 在這個start函數中, 它干了三件事: 一是調用函數startVM啟動虛擬機,二是調用函數startReg注冊運行ZygoteInit時需要調用的JNI本地方法,三是調用了com.android.internal.os.ZygoteInit類的main函數.
說白了, 以上的一切都是為了ZygoteInit類的main函數的運行, 來啟動Zygote進程. 這個函數里就是Zygote進程正真做的事情,
ZygoteInit類的功能
1. 調用registerZygoteSocket()綁定套接字, 接收新的Android應用程序運行請求, 用來和ActivityManagerServer通訊. 說的詳細一點就是創建LocalServerSocket實例(也就是Socket的服務端)接收生成新Android進程的信息. 每一個新的Android應用程序進程的創建都要通過Socket請求Zygote進程(即Socket的客戶端).
2. 調用preloadClasses()和preloadResource()來加載Android Application Framework使用的類與資源. 這里就是Zygote預加載資源和類, 提高Android應用程序啟動速度的點.
3. 第三步調用startSystemServer()運行SystemServer進程, 來啟動各種服務.
4. 最后一步調用runSelectLoopMode()來循環監聽, 與第一步對應.?
這就是筆者對Zygote進程初識, 最后還是借用羅老師的總結:
1. 系統啟動時init進程會創建Zygote進程,Zygote進程負責后續Android應用程序框架層的其它進程的創建和啟動工作。
2. Zygote進程會首先創建一個SystemServer進程,SystemServer進程負責啟動系統的關鍵服務,如包管理服務PackageManagerService和應用程序組件管理服務ActivityManagerService。
3. 當我們需要啟動一個Android應用程序時,ActivityManagerService會通過Socket進程間通信機制,通知Zygote進程為這個應用程序創建一個新的進程。
本文旨在給讀者對Zygote進程能有個總體的認識, 如果有幸給了想要深入學習的你一個良好的啟發或開頭, 筆者不勝欣慰.?
歡迎留言學習, 指導. 謝謝.