從上篇的Zygote學(xué)習(xí)中,了解到Zygote進(jìn)程最后啟動(dòng)了SyetemServer進(jìn)程,那么這篇文章就來分析下SystemServer。
一、SystemServer啟動(dòng)流程

這個(gè)過程在zygote進(jìn)程中,主要包括這么幾個(gè)內(nèi)容:
1.1 Zygote fork SystemServer
1.2 當(dāng)system_server進(jìn)程創(chuàng)建失敗時(shí),將會(huì)重啟zygote進(jìn)程:
- 當(dāng)kill system_server進(jìn)程后,只重啟zygote64和system_server,不重啟zygote;
- 當(dāng)kill zygote64進(jìn)程后,只重啟zygote64和system_server,也不重啟zygote;
- 當(dāng)kill zygote進(jìn)程,則重啟zygote、zygote64以及system_server。
1.3 Zygote通過信號(hào)處理函數(shù)SigChldHandler監(jiān)聽所有子進(jìn)程的存亡
static void SigChldHandler(int /*signal_number*/) {
pid_t pid;
int status;
//Zygote監(jiān)聽所有子進(jìn)程的存亡
while ((pid = waitpid(-1, &status, WNOHANG)) > 0) {
//某一個(gè)子進(jìn)程掛了
if (WIFSIGNALED(status)) {
if (WTERMSIG(status) != SIGKILL) {
ALOGI("Process %d exited due to signal (%d)", pid, WTERMSIG(status));
}
}
//如果掛掉的是SystemServer
if (pid == gSystemServerPid) {
ALOGE("Exit zygote because system server (%d) has terminated", pid);
kill(getpid(), SIGKILL); //Zygote自殺
}
}
}
二、SystemServer啟動(dòng)后的工作

關(guān)鍵流程說明:
ZygoteInit.startSystemServer()
fork 子進(jìn)程 system_server,進(jìn)入 system_server 進(jìn)程。
ZygoteInit.handleSystemServerProcess()
設(shè)置當(dāng)前進(jìn)程名為“system_server”,創(chuàng)建 PathClassLoader 類加載器。
RuntimeInit.zygoteInit()
重定向 log 輸出,通用的初始化(設(shè)置默認(rèn)異常捕捉方法,時(shí)區(qū)等),初始化 Zygote -> nativeZygoteInit()。
app_main::onZygoteInit()
proc->startThreadPool(); 啟動(dòng)Binder線程池,這樣就可以與其他進(jìn)程進(jìn)行通信。
ZygoteInit.main()
開啟 DDMS 功能,preload() 加載資源,預(yù)加載 OpenGL,調(diào)用 SystemServer.main() 方法。
SystemServer.main()
先初始化 SystemServer 對(duì)象,再調(diào)用對(duì)象的 run() 方法。
SystemServer.run()
createSystemContext
startBootstrapServices();
startCoreServices();
startOtherServices();
Looper.loop();
三、系統(tǒng)服務(wù)
startBootstrapServices:引導(dǎo)服務(wù)
| 服務(wù) | 作用 |
|---|---|
| Installer | 系統(tǒng)安裝apk時(shí)的一個(gè)服務(wù)類,啟動(dòng)完成Installer服務(wù)之后才能啟動(dòng)其他的系統(tǒng)服務(wù) |
| ActivityManagerService | 負(fù)責(zé)四大組件的啟動(dòng)、切換、調(diào)度。 |
| PowerManagerService | 計(jì)算系統(tǒng)中和Power相關(guān)的計(jì)算,然后決策系統(tǒng)應(yīng)該如何反應(yīng) |
| LightsService | 管理和顯示背光LED |
| DisplayManagerService | 用來管理所有顯示設(shè)備 |
| UserManagerService | 多用戶模式管理 |
| SensorService | 為系統(tǒng)提供各種感應(yīng)器服務(wù) |
| PackageManagerService | 用來對(duì)apk進(jìn)行安裝、解析、刪除、卸載等等操作 |
startCoreServices:核心服務(wù)
| 服務(wù) | 作用 |
|---|---|
| BatteryService | 管理電池相關(guān)的服務(wù) |
| UsageStatsService | 收集用戶使用每一個(gè)APP的頻率、使用時(shí)常 |
| WebViewUpdateService | WebView更新服務(wù) |
startOtherServices:其他服務(wù)
| 服務(wù) | 作用 |
|---|---|
| CameraService | 攝像頭相關(guān)服務(wù) |
| AlarmManagerService | 全局定時(shí)器管理服務(wù) |
| InputManagerService | 管理輸入事件 |
| WindowManagerService | 窗口管理服務(wù) |
| VrManagerService | VR模式管理服務(wù) |
| BluetoothService | 藍(lán)牙管理服務(wù) |
| NotificationManagerService | 通知管理服務(wù) |
| DeviceStorageMonitorService | 存儲(chǔ)相關(guān)管理服務(wù) |
| LocationManagerService | 定位管理服務(wù) |
| AudioService | 音頻相關(guān)管理服務(wù) |
| … | …. |
四、SystemServiceManager分析
從名字就很明顯知道SystemServiceManager是系統(tǒng)服務(wù)管理類,簡單了解兩個(gè)方法:
4.1 startService函數(shù)
很簡單,就是通過反射創(chuàng)建服務(wù)對(duì)象,并調(diào)用其onStart( )方法啟動(dòng)。
4.2 startBootPhase函數(shù)
Systemserver會(huì)將設(shè)備啟動(dòng)分成幾個(gè)階段,每個(gè)階段service通過繼承SytemService實(shí)現(xiàn)的onBootPhase方法來做一些對(duì)應(yīng)的操作,相當(dāng)于一個(gè)回調(diào)。

參考:
http://liuwangshu.cn/framework/booting/3-syetemserver.html
http://gityuan.com/2016/02/20/android-system-server-1/
http://gityuan.com/2016/02/20/android-system-server-2/
系列文章:
Android系統(tǒng)啟動(dòng)(一)-開篇
Android系統(tǒng)啟動(dòng)(二)-Init篇
Android系統(tǒng)啟動(dòng)(三)-Zygote篇
Android系統(tǒng)啟動(dòng)(四)-SystemServer篇
Android系統(tǒng)啟動(dòng)(五)-ActivityManagerService篇
Android系統(tǒng)啟動(dòng)(六)-Launcher篇