1.什么是 Zygote 進(jìn)程?
Zygote 進(jìn)程是所有的 android 進(jìn)程的父進(jìn)程,包括 SystemServer 和各種應(yīng)用進(jìn)程都是通過 Zygote 進(jìn)程 fork 出來的。Zygote(孵化)進(jìn)程相當(dāng)于是 android 系統(tǒng)的根進(jìn)程,后面所有的進(jìn)程都是通過這個進(jìn)程 fork 出來的,雖然 Zygote 進(jìn)程相當(dāng)于 Android 系統(tǒng)的根進(jìn)程,但是事實上它也是由 Linux 系統(tǒng)的 init進(jìn)程啟動的。
Android 各個進(jìn)程的先后啟動順序:
init 進(jìn)程 --> Zygote 進(jìn)程 --> SystemServer 進(jìn)程 -->各種應(yīng)用進(jìn)程
進(jìn)程作用說明:
(1).init進(jìn)程:linux的根進(jìn)程,android系統(tǒng)是基于linux系統(tǒng)的,因此可以算作是整個android操作系統(tǒng)的第一個進(jìn)程;
(2). Zygote 進(jìn)程:android 系統(tǒng)的根進(jìn)程,主要作用:可以作用 Zygote 進(jìn)程 fork 出SystemServer 進(jìn)程和各種應(yīng)用進(jìn)程;
(3).SystemService 進(jìn) 程 : 主 要 是 在 這 個 進(jìn) 程 中 啟 動 系 統(tǒng) 的 各 項 服 務(wù) , 比 如ActivityManagerService,PackageManagerService,WindowManagerService服務(wù)等等;
(4).各種應(yīng)用進(jìn)程:啟動自己編寫的客戶端應(yīng)用時,一般都是重新啟動一個應(yīng)用進(jìn)程,有自己的虛擬機與運行環(huán)境,一般進(jìn)程名和包名維持一致;
2.Zygote 進(jìn)程的啟動流程
以高通SM6115平臺Android R 源碼代碼為例,Zygote進(jìn)程的源碼位置:
LA.UM.9.15/LINUX/android/frameworks/base/core/java/com/android/internal/os/ZygoteInit.java
Zygote 進(jìn)程 main 方法主要執(zhí)行邏輯:
? 初始化 DDMS;
? 注冊 Zygote 進(jìn)程的 socket 通訊;
? 初始化 Zygote 中的各種類,資源文件,OpenGL,類庫,Text 資源等等;
? 初始化完成之后 fork 出 SystemServer 進(jìn)程;
? fork 出 SystemServer 進(jìn)程之后,關(guān)閉 socket 連接;
?ZygoteInit 類的 main 方法


init 進(jìn)程在啟動 Zygote 進(jìn)程時一般都會調(diào)用 ZygoteInit 類的 main 方法,這里看一下該方法的具體實現(xiàn)(基于 androidAPI 30 源碼);
? 調(diào)用preForkInit()進(jìn)行初始化,設(shè)置DDMS可用,可以發(fā)現(xiàn)DDMS啟動的時機還是比較早的,在整個 Zygote 進(jìn)程剛剛開始要啟動額時候就設(shè)置可用。
? 之后初始化各種參數(shù),
? 然后調(diào)用 preload 方法實現(xiàn)預(yù)加載各種資源
? 然后通過調(diào)用 "start-system-server"庫,設(shè)置startSystemServer 為true開啟 SystemServer 服務(wù),這個是重點(通過Zygote fork出來,參數(shù)為socket和socketserver)
啟動systemserver后調(diào)用closeServerSocket關(guān)閉socket。
3.SystemServer 進(jìn)程啟動流程
SystemServer 進(jìn)程簡介
SystemServer 進(jìn) 程 主 要 的 作 用 是 在 這 個 進(jìn) 程 中 啟 動 各 種 系 統(tǒng) 服 務(wù) , 比 如ActivityManagerService,PackageManagerService,WindowManagerService 服務(wù),以及各種系統(tǒng)性的服務(wù)其實都是在 SystemServer 進(jìn)程中啟動的,而當(dāng)我們的應(yīng)用需要使用各種系統(tǒng)服務(wù)的時候其實也是通過與 SystemServer 進(jìn)程通訊獲取各種服務(wù)對象的句柄的。
SystemServer 的 main 方法
/*** The main entry point from zygote.*/
? ? public static void main(String[] args) {
? ? ? ? new SystemServer().run();
? ? }
如上所示,main方法只是 new 出一個 SystemServer 對象并執(zhí)行其 run 方法,查看SystemServer 類的定義我們知道其實 final 類型的,所以我們一般不能重寫或者繼承。





首先設(shè)置系統(tǒng)當(dāng)前時區(qū),語言環(huán)境等默認(rèn)配置、
? 然后設(shè)置虛擬機運行內(nèi)存,加載運行庫,設(shè)置 SystemServer 的異步消息,初始化系統(tǒng)參數(shù),調(diào)用 createSystemContext()方法,創(chuàng)建 context。
然后是mSystemServiceManager 的創(chuàng)建,看 run 方 法 中 , 通 過 SystemServiceManager 的構(gòu)造方法創(chuàng)建了一個新的
SystemServiceManager 對象,我們知道 SystemServer 進(jìn)程主要是用來構(gòu)建系統(tǒng)各種service 服務(wù)的,而 SystemServiceManager 就是這些服務(wù)的管理對象。
? 將 SystemServiceManager 對象保存 SystemServer 進(jìn)程中的一個數(shù)據(jù)結(jié)構(gòu)中。
后面開始執(zhí)行:
// Start services.try {
startBootstrapServices();
startCoreServices();
startOtherServices();
} catch (Throwable ex) {
Slog.e("System", "******************************************");
? ? ? ? ? ? Slog.e("System", "************ Failure starting system services", ex);
? ? ? ? ? ? throw ex;
? ? ? ? } finally {
? ? ? ? ? ? t.traceEnd(); // StartServices
? ? ? ? }
里面主要涉及了是三個方法:
? startBootstrapServices() 主要用于啟動系統(tǒng) Boot 級服務(wù)
? startCoreServices() 主要用于啟動系統(tǒng)核心的服務(wù)
? startOtherServices() 主要用于啟動一些非緊要或者是非需要及時啟動的服務(wù)。
4.啟動服務(wù)
啟動哪些服務(wù)呢?在開始執(zhí)行啟動服務(wù)之前總是會先嘗試通過 socket 方式連接 Zygote 進(jìn)程,在成功連接
之后才會開始啟動其他服務(wù)。
通過源碼我們可以看出,mSystemServiceManager 是系統(tǒng)服務(wù)管理對象,在 main 方法中已經(jīng)創(chuàng)建完成,這里我
們看一下其 startService 方法的具體實現(xiàn):
? 可以看到通過反射器構(gòu)造方法創(chuàng)建出服務(wù)類,然后添加到 SystemServiceManager
的 服 務(wù) 列 表 數(shù) 據(jù) 中 , 最 后 調(diào) 用 了 service.onStart() 方 法 , 因 為 傳 遞 的 是Installer.class。
Installer installer = mSystemServiceManager.startService(Installer.class);
看一下 Installer 的 onStart 方法:
? 很簡單就是執(zhí)行了 mInstaller 的 waitForConnection 方法,這里簡單介紹一下
Installer 類,該類是系統(tǒng)安裝 apk 時的一個服務(wù)類,繼承 SystemService(系統(tǒng)服
務(wù)的一個抽象接口),需要在啟動完成 Installer 服務(wù)之后才能啟動其他的系統(tǒng)服務(wù)。

