Android10 啟動(dòng)之SystemServer源碼分析
正文
上一篇文章: # Android 10 啟動(dòng)分析之Zygote篇 (三)
緊接著上一篇文章的內(nèi)容,我們從這篇文章開始來分析一下 SystemServer。
system_server 進(jìn)程承載著整個(gè)framework的核心服務(wù),例如創(chuàng)建 ActivityManagerService、PowerManagerService、DisplayManagerService、PackageManagerService、WindowManagerService、LauncherAppsService等80多個(gè)核心系統(tǒng)服務(wù)。這些服務(wù)以不同的線程方式存在于system_server這個(gè)進(jìn)程中。
SystemServer的源碼路徑為 /frameworks/base/services/java/com/android/server/SystemServer.java,我們從這個(gè)類的main方法開始看起:
public static void main(String[] args) {
new SystemServer().run();
}
main方法里創(chuàng)建了一個(gè)SystemServer實(shí)例,并調(diào)用了run方法。SystemServer的構(gòu)造方法里只是一些簡單的變量初始化,我們直接從run方法繼續(xù)閱讀。
private void run() {
try {
...
//準(zhǔn)備主線程lopper
android.os.Process.setThreadPriority(
android.os.Process.THREAD_PRIORITY_FOREGROUND);
android.os.Process.setCanSelfBackground(false);
Looper.prepareMainLooper();
Looper.getMainLooper().setSlowLogThresholdMs(
SLOW_DISPATCH_THRESHOLD_MS, SLOW_DELIVERY_THRESHOLD_MS);
// 加載libandroid_servers.so庫
System.loadLibrary("android_servers");
//檢測上次關(guān)機(jī)過程是否失敗,這個(gè)調(diào)用可能不會(huì)返回
performPendingShutdown();
//初始化系統(tǒng)上下文
createSystemContext();
//創(chuàng)建系統(tǒng)服務(wù)管理者--SystemServiceManager
mSystemServiceManager = new SystemServiceManager(mSystemContext);
mSystemServiceManager.setStartInfo(mRuntimeRestart,
mRuntimeStartElapsedTime, mRuntimeStartUptime);
//將mSystemServiceManager添加到本地服務(wù)中,至于什么是LocalServices,它有什么作用,
//以后再單獨(dú)開一篇文章來講解
LocalServices.addService(SystemServiceManager.class, mSystemServiceManager);
//為可以并行化的init任務(wù)準(zhǔn)備線程池
SystemServerInitThreadPool.get();
} finally {
traceEnd(); // InitBeforeStartServices
}
// 在這里開始啟動(dòng)一系列服務(wù)了
try {
traceBeginAndSlog("StartServices");
// 啟動(dòng)引導(dǎo)服務(wù)
startBootstrapServices();
// 啟動(dòng)核心服務(wù)
startCoreServices();
// 啟動(dòng)其他服務(wù)
startOtherServices();
//停止init線程池
SystemServerInitThreadPool.shutdown();
} catch (Throwable ex) {
Slog.e("System", "******************************************");
Slog.e("System", "************ Failure starting system services", ex);
throw ex;
} finally {
traceEnd();
}
...
// 死循環(huán)執(zhí)行
Looper.loop();
throw new RuntimeException("Main thread loop unexpectedly exited");
}
我們來關(guān)注以下幾個(gè)重點(diǎn)方法:
createSystemContext
private void createSystemContext() {
//創(chuàng)建system_server進(jìn)程的上下文信息
ActivityThread activityThread = ActivityThread.systemMain();
mSystemContext = activityThread.getSystemContext();
//設(shè)置主題
mSystemContext.setTheme(DEFAULT_SYSTEM_THEME);
//獲取systemui上下文信息,并設(shè)置主題
final Context systemUiContext = activityThread.getSystemUiContext();
systemUiContext.setTheme(DEFAULT_SYSTEM_THEME);
}
在調(diào)用ActivityThread.systemMain方法時(shí),這個(gè)過程會(huì)創(chuàng)建對象有ActivityThread,Instrumentation, ContextImpl,LoadedApk,Application。
為什么會(huì)要?jiǎng)?chuàng)建Application對象?就目前的源碼來看,Application對象在systemserver進(jìn)程并無實(shí)際作用,筆者只能猜測這是為將來的擴(kuò)展做準(zhǔn)備或者android版本迭代中的歷史遺留代碼。
startBootstrapServices
在這個(gè)方法中會(huì)啟動(dòng)系統(tǒng)的關(guān)鍵服務(wù),這些服務(wù)是系統(tǒng)運(yùn)行的基石。因?yàn)樗鼈冎g具有復(fù)雜的依賴關(guān)系,所以谷歌把它們放在一起初始化。
private void startBootstrapServices() {
// 盡早啟動(dòng)看門狗,這樣我們在早期啟動(dòng)陷入死鎖時(shí)就可以使system server崩潰重啟。
final Watchdog watchdog = Watchdog.getInstance();
watchdog.start();
//啟動(dòng)Installer Service,這個(gè)Service 通過binder與installd進(jìn)程通訊,負(fù)責(zé)apk安裝相關(guān)的工作
Installer installer = mSystemServiceManager.startService(Installer.class);
//設(shè)備標(biāo)識(shí)符策略服務(wù)
mSystemServiceManager.startService(DeviceIdentifiersPolicyService.class);
// 管理uri授權(quán)
mSystemServiceManager.startService(UriGrantsManagerService.Lifecycle.class);
//啟動(dòng)ActivityTaskManagerService和ActivityManagerService
ActivityTaskManagerService atm = mSystemServiceManager.startService(
ActivityTaskManagerService.Lifecycle.class).getService();
mActivityManagerService = ActivityManagerService.Lifecycle.startService(
mSystemServiceManager, atm);
mActivityManagerService.setSystemServiceManager(mSystemServiceManager);
mActivityManagerService.setInstaller(installer);
mWindowManagerGlobalLock = atm.getGlobalLock();
//電源管理器需要盡早啟動(dòng),因?yàn)槠渌?wù)需要它。
mPowerManagerService = mSystemServiceManager.startService(PowerManagerService.class);
//啟動(dòng)熱緩解服務(wù),目的是在手機(jī)開始過熱時(shí)進(jìn)行有效的熱緩解
mSystemServiceManager.startService(ThermalManagerService.class);
// Now that the power manager has been started, let the activity manager
// initialize power management features.
mActivityManagerService.initPowerManagement();
//啟動(dòng)系統(tǒng)恢復(fù)服務(wù),負(fù)責(zé)協(xié)調(diào)設(shè)備上與恢復(fù)有關(guān)的功能。
mSystemServiceManager.startService(RecoverySystemService.class);
//到這里為止,系統(tǒng)啟動(dòng)的必須服務(wù)已經(jīng)加載完畢
RescueParty.noteBoot(mSystemContext);
//管理LED和屏幕背光,我們需要它來顯示
mSystemServiceManager.startService(LightsService.class);
//管理顯示設(shè)備
//在package manager 啟動(dòng)之前,需要啟動(dòng)display manager 提供display metrics
mDisplayManagerService = mSystemServiceManager.startService(DisplayManagerService.class);
//只有DisplayManagerService會(huì)對PHASE_WAIT_FOR_DEFAULT_DISPLAY做處理
//目的是在初始化包管理器之前,首先需要獲取一個(gè)默認(rèn)的顯示設(shè)備
mSystemServiceManager.startBootPhase(SystemService.PHASE_WAIT_FOR_DEFAULT_DISPLAY);
// 啟動(dòng) package manager.
if (!mRuntimeRestart) {
MetricsLogger.histogram(null, "boot_package_manager_init_start",
(int) SystemClock.elapsedRealtime());
}
try {
Watchdog.getInstance().pauseWatchingCurrentThread("packagemanagermain");
mPackageManagerService = PackageManagerService.main(mSystemContext, installer,
mFactoryTestMode != FactoryTest.FACTORY_TEST_OFF, mOnlyCore);
} finally {
Watchdog.getInstance().resumeWatchingCurrentThread("packagemanagermain");
}
mFirstBoot = mPackageManagerService.isFirstBoot();
mPackageManager = mSystemContext.getPackageManager();
//啟動(dòng)UserManager Service
mSystemServiceManager.startService(UserManagerService.LifeCycle.class);
//為系統(tǒng)進(jìn)程設(shè)置應(yīng)用程序?qū)嵗?dòng)
mActivityManagerService.setSystemProcess();
//使用ActivityManager實(shí)例完成看門狗設(shè)置并監(jiān)聽是否重啟
watchdog.init(mSystemContext, mActivityManagerService);
// DisplayManagerService needs to setup android.display scheduling related policies
// since setSystemProcess() would have overridden policies due to setProcessGroup
mDisplayManagerService.setupSchedulerPolicies();
//負(fù)責(zé)動(dòng)態(tài)資源overlay
mSystemServiceManager.startService(new OverlayManagerService(mSystemContext, installer));
mSystemServiceManager.startService(new SensorPrivacyService(mSystemContext));
if (SystemProperties.getInt("persist.sys.displayinset.top", 0) > 0) {
// DisplayManager needs the overlay immediately.
mActivityManagerService.updateSystemUiContext();
LocalServices.getService(DisplayManagerInternal.class).onOverlayChanged();
}
//傳感器服務(wù)需要訪問包管理器服務(wù)、app ops服務(wù)和權(quán)限服務(wù),
//因此我們在它們之后啟動(dòng)它。
//在單獨(dú)的線程中啟動(dòng)傳感器服務(wù)。在使用它之前應(yīng)該檢查完成情況。
mSensorServiceStart = SystemServerInitThreadPool.get().submit(() -> {
TimingsTraceLog traceLog = new TimingsTraceLog(
SYSTEM_SERVER_TIMING_ASYNC_TAG, Trace.TRACE_TAG_SYSTEM_SERVER);
traceLog.traceBegin(START_SENSOR_SERVICE);
startSensorService();
traceLog.traceEnd();
}, START_SENSOR_SERVICE);
}
總結(jié)一下,引導(dǎo)服務(wù)有以下15個(gè):
| 服務(wù)名稱 | 描述 |
|---|---|
| Installer | 負(fù)責(zé)apk安裝相關(guān)的工作 |
| DeviceIdentifiersPolicyService | 設(shè)備標(biāo)識(shí)符策略服務(wù) |
| UriGrantsManagerService | Uri授權(quán)管理 |
| ActivityTaskManagerService | 用于管理Activity及其容器(task, stacks, displays,... )的系統(tǒng)服務(wù) |
| ActivityManagerService | 管理Activity的啟動(dòng),調(diào)度等工作 |
| PowerManagerService | 負(fù)責(zé)協(xié)調(diào)設(shè)備上的電源管理功能 |
| ThermalManagerService | 熱緩解服務(wù) |
| RecoverySystemService | 負(fù)責(zé)協(xié)調(diào)設(shè)備上與恢復(fù)有關(guān)的功能 |
| LightsService | 管理LED和屏幕背光 |
| DisplayManagerService | 管理顯示設(shè)備 |
| PackageManagerService | 主要負(fù)責(zé)APK、jar包的管理 |
| UserManagerService | 管理用戶的系統(tǒng)服務(wù) |
| OverlayManagerService | 負(fù)責(zé)動(dòng)態(tài)資源overlay工作,具體請搜索android RRO技術(shù) |
| SensorPrivacyService | 和傳感器有關(guān),具體作用不明 |
| SensorPrivacySere | 傳感器服務(wù) |
startCoreServices
private void startCoreServices() {
// 追蹤電池充電狀態(tài)和電量。需要LightService
mSystemServiceManager.startService(BatteryService.class);
//跟蹤應(yīng)用程序使用狀態(tài)
mSystemServiceManager.startService(UsageStatsService.class);
mActivityManagerService.setUsageStatsManager(
LocalServices.getService(UsageStatsManagerInternal.class));
// 跟蹤可更新的WebView是否處于就緒狀態(tài),并監(jiān)視更新安裝。
if (mPackageManager.hasSystemFeature(PackageManager.FEATURE_WEBVIEW)) {
traceBeginAndSlog("StartWebViewUpdateService");
mWebViewUpdateService = mSystemServiceManager.startService(WebViewUpdateService.class);
traceEnd();
}
//跟蹤并緩存設(shè)備狀態(tài)。
mSystemServiceManager.startService(CachedDeviceStateService.class);
// 跟蹤在Binder調(diào)用中花費(fèi)的cpu時(shí)間
mSystemServiceManager.startService(BinderCallsStatsService.LifeCycle.class);
// 跟蹤handlers中處理messages所花費(fèi)的時(shí)間。
mSystemServiceManager.startService(LooperStatsService.Lifecycle.class);
//管理apk回滾
mSystemServiceManager.startService(RollbackManagerService.class);
// 用于捕獲bugreport,adb bugreport 命令調(diào)用的就是這個(gè)服務(wù)
mSystemServiceManager.startService(BugreportManagerService.class);
// 管理Gpu和Gpu驅(qū)動(dòng)的服務(wù)
mSystemServiceManager.startService(GpuService.class);
}
總結(jié)一下,核心服務(wù)共計(jì)9個(gè):
| 服務(wù)名稱 | 描述 |
|---|---|
| BatteryService | 追蹤電池充電狀態(tài)和電量 |
| UsageStatsManagerInternal | 跟蹤應(yīng)用程序使用狀態(tài) |
| WebViewUpdateService | 跟蹤可更新的WebView是否處于就緒狀態(tài),并監(jiān)視更新安裝。 |
| CachedDeviceStateService | 跟蹤并緩存設(shè)備狀態(tài) |
| BinderCallsStatsService | 跟蹤在Binder調(diào)用中花費(fèi)的cpu時(shí)間 |
| LooperStatsService | 跟蹤handlers中處理messages所花費(fèi)的時(shí)間。 |
| RollbackManagerService | 管理apk回滾 |
| BugreportManagerService | 用于捕獲bugreport |
| GpuService | 管理Gpu和Gpu驅(qū)動(dòng) |
startOtherServices
這個(gè)方法負(fù)責(zé)啟動(dòng)剩下的服務(wù),共計(jì)有70多個(gè),限于篇幅的原因,在此不再一一列舉,貼一張從網(wǎng)上找到的圖片大家簡單的了解一下就行了:

