Android Zygote(孵化) 進(jìn)程總結(jié)

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ù)對象都有自己的異步消息對象,并運行在單獨的線程中;

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容