Android系統的心臟,SystemServer進程及各系統服務之間的關系
SystemServer
SystemServer是Android系統中的一個重要進程,是zygote fork的第一個進程,負責啟動和管理系統中的各種服務。在Android系統中,SystemServer進程的名稱為"system_server"。
SystemServer進程啟動后,會加載SystemServer類并執行其main函數,main函數是SystemServer的入口點,負責啟動和初始化各種系統服務。在這個過程中,SystemServer會創建一個Looper和一個Handler,用于在主線程中處理消息和運行任務。Looper是Android事件循環的一部分,負責在主線程中接收和分發消息,Handler則用于發送和處理消息。
SystemServer創建并初始化的系統服務包括ActivityManagerService(AMS)、PackageManagerService(PMS)、WindowManagerService(WMS)等。這些服務在Android系統中扮演著重要的角色,例如AMS負責管理應用程序的生命周期和活動狀態,PMS負責管理應用程序包的安裝和卸載,WMS則負責管理窗口的創建、顯示和更新等。
在SystemServer的main函數中,還會啟動其他各種系統服務,這些服務通過SystemServiceManager進行管理和控制。SystemServer進程會一直運行,處理來自各種系統服務的消息,確保系統的正常運行和穩定性。
ServiceManager
ServiceManager是Android系統中的一個重要守護進程,負責管理系統服務的注冊、查找和啟動。
- 「作用」:
提供服務注冊和查找:ServiceManager充當了一個中央注冊表的角色,允許應用程序和系統組件將自己注冊為服務,并提供一個唯一的服務名稱。其他應用程序可以通過ServiceManager查找并獲取已注冊的服務,從而實現進程間通信。
啟動和管理系統進程:ServiceManager還負責啟動和管理一些重要的系統進程,例如系統服務(如Telephony服務、Media服務等),以及其他一些重要的系統組件。
實現Binder機制:Android系統采用Binder作為進程間通信(IPC)的機制,ServiceManager是Binder通信的關鍵組件之一。
- 「權限」:
ServiceManager的訪問權限較高,一般只有系統級應用或者具有系統權限的應用程序才能夠使用ServiceManager進行服務的注冊和查詢。
- 「與Binder的關系」:
ServiceManager是Binder的守護進程,在Android上如果ServiceManager掛掉,所有采用Binder通信的進程服務都會受到影響。ServiceManager本身也是一個Binder服務,其handle固定為0。應用程序相要通過Binder向一個service發送數據,必須先通過ServiceManager獲取該service的handle,然后才能通過binder驅動與service通信。
- 「啟動流程」:
在Android系統的啟動過程中,SystemServer進程在啟動時會啟動ServiceManager,并將各種系統服務注冊到ServiceManager中。
protected final void publishBinderService(String name, IBinder service, boolean allowIsolated) {
ServiceManager.addService(name, service, allowIsolated);
}
SystemServiceManager
SystemServiceManager是Android系統中用于管理系統服務的一個類。負責管理所有注冊的系統級別服務,并在需要時啟動和停止它們。例如,當SystemServer進程啟動時,SystemServiceManager會注冊PackageManagerService、WindowManagerService、ActivityManagerService等服務,并在需要時啟動。
@SuppressWarnings("unchecked")
public <T extends SystemService> T startService(Class<T> serviceClass) {
final String name = serviceClass.getName();
Slog.i(TAG, "Starting " + name);
// Create the service.
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 (InstantiationException ex) {
throw new RuntimeException("Failed to create service " + name
+ ": service could not be instantiated", ex);
} catch (IllegalAccessException ex) {
throw new RuntimeException("Failed to create service " + name
+ ": service must have a public constructor with a Context argument", ex);
} catch (NoSuchMethodException ex) {
throw new RuntimeException("Failed to create service " + name
+ ": service must have a public constructor with a Context argument", ex);
} catch (InvocationTargetException ex) {
throw new RuntimeException("Failed to create service " + name
+ ": service constructor threw an exception", ex);
}
// Register it.
mServices.add(service);
// Start it.
try {
service.onStart();
} catch (RuntimeException ex) {
throw new RuntimeException("Failed to start service " + name
+ ": onStart threw an exception", ex);
}
return service;
}
SystemServiceManager通過調用registerService函數來注冊系統服務,并可以通過startService、stopService函數來啟動或停止這些服務。當系統不再需要某個服務時,SystemServiceManager也會負責將其停止并卸載。
SystemServiceManager是Android系統內部使用的組件,通常不需要開發者直接與其交互。
SystemService
SystemService是framework的一些對應功能的服務,供其他模塊和APP來調用。這些服務通常與特定的功能或模塊相關,例如BatteryService(用于獲取電池屬性、充電狀態、百分比等)、PowerManagerService(控制休眠、喚醒等)以及TvInputManagerService(用于創建和釋放會話等)。
SystemService的使用相對簡單,通過context.getSystemService(@NonNull Class<T> serviceClass)或Object getSystemService(@ServiceName @NonNull String name)方法獲取一個manager對象,然后調用SystemService里面的方法。
SystemService是Android系統內部使用的組件,開發者在開發Android應用程序時,通常是通過系統提供的API來與系統服務進行交互的,而不是直接操作SystemService。
val powerManager = getSystemService(Context.POWER_SERVICE) as PowerManager