一、SystemServer 進(jìn)程簡介
1.? SystemServer 進(jìn) 程 主 要 的 作 用 是 啟 動 各 種 系 統(tǒng) 服 務(wù) , 比 如ActivityManagerService,PackageManagerService,WindowManagerService 等各種服務(wù)。當(dāng)我們的應(yīng)用需要使用各種系統(tǒng)服務(wù)的時候也是通過與 SystemServer進(jìn)程通訊獲取各種服務(wù)對象的句柄的。
2.SystemServer進(jìn)程由Zygote進(jìn)程通過調(diào)用forkSystemServer方法(底層調(diào)用fork方法)創(chuàng)建出來。
二、SystemServer進(jìn)程main()創(chuàng)建的Looper對象的消息循環(huán)的 run? 方法的執(zhí)行流程
1.? 首先判斷系統(tǒng)當(dāng)前時間,若當(dāng)前時間小于 1970年1月1日,則設(shè)置系統(tǒng)當(dāng)前時間為該時間點。
2.? 然后是設(shè)置系統(tǒng)的語言環(huán)境。
3.? 接著設(shè)置虛擬機(jī)運行內(nèi)存,加載運行庫,設(shè)置SystemServer的異步消息。
4. run? 方法中 createSystemContext() 的調(diào)用
1)? 調(diào)用 createSystemContext()方法來創(chuàng)建系統(tǒng)級別的上下文,涉及到加載系統(tǒng)資源、主題等。
2)? 在 SystemServer 進(jìn)程中也存在著 Context對象,并且是通過ActivityThread.systemMain 方法創(chuàng)建的。
5. mSystemServiceManager? 的創(chuàng)建
1)? 在 run 方 法 中 , 通 過 SystemServiceManager 的 構(gòu) 造方 法 創(chuàng) 建 了 一 個 新 的SystemServiceManager 對象。我們知道SystemServer 進(jìn)程主要是用來構(gòu)建系統(tǒng)各種service 服務(wù)的,而 SystemServiceManager 負(fù)責(zé)管理這些系統(tǒng)服務(wù)的生命周期,包括啟動、停止和綁定服務(wù)。
2)? 將 SystemServiceManager 對象保存到SystemServer進(jìn)程中的一個數(shù)據(jù)結(jié)構(gòu)中。
三、 啟動服務(wù)
1.? 簡介
在開始執(zhí)行啟動服務(wù)之前會先嘗試通過 socket 方式連接 Zygote進(jìn)程,在成功連接之后才會開始啟動其他服務(wù)。
2. Installer 的 onStart 方法
執(zhí)行 mInstaller 的 waitForConnection方法。Installer 類是系統(tǒng)安裝 apk 時的一個服務(wù)類,繼承 自SystemService(系統(tǒng)服務(wù)的一個抽象接口),需要在啟動完Installer 服務(wù)之后才能啟動其他的系統(tǒng)服務(wù)。
3.? waitForConnection()方法
不斷的通過 ping 命令連接 Zygote 進(jìn)程(SystemServer 和 Zygote 進(jìn)程通過 socket方式通信,其他進(jìn)程之間通過 Binder方式通信)。
源碼如下:
public void waitForConnection() {
for (;;) {
if (execute("ping") >= 0) {
return;
}
Slog.w(TAG, "installd not ready");
SystemClock.sleep(1000);
}
}
四、總結(jié)
1.? SystemServer 進(jìn)程是 android 中一個很重要的進(jìn)程,并由 Zygote 進(jìn)程啟動。
2.? SystemServer 進(jìn)程主要用于啟動系統(tǒng)中的服務(wù)。
3.? SystemServer 進(jìn)程啟動服務(wù)的入口點為 main 方法。
4.? SystemServer在執(zhí)行過程中會初始化一些系統(tǒng)變量,加載類庫,創(chuàng)建 Context 對象,創(chuàng)建 SystemServiceManager對象等之后才開始啟動系統(tǒng)服務(wù)。
5.? SystemServer 進(jìn)程將系統(tǒng)服務(wù)分為三類:引導(dǎo)服務(wù)(Bootstrap Services),核心服務(wù)(Core Services)和 其他服務(wù)(Other Services),并逐步啟動。
6.? SystemServer 進(jìn)程在啟動服務(wù)之前會首先嘗試與 Zygote進(jìn)程 建立 socket 通訊,只有通訊成功之后才會開始啟動服務(wù)。
7.? 創(chuàng)建系統(tǒng)服務(wù)的過程中主要通過 SystemServiceManager 對象來管理,通過調(diào)用服務(wù)對象的構(gòu)造方法和onStart方法來初始化服務(wù)的相關(guān)變量。
8.? 服務(wù)對象都有自己的異步消息對象,并運行在單獨的線程中。
9.? SystemServer進(jìn)程需要與其他進(jìn)程進(jìn)行通信,因此會初始化Binder線程池,以便可以通過Binder機(jī)制與其他進(jìn)程進(jìn)行跨進(jìn)程通信。
10. 在啟動完所有必要的系統(tǒng)服務(wù)后,SystemServer進(jìn)程會通過調(diào)用Looper.loop()方法進(jìn)入消息循環(huán),并等待并處理其他進(jìn)程的請求或系統(tǒng)內(nèi)部的事件。
11. 在SystemServer進(jìn)程創(chuàng)建之后,會關(guān)閉Zygote進(jìn)程在子進(jìn)程中不需要的文件描述符。
微風(fēng)不燥,陽光正好,你就像風(fēng)一樣經(jīng)過這里,愿你停留的片刻溫暖舒心。
我是程序員小迷(致力于C、C++、Java、Kotlin、Android、iOS、Shell、JavaScript、TypeScript、Python等編程技術(shù)的技巧經(jīng)驗分享),若作品對您有幫助,請關(guān)注、分享、點贊、收藏、在看、喜歡,您的支持是我們?yōu)槟峁椭淖畲髣恿Α?/p>
歡迎關(guān)注。助您在編程路上越走越好!