11.22 安卓系統最重要的進程之一:system

安卓系統最重要的進程之一:system_server詳細分析

1 概述

SystemServer是android系統的系統服務進程。屬於系統級別,其它服務進程都是應用級別。它也是android系統的唯一一個系統服務進程。

SystemServer進程的名字是system_server,由父進程zygote fork()而來。可以通過ps查看system_server的PPID(Parent Process ID)剛好是zygote進程的PID(Process ID)。

SystemServer進程裡面主要有三塊內容:android_servers、framework資源、各種系統服務。

1)android_servers是指動態鏈接庫libandroid_servers.so。android_servers是JNI層。源碼位於frameworks/base/services/core/jni/路徑下。是服務的JAVA端和C端銜接的地方。

2)framework資源,創建上下文的時候,會加載framework-res.apk。framework-res.apk是一個資源型APK,只有資源,沒有邏輯。源碼位於frameworks/base/core/res/。最後生成到system/framework/framework-res.apk。

3)各種系統服務,android的系統服務非常多,有上百個。其中關鍵服務ActivityManagerService、PowerManagerService、LightsService、DisplayManagerService、PackageManagerService、WindowManagerService、InputManagerService、NetworkManagerService等。源碼位於frameworks/base/services/core/java/路徑下。

2 system_server前置啟動過程

system_server進程是在zygote進程啟動的時候,由zygote進程fork而來。

frameworks/base/cmds/app_process/app_main.cpp

安卓系統最重要的進程之一:system_server詳細分析

frameworks/base/core/java/com/android/internal/os/ZygoteInit.java

安卓系統最重要的進程之一:system_server詳細分析

安卓系統最重要的進程之一:system_server詳細分析

至此,粗略的回顧了一下,需要詳細信息的請參見前面的文章。下面進入system_server進程的實際邏輯。

3 system_server啟動過程

主流程代碼位於下面的路徑。直接去看入口函數main()。

frameworks/base/services/java/com/android/server/Systemserver.java

安卓系統最重要的進程之一:system_server詳細分析

創建匿名對象,然後調用run()方法。下面開始分析run()方法,run()方法就是system_server進程的主流程。

安卓系統最重要的進程之一:system_server詳細分析

第一步檢查並設置系統時間。因為如果系統時間在1970年以前,很多Java API會崩潰。所以這裡首先檢查系統時間,如果小於1970年,就設置系統時間為1970年。正常情況下,後面cell tower或NTP會糾正系統時間。

安卓系統最重要的進程之一:system_server詳細分析

這裡是系統語言和地區的檢查設置。

安卓系統最重要的進程之一:system_server詳細分析

從虛擬機運行時取得虛擬機庫,設置屬性persist.sys.dalvik.vm.lib.2。

安卓系統最重要的進程之一:system_server詳細分析

內存設置。system_server作為核心進程,並且需要持續在後臺運行。清除內存限制,提高效率。

安卓系統最重要的進程之一:system_server詳細分析

安卓系統最重要的進程之一:system_server詳細分析

檢查fingerprint屬性並設置。如果沒有預先設置fingerprint屬性,這裡會根據下面的屬性生成一個fingerprint的值,然後設置。

安卓系統最重要的進程之一:system_server詳細分析

提高binder calls的優先級,是其為前臺優先級。設置最大binder線程數為31個。

安卓系統最重要的進程之一:system_server詳細分析

設置本線程優先級為前臺優先級,不允許設置優先級為後臺。同時,創建主線程的Looper。

安卓系統最重要的進程之一:system_server詳細分析

加載動態鏈接庫libandroid_servers.so。這個庫是系統服務和native進行交互的jni層生成的。

安卓系統最重要的進程之一:system_server詳細分析

創建上下文context,並設置system_server進程的默認主題。

安卓系統最重要的進程之一:system_server詳細分析

創建systemservicemanager,顧名思義,它是用來管理系統服務systemservice的。並把它添加到LocalService。在第四節詳細分析。

安卓系統最重要的進程之一:system_server詳細分析

啟動系統服務。在第五節詳細分析。

安卓系統最重要的進程之一:system_server詳細分析

進入消息循環,Looper的無限循環。

安卓系統最重要的進程之一:system_server詳細分析

消息循環異常退出的時候,會拋出這個異常,意味著system_server進程死掉了。

4 SystemServiceManager

管理系統服務的創建、啟動和生命週期事件。

這個類比較小,整個文件就250行。關鍵成員變量是mServices,是SystemService的列表,每個註冊的系統服務,都會在這個列表裡面存在instance。

SystemServiceManager是一個管理類Manager。使用列表ArrayList數據結構來存儲系統服務的實例。

系統服務都會繼承基類SystemService,抽象類SystemService裡面定義了系統服務的框架方法。

系統服務管理者SystemServiceManager會在系統啟動/運行的不同階段,調用系統服務們的不同方法。

5 各種系統服務

運行在system_server進程裡面的系統服務分為三類:關鍵服務、核心服務、其它服務。

關鍵服務:

安卓系統最重要的進程之一:system_server詳細分析

已上都是binder service,還有一個local service 叫light service。

核心服務:

安卓系統最重要的進程之一:system_server詳細分析

其他服務:

安卓系統最重要的進程之一:system_server詳細分析

這裡的註解給人以遐想:開始處理一大堆尚未重構和整理的東西。

這一階段啟動的服務非常多:振動器服務、掛載服務、網絡管理服務、網絡狀態服務、連接服務、網絡評分服務、nsd服務、窗口管理服務、串號服務、網絡時間更新服務、common time管理服務、輸入管理服務、TelephonyRegistry、ConsumerIsService、MmsServiceBroker、硬件屬性管理服務、SchedulingPolicyService、CameraService、賬戶管理服務、ContentService、鬧鐘服務、VR管理服務等等上百個服務。startOtherService()方法有1000多行。


分享到:


相關文章: