<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
上一篇文章: # Android 10 啟動分析之Zygote篇 (三)
緊接著上一篇文章的內容,我們從這篇文章開始來分析一下 SystemServer。
system_server 程序承載著整個framework的核心服務,例如建立 ActivityManagerService、PowerManagerService、DisplayManagerService、PackageManagerService、WindowManagerService、LauncherAppsService等80多個核心繫統服務。這些服務以不同的執行緒方式存在於system_server這個程序中。
SystemServer的原始碼路徑為 /frameworks/base/services/java/com/android/server/SystemServer.java
,我們從這個類的main方法開始看起:
public static void main(String[] args) { new SystemServer().run(); }
main方法裡建立了一個SystemServer範例,並呼叫了run方法。SystemServer的構造方法裡只是一些簡單的變數初始化,我們直接從run方法繼續閱讀。
private void run() { try { ... //準備主執行緒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"); //檢測上次關機過程是否失敗,這個呼叫可能不會返回 performPendingShutdown(); //初始化系統上下文 createSystemContext(); //建立系統服務管理者--SystemServiceManager mSystemServiceManager = new SystemServiceManager(mSystemContext); mSystemServiceManager.setStartInfo(mRuntimeRestart, mRuntimeStartElapsedTime, mRuntimeStartUptime); //將mSystemServiceManager新增到本地服務中,至於什麼是LocalServices,它有什麼作用, //以後再單獨開一篇文章來講解 LocalServices.addService(SystemServiceManager.class, mSystemServiceManager); //為可以並行化的init任務準備執行緒池 SystemServerInitThreadPool.get(); } finally { traceEnd(); // InitBeforeStartServices } // 在這裡開始啟動一系列服務了 try { traceBeginAndSlog("StartServices"); // 啟動引導服務 startBootstrapServices(); // 啟動核心服務 startCoreServices(); // 啟動其他服務 startOtherServices(); //停止init執行緒池 SystemServerInitThreadPool.shutdown(); } catch (Throwable ex) { Slog.e("System", "******************************************"); Slog.e("System", "************ Failure starting system services", ex); throw ex; } finally { traceEnd(); } ... // 死迴圈執行 Looper.loop(); throw new RuntimeException("Main thread loop unexpectedly exited"); }
我們來關注以下幾個重點方法:
private void createSystemContext() { //建立system_server程序的上下文資訊 ActivityThread activityThread = ActivityThread.systemMain(); mSystemContext = activityThread.getSystemContext(); //設定主題 mSystemContext.setTheme(DEFAULT_SYSTEM_THEME); //獲取systemui上下文資訊,並設定主題 final Context systemUiContext = activityThread.getSystemUiContext(); systemUiContext.setTheme(DEFAULT_SYSTEM_THEME); }
在呼叫ActivityThread.systemMain方法時,這個過程會建立物件有ActivityThread,Instrumentation, ContextImpl,LoadedApk,Application。
為什麼會要建立Application物件?就目前的原始碼來看,Application物件在systemserver程序並無實際作用,筆者只能猜測這是為將來的擴充套件做準備或者android版本迭代中的歷史遺留程式碼。
在這個方法中會啟動系統的關鍵服務,這些服務是系統執行的基石。因為它們之間具有複雜的依賴關係,所以谷歌把它們放在一起初始化。
private void startBootstrapServices() { // 儘早啟動看門狗,這樣我們在早期啟動陷入死鎖時就可以使system server崩潰重啟。 final Watchdog watchdog = Watchdog.getInstance(); watchdog.start(); //啟動Installer Service,這個Service 通過binder與installd程序通訊,負責apk安裝相關的工作 Installer installer = mSystemServiceManager.startService(Installer.class); //裝置識別符號策略服務 mSystemServiceManager.startService(DeviceIdentifiersPolicyService.class); // 管理uri授權 mSystemServiceManager.startService(UriGrantsManagerService.Lifecycle.class); //啟動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(); //電源管理器需要儘早啟動,因為其他服務需要它。 mPowerManagerService = mSystemServiceManager.startService(PowerManagerService.class); //啟動熱緩解服務,目的是在手機開始過熱時進行有效的熱緩解 mSystemServiceManager.startService(ThermalManagerService.class); // Now that the power manager has been started, let the activity manager // initialize power management features. mActivityManagerService.initPowerManagement(); //啟動系統恢復服務,負責協調裝置上與恢復有關的功能。 mSystemServiceManager.startService(RecoverySystemService.class); //到這裡為止,系統啟動的必須服務已經載入完畢 RescueParty.noteBoot(mSystemContext); //管理LED和螢幕背光,我們需要它來顯示 mSystemServiceManager.startService(LightsService.class); //管理顯示裝置 //在package manager 啟動之前,需要啟動display manager 提供display metrics mDisplayManagerService = mSystemServiceManager.startService(DisplayManagerService.class); //只有DisplayManagerService會對PHASE_WAIT_FOR_DEFAULT_DISPLAY做處理 //目的是在初始化包管理器之前,首先需要獲取一個預設的顯示裝置 mSystemServiceManager.startBootPhase(SystemService.PHASE_WAIT_FOR_DEFAULT_DISPLAY); // 啟動 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(); //啟動UserManager Service mSystemServiceManager.startService(UserManagerService.LifeCycle.class); //為系統程序設定應用程式範例並啟動 mActivityManagerService.setSystemProcess(); //使用ActivityManager範例完成看門狗設定並監聽是否重啟 watchdog.init(mSystemContext, mActivityManagerService); // DisplayManagerService needs to setup android.display scheduling related policies // since setSystemProcess() would have overridden policies due to setProcessGroup mDisplayManagerService.setupSchedulerPolicies(); //負責動態資源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(); } //感測器服務需要存取包管理器服務、app ops服務和許可權服務, //因此我們在它們之後啟動它。 //在單獨的執行緒中啟動感測器服務。在使用它之前應該檢查完成情況。 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); }
總結一下,引導服務有以下15個:
服務名稱 | 描述 |
---|---|
Installer | 負責apk安裝相關的工作 |
DeviceIdentifiersPolicyService | 裝置識別符號策略服務 |
UriGrantsManagerService | Uri授權管理 |
ActivityTaskManagerService | 用於管理Activity及其容器(task, stacks, displays,... )的系統服務 |
ActivityManagerService | 管理Activity的啟動,排程等工作 |
PowerManagerService | 負責協調裝置上的電源管理功能 |
ThermalManagerService | 熱緩解服務 |
RecoverySystemService | 負責協調裝置上與恢復有關的功能 |
LightsService | 管理LED和螢幕背光 |
DisplayManagerService | 管理顯示裝置 |
PackageManagerService | 主要負責APK、jar包的管理 |
UserManagerService | 管理使用者的系統服務 |
OverlayManagerService | 負責動態資源overlay工作,具體請搜尋android RRO技術 |
SensorPrivacyService | 和感測器有關,具體作用不明 |
SensorPrivacySere | 感測器服務 |
private void startCoreServices() { // 追蹤電池充電狀態和電量。需要LightService mSystemServiceManager.startService(BatteryService.class); //跟蹤應用程式使用狀態 mSystemServiceManager.startService(UsageStatsService.class); mActivityManagerService.setUsageStatsManager( LocalServices.getService(UsageStatsManagerInternal.class)); // 跟蹤可更新的WebView是否處於就緒狀態,並監視更新安裝。 if (mPackageManager.hasSystemFeature(PackageManager.FEATURE_WEBVIEW)) { traceBeginAndSlog("StartWebViewUpdateService"); mWebViewUpdateService = mSystemServiceManager.startService(WebViewUpdateService.class); traceEnd(); } //跟蹤並快取裝置狀態。 mSystemServiceManager.startService(CachedDeviceStateService.class); // 跟蹤在Binder呼叫中花費的cpu時間 mSystemServiceManager.startService(BinderCallsStatsService.LifeCycle.class); // 跟蹤handlers中處理messages所花費的時間。 mSystemServiceManager.startService(LooperStatsService.Lifecycle.class); //管理apk回滾 mSystemServiceManager.startService(RollbackManagerService.class); // 用於捕獲bugreport,adb bugreport 命令呼叫的就是這個服務 mSystemServiceManager.startService(BugreportManagerService.class); // 管理Gpu和Gpu驅動的服務 mSystemServiceManager.startService(GpuService.class); }
總結一下,核心服務共計9個:
服務名稱 | 描述 |
---|---|
BatteryService | 追蹤電池充電狀態和電量 |
UsageStatsManagerInternal | 跟蹤應用程式使用狀態 |
WebViewUpdateService | 跟蹤可更新的WebView是否處於就緒狀態,並監視更新安裝。 |
CachedDeviceStateService | 跟蹤並快取裝置狀態 |
BinderCallsStatsService | 跟蹤在Binder呼叫中花費的cpu時間 |
LooperStatsService | 跟蹤handlers中處理messages所花費的時間。 |
RollbackManagerService | 管理apk回滾 |
BugreportManagerService | 用於捕獲bugreport |
GpuService | 管理Gpu和Gpu驅動 |
這個方法負責啟動剩下的服務,共計有70多個,限於篇幅的原因,在此不再一一列舉,貼一張從網上找到的圖片大家簡單的瞭解一下就行了:
需要注意的是在startOtherServices結尾處呼叫了AMS的systemReady方法,AMS的systemReady裡有這樣一條語句:
mAtmInternal.startHomeOnAllDisplays(currentUserId, "systemReady");
這條語句會啟動如下的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最終啟動的是android的launcher app,android的啟動已經進入了結尾。
至此,我們從按下電源鍵開始,到最終呈現launcher頁面,整個啟動流程做了一個簡單的介紹。Android 10的啟動分析系列正篇到此結束,其中啟動過程中的一些細節知識點,我們今後再以番外的形式補充介紹,感謝大家的收看!!!
更多關於Android10 啟動SystemServer的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45