---
title: 'Android 啟動過程 - SystemServer 進程'
disqus: kyleAlien
---
SystemServer 進程
===
## OverView of Content
[TOC]
## 系統進程之間 - 關係
這個章節著重講解的是 **++SystemServer 進程++**,但了解它的來源也是相當重要的,請參考下圖
> 
### ZygoteInit 啟動 SystemServer 進程
* 關於 Zygote 啟動 SystemServer 詳細請看 [**Android 啟動過程 - Zygote**](https://hackmd.io/Yw1s2x32QoqawvOsW039ZA?both)
* 簡單來說必須經過以下步驟
1. init 進程分析 init.rc 檔案
2. 啟動 Zygote 服務 (app_main.cpp)
3. 分析帶入的參數 (也就是 init.rc 傳入的參數)
4. 啟動該進程的 Binder 線程池
5. fork Zygote 進程,啟動 SystemServer 進程
## 系統服務 [SystemServer](https://cs.android.com/android/platform/superproject/+/master:frameworks/base/services/java/com/android/server/SystemServer.java)
System Server 是進入 Launcher 前的最後準備,它提供了許多 Java 所撰寫的 系統服務,這些服務大份都透過 SystemServiceManager 管理
1. 初始化 Native 的服務(加載 `android_servers` Library)
2. 創建 SystemService,可以用它來啟動其他不同的服務
```java=
// /android/server/SystemServer.java
/**
* The main entry point from zygote. (從 zygote 服務來)
*/
public static void main(String[] args) {
new SystemServer().run();
}
private void run() {
TimingsTraceAndSlog t = new TimingsTraceAndSlog();
...省略部分
try {
... 省略部分
// 1. 初始化 Native 的服務
System.loadLibrary("android_servers");
... 省略部分
// 2. 創建 SystemService,可以用它來啟動其他不同的服務
mSystemServiceManager = new SystemServiceManager(mSystemContext);
} finally {
t.traceEnd(); // InitBeforeStartServices
}
try {
// 3. 啟動系統多個服務
startBootstrapServices(t);
startCoreServices(t);
startOtherServices(t);
} /* 省略 catch */
...省略部分
}
```
3. 啟動 Java 層服務:這些服務分有三種分類 `Bootstrap`、`Core`、`Other`,以下舉例幾種常見的服務
* Bootstrap
| 服務 | 功能 |
| -------- | -------- |
| Installer | 安裝所有 APK 的服務,啟動完 Install 服務後才能啟動其他服務 |
| ActivityManagerService | 負責管理 4 大零組件 |
| PowerManagerService | 計算系統中 Power 相關,以及對應策略 |
| LigthsService | 管理、顯示 LED |
| DisplayManagerService | 與 WMS 有關,用來管理該設備的顯示 |
| UserManagerService | 多用戶模式管理 |
| SensorService | 各種傳感器服務 |
| PackageManagerService | APK 卸載、安裝、解析等等操作 |
* Core
| 服務 | 功能 |
| -------- | -------- |
| DropBoxManagerService | 生成、管理系統運行時的日誌文件 |
| BatteryService | 管理電池相關的服務 |
| UsageStatsService | 收集用戶使用每個 APP 的頻率、時長 |
| WebViewUpdateService | WebView 更新服務 |
* Other
| 服務 | 功能 |
| -------- | -------- |
| CameraService | 相機相關服務 |
| AlertManagerService | 定時器服務 |
| InputManagerService | 管理輸入事件 |
| WindowManagerService | 窗口管理 |
| VrManagerService | Vr 模式管理服務 |
| BluetoothManagerService | 藍芽管理服務 |
| NotificationManagerService | 通知管理服務 |
| DeviceStorageMonitorService | 裝置儲存管理 |
| LocalManagerService | 定位管理 |
| AudioService | 音頻管理 |
### [SystemService](https://cs.android.com/android/platform/superproject/+/master:frameworks/base/services/core/java/com/android/server/SystemService.java) 生命週期
* SystemService 類提供系統服務生命週期的回調函數(就像是 Activity#onCreate、onStart、onResume... 等等)
> 這跟上面的 SystemService 不同,這是抽象類
> 路徑:`frameworks/base/services/core/java/com/android/server/SystemService.java`
* SystemService 生命週期回調方法
| 生命週期 - 方法 | 說明 |
| - | - |
| onStart | 服務初次啟動,**通過這個回調註冊到 Binder 驅動中** |
| onBootPhase | 傳給每個服務 SystemService 的啟動常量,讓服務自己對有興趣的階段處理 |
```java=
// SystemService.java
public abstract void onStart();
public void onBootPhase(@BootPhase int phase) {}
```
* SystemService 生命週期常量
| 生命週期 - 常量 | 意義 |
| -------- | -------- |
| PHASE_WAIT_FOR_DEFAULT_DISPLAY(100) | 等待顯示器 |
| PHASE_WAIT_FOR_SENSOR_SERVICE(200) | 等待感應器服務 |
| PHASE_LOCK_SETTINGS_READY(480) | Lock Settings 就緒 |
| PHASE_SYSTEM_SERVICES_READY(500) | 系統服務就緒 |
| PHASE_DEVICE_SPECIFIC_SERVICES_READY(520) | 特殊服務就緒 |
| PHASE_ACTIVITY_MANAGER_READY(550) | AMS 就緒 |
| PHASE_THIRD_PARTY_APPS_CAN_START (600) | 第三方 APP 可以啟動 |
| PHASE_BOOT_COMPLETED (1000) | 系統啟動完成 |
### 註冊 SystemService 服務
* 我們知道大部分 Service 都需註冊到 ServiceManager 中(Binder 驅動),而 **SystemService 中的服務也需要註冊到 ServiceManager 中(Binder 驅動)**
* 繼承 `SystemService` 類:透過包裝好的 `publishBinderService` 註冊 (其實最終仍會使用 ServiceManager.addService 方法)
* `BatteryService` 服務:它就是 ^1.^ 繼承 `SystemService`、^2.^ 覆寫 `onStart` 方法,在方法中註冊 battery、batteryproperties 服務
```java=
// BatteryService.java
public final class BatteryService extends SystemService {
@Override
public void onStart() {
registerHealthCallback();
mBinderService = new BinderService();
// 註冊 battery
publishBinderService("battery", mBinderService);
// 註冊 batteryproperties
mBatteryPropertiesRegistrar = new BatteryPropertiesRegistrar();
// @ 追蹤 publishBinderService 方法
publishBinderService("batteryproperties", mBatteryPropertiesRegistrar);
publishLocalService(BatteryManagerInternal.class, new LocalService());
}
}
```
* publishBinderService 方法:最終會呼叫 ServiceManager#addService 方法
```java=
// ServiceManager.java
protected final void publishBinderService(@NonNull String name, @NonNull IBinder service) {
publishBinderService(name, service, false);
}
protected final void publishBinderService(@NonNull String name, @NonNull IBinder service,
boolean allowIsolated) {
publishBinderService(name, service, allowIsolated, DUMP_FLAG_PRIORITY_DEFAULT);
}
protected final void publishBinderService(String name, IBinder service,
boolean allowIsolated, int dumpPriority) {
// 呼叫 ServiceManager#addService 方法
ServiceManager.addService(name, service, allowIsolated, dumpPriority);
}
```
* [**ServiceManager**](https://android.googlesource.com/platform/frameworks/base/+/master/core/java/android/os/ServiceManager.java)#addService 方法:透過 [**ServiceManagerNative**](https://cs.android.com/android/platform/superproject/+/master:frameworks/base/core/java/android/os/ServiceManagerNative.java) 取得 ServiceManager 的代理類並添加服務
```java=
// ServiceManager.java
public static void addService(String name, IBinder service) {
addService(name, service, false, IServiceManager.DUMP_FLAG_PRIORITY_DEFAULT);
}
// 最終呼叫到這個方法
public static void addService(String name, IBinder service, boolean allowIsolated,
int dumpPriority) {
try {
// getIServiceManager 返回 ServiceManagerNative
getIServiceManager().addService(name, service, allowIsolated, dumpPriority);
} /* 省略 catch */
}
private static IServiceManager getIServiceManager() {
if (sServiceManager != null) {
return sServiceManager;
}
// Find the service manager
sServiceManager = ServiceManagerNative
.asInterface(Binder.allowBlocking(BinderInternal.getContextObject()));
return sServiceManager;
}
```
* PackageManagerService 就是使用 ServiceManager#addService 方法註冊 `package`、`package_native` 服務
```java=
// PackageManagerService.java
public static PackageManagerService main(Context context, Installer installer,
@NonNull DomainVerificationService domainVerificationService, boolean factoryTest,
boolean onlyCore) {
... 省略
PackageManagerService m = new PackageManagerService(injector, onlyCore, factoryTest,
Build.FINGERPRINT, Build.IS_ENG, Build.IS_USERDEBUG, Build.VERSION.SDK_INT,
Build.VERSION.INCREMENTAL);
... 省略
ServiceManager.addService("package", m);
final PackageManagerNative pmn = m.new PackageManagerNative();
ServiceManager.addService("package_native", pmn);
return m;
}
```
### 管理 Java 服務 - [SystemServiceManager](https://cs.android.com/android/platform/superproject/+/master:frameworks/base/services/core/java/com/android/server/SystemServiceManager.java)
* 啟動 Java 服務大多是靠 SystemServiceManager 類管理:透過 `SystemServiceManager` 就可以找到 `SystemService` 中 的服務 (類似於 DNS 功能)
```java=
// SystemServiceManager.java
private final ArrayList<SystemService> mServices = new ArrayList<SystemService>();
public <T extends SystemService> T startService(Class<T> serviceClass) {
try {
final String name = serviceClass.getName();
// 判斷傳入的 class 是否繼承於 SystemService
if (!SystemService.class.isAssignableFrom(serviceClass)) {
throw new RuntimeException("Failed to create " + name
+ ": service must extend " + SystemService.class.getName());
}
final T service;
try {
Constructor<T> constructor = serviceClass.getConstructor(Context.class);
service = constructor.newInstance(mContext);
} /* 省略 catch */
// @ 追蹤 startService 方法
startService(service);
return service;
} finally {
Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER);
}
}
public void startService(@NonNull final SystemService service) {
// 緩存
mServices.add(service);
// 啟動時間
long time = SystemClock.elapsedRealtime();
try {
// 呼叫生命週期 onStart
service.onStart();
} /* 省略 catch */
warnIfTooLong(SystemClock.elapsedRealtime() - time, service, "onStart");
}
```
:::info
* 像是 **LightsService**、**DisplayManager**... 就是使用這種方式
```java=
mSystemServiceManager.startService(LightsService.class);
mDisplayManagerService = mSystemServiceManager.startService(DisplayManagerService.class);
```
:::
* 透過 SystemServiceManager#startBootPhase 方法通知其他服務,狀態改變
:::success
* SystemServiceManager 是觀察者模式
:::
```java=
// SystemServiceManager.java
// 管理所有服務!
private final ArrayList<SystemService> mServices = new ArrayList<SystemService>();
public void startBootPhase(@NonNull TimingsTraceAndSlog t, int phase) {
if (phase <= mCurrentPhase) {
throw new IllegalArgumentException("Next phase must be larger than previous");
}
mCurrentPhase = phase;
Slog.i(TAG, "Starting phase " + mCurrentPhase);
try {
t.traceBegin("OnBootPhase_" + phase);
final int serviceLen = mServices.size();
for (int i = 0; i < serviceLen; i++) {
final SystemService service = mServices.get(i);
long time = SystemClock.elapsedRealtime();
t.traceBegin("OnBootPhase_" + phase + "_" + service.getClass().getName());
try {
// 通知目標服務
service.onBootPhase(mCurrentPhase);
} /* 省略 catch */
}
} finally {
t.traceEnd();
}
if (phase == SystemService.PHASE_BOOT_COMPLETED) {
final long totalBootTime = SystemClock.uptimeMillis() - mRuntimeStartUptime;
t.logDuration("TotalBootTime", totalBootTime);
SystemServerInitThreadPool.shutdown();
}
}
```
## SystemServer 啟動
這裡主要是要看 SystemServer 在啟動的過程中,註冊哪些服務
### SystemServer - Bootstrap 系統服務
* SystemServer#startBootstrapServices 這個函數中會啟動許多服務,**這些服務都是由 ++SystemServiceManager 來統一管理++**,以下介紹幾種常見的
| 服務 | 功能 |
| -------- | -------- |
| Installer | 安裝所有 APK 的服務,啟動完 Install 服務後才能啟動其他服務 |
| ActivityManagerService | 負責管理 4 大零組件 |
| PowerManagerService | 計算系統中 Power 相關,以及對應策略 |
| LigthsService | 管理、顯示 LED |
| DisplayManagerService | 與 WMS 有關,用來管理該設備的顯示 |
| UserManagerService | 多用戶模式管理 |
| SensorService | 各種傳感器服務 |
| PackageManagerService | APK 卸載、安裝、解析等等操作 |
最後透過 **AMS#setSystemProcess** 來添加進程相關的服務 (meminfo、gfxinfo、dbinfo、cpuinfo... 等等),這些服務都可以透過 adb 調用
```java=
// /android/server/SystemServer.java
private void startBootstrapServices(@NonNull TimingsTraceAndSlog t) {
... 省略部分
mSystemServiceManager.startService(FileIntegrityService.class);
Installer installer = mSystemServiceManager.startService(Installer.class);
mSystemServiceManager.startService(DeviceIdentifiersPolicyService.class);
t.traceEnd();
mSystemServiceManager.startService(UriGrantsManagerService.Lifecycle.class);
startMemtrackProxyService();
ActivityTaskManagerService atm = mSystemServiceManager.startService(
ActivityTaskManagerService.Lifecycle.class).getService();
mActivityManagerService = ActivityManagerService.Lifecycle.startService(
mSystemServiceManager, atm);
mActivityManagerService.setSystemServiceManager(mSystemServiceManager);
mActivityManagerService.setInstaller(installer);
mWindowManagerGlobalLock = atm.getGlobalLock();
mDataLoaderManagerService = mSystemServiceManager.startService(
DataLoaderManagerService.class);
mIncrementalServiceHandle = startIncrementalService();
mPowerManagerService = mSystemServiceManager.startService(PowerManagerService.class);
mSystemServiceManager.startService(ThermalManagerService.class);
mActivityManagerService.initPowerManagement();
mSystemServiceManager.startService(RecoverySystemService.Lifecycle.class);
... 省略部分
mDisplayManagerService = mSystemServiceManager.startService(DisplayManagerService.class);
t.traceEnd();
... 省略部分
mActivityManagerService.setSystemProcess();
...省略部分
}
```
## Appendix & FAQ
:::info
:::
###### tags: `Android 系統`