需要注意的是在startOtherServices結(jié)尾處調(diào)用了AMS的systemReady方法,AMS的systemReady里有這樣一條語句:
mAtmInternal.startHomeOnAllDisplays(currentUserId, "systemReady");
這條語句會(huì)啟動(dòng)如下的Intent:
Intent getHomeIntent() {
Intent intent = new Intent(mTopAction, mTopData != null ? Uri.parse(mTopData) : null);
intent.setComponent(mTopComponent);
intent.addFlags(Intent.FLAG_DEBUG_TRIAGED_MISSING);
if (mFactoryTest != FactoryTest.FACTORY_TEST_LOW_LEVEL) {
intent.addCategory(Intent.CATEGORY_HOME);
}
return intent;
}
注意到Intent.CATEGORY_HOME沒,這意味著startHomeOnAllDisplays最終啟動(dòng)的是android的launcher app,android的啟動(dòng)已經(jīng)進(jìn)入了結(jié)尾。
至此,我們從按下電源鍵開始,到最終呈現(xiàn)launcher頁面,整個(gè)啟動(dòng)流程做了一個(gè)簡單的介紹。Android 10的啟動(dòng)分析系列正篇到此結(jié)束,其中啟動(dòng)過程中的一些細(xì)節(jié)知識(shí)點(diǎn),我們今后再以番外的形式補(bǔ)充介紹,感謝大家的收看??!!
更多關(guān)于Android10 啟動(dòng)SystemServer的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Android itemDecoration接口實(shí)現(xiàn)吸頂懸浮標(biāo)題
這篇文章主要介紹了Android中使用itemdecoration實(shí)現(xiàn)吸頂懸浮標(biāo)題,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-11-11
Android編程之高效開發(fā)App的10個(gè)建議
這篇文章主要介紹了Android編程之高效開發(fā)App的10個(gè)建議,較為詳細(xì)的分析了Android開發(fā)中的常見問題與注意事項(xiàng),具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-10-10
Android客戶端與服務(wù)端數(shù)據(jù)加密傳輸方案詳解
這篇文章主要為大家介紹了Android客戶端與服務(wù)端數(shù)據(jù)加密傳輸方案詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-01-01
Android實(shí)現(xiàn)帶磁性的懸浮窗體效果
這篇文章主要介紹了Android實(shí)現(xiàn)帶磁性的懸浮窗體效果,涉及Android針對窗體的動(dòng)態(tài)操作相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2016-07-07
Android RecyclerView 上拉加載更多及下拉刷新功能的實(shí)現(xiàn)方法
這篇文章主要介紹了Android RecyclerView 上拉加載更多及下拉刷新的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-09-09