繼續(xù)看 startBootstrapServices 方法:
這 段 代 碼 主 要 是 用 于 啟 動 ActivityManagerService 服 務(wù) , 并 為 其 設(shè) 置SysServiceManager 和 Installer。ActivityManagerService 是系統(tǒng)中一個非常重要的服務(wù),Activity,service,Broadcast,contentProvider 都需要通過其余系統(tǒng)交互。
首先看一下 Lifecycle 類的定義:
? 可以看到其實 ActivityManagerService 的一個靜態(tài)內(nèi)部類,在其構(gòu)造方法中會創(chuàng)建一個 ActivityManagerService,通過剛剛對 Installer 服務(wù)的分析我們知道,SystemServiceManager 的 startService 方法會調(diào)用服務(wù)的 onStart()方法,而在Lifecycle 類的定義中我們看到其 onStart()方法直接調(diào)用了 mService.start()方法,mService 是 Lifecycle 類中對 ActivityManagerService 的引用

啟動部分服務(wù):
啟動 PowerManagerService 服務(wù):
? 啟動方式跟上面的 ActivityManagerService 服務(wù)相似都會調(diào)用其構(gòu)造方法和onStart 方法,PowerManagerService 主要用于計算系統(tǒng)中和 Power 相關(guān)的計算,然后決策系統(tǒng)應(yīng)該如何反應(yīng)。同時協(xié)調(diào) Power 如何與系統(tǒng)其它模塊的交互,比如沒有用戶活動時,屏幕變暗等等。
mPowerManagerService =mSystemServiceManager.startService(PowerManagerService.class);
? 然后是啟動 LightsService 服務(wù)
? 主要是手機中關(guān)于閃光燈,LED 等相關(guān)的服務(wù);也是會調(diào)用 LightsService 的構(gòu)造方法和 onStart 方法;
mSystemServiceManager.startService(LightsService.class);
? 然后是啟動 DisplayManagerService 服務(wù)
? 主要是手機顯示方面的服務(wù)
mDisplayManagerService =mSystemServiceManager.startService(DisplayManagerService.class);
? 然后是啟動 PackageManagerService,該服務(wù)也是 android 系統(tǒng)中一個比較重要的服務(wù)
包括多 apk 文件的安裝,解析,刪除,卸載等等操作。
? 可以看到 PackageManagerService 服務(wù)的啟動方式與其他服務(wù)的啟動方式有一些區(qū)別,直接調(diào)用了 PackageManagerService 的靜態(tài) main 方法

進(jìn)一步查看PackageManagerService的main方法,可以看到也是直接使用 new 的方式創(chuàng)建了一個 PackageManagerService對象,
并在其構(gòu)造方法中初始化相關(guān)變量,最后調(diào)用了 ServiceManager.addService方法,主要是通過 Binder 機制與 JNI 層交互。
然后查看 startCoreServices 方法:
? 可以看到這里啟動了 BatteryService(電池相關(guān)服務(wù)),UsageStatsService,WebViewUpdateService 服務(wù)等。
總結(jié):
? SystemServer 進(jìn)程是 android 中一個很重要的進(jìn)程由 Zygote 進(jìn)程啟動;
? SystemServer 進(jìn)程主要用于啟動系統(tǒng)中的服務(wù);
? SystemServer 進(jìn)程啟動服務(wù)的啟動函數(shù)為 main 函數(shù);
? SystemServer 在執(zhí)行過程中首先會初始化一些系統(tǒng)變量,加載類庫,創(chuàng)建 Context 對象,創(chuàng)建 SystemServiceManager 對象等之后才開始啟動系統(tǒng)服務(wù);
? SystemServer 進(jìn)程將系統(tǒng)服務(wù)分為三類:boot 服務(wù),core 服務(wù)和 other 服務(wù),并逐步啟動。
? SystemServer 進(jìn)程在嘗試啟動服務(wù)之前會首先嘗試與 Zygote 建立 socket 通訊,只有通訊成功之后才會開始嘗試啟動服務(wù);
? 創(chuàng)建的系統(tǒng)服務(wù)過程中主要通過 SystemServiceManager 對象來管理,通過調(diào)用服務(wù)對象的構(gòu)造方法和 onStart 方法初始化服務(wù)的相關(guān)變量;
? 服務(wù)對象都有自己的異步消息對象,并運行在單獨的線程中;