第4课_ServiceManager工作原理
热度🔥:92 免费课程
授课语音
ServiceManager 启动和工作原理
ServiceManager
是 Android 系统中用于管理系统服务的关键组件之一,它负责在 Android 系统中注册、启动和获取服务。通过 ServiceManager
,系统中的各种服务能够被客户端应用或其他系统服务访问和调用。ServiceManager
是 Android 服务架构的核心,所有的系统服务都需要通过它进行管理和访问。
1. ServiceManager 启动过程
ServiceManager
是 Android 系统中的一个重要系统级服务,它的启动过程和其他系统服务的启动过程类似。以下是 ServiceManager
启动的关键步骤:
1.1 ServiceManager
的启动
ServiceManager
是在SystemServer
进程中启动的。当系统启动时,init.rc
配置文件指定了SystemServer
进程,SystemServer
会启动一系列的系统服务。ServiceManager
是其中的一个重要服务。ServiceManager
的启动由SystemServer
中的startSystemServices()
方法来完成。具体而言,SystemServer
在启动过程中会创建一个ServiceManager
实例并启动它。
1.2 SystemServer
启动 ServiceManager
在 Android 的 SystemServer
中,启动服务的步骤如下:
public class SystemServer {
public static void main(String[] args) {
// 系统服务启动代码
ServiceManager.init(); // 启动 ServiceManager
// 启动其他系统服务
new ActivityManagerService(context);
new PackageManagerService(context);
new WindowManagerService(context);
// 更多服务...
}
}
在上述代码中,ServiceManager.init()
会初始化并启动 ServiceManager
,该方法会创建服务管理器并进行一些必要的服务注册。
1.3 ServiceManager
和 Binder
机制
ServiceManager
使用 Binder IPC 机制来管理和访问系统服务。每当有应用或其他服务请求某个系统服务时,ServiceManager
会通过 Binder
与请求方进行通信并返回服务的 IBinder
对象。
2. ServiceManager 工作原理
ServiceManager
作为服务管理器,主要负责服务的注册和查找。它通过一个全局的 HashMap
来管理系统服务。当系统需要使用某个服务时,ServiceManager
会返回该服务对应的 IBinder
对象,客户端可以通过该 IBinder
对象与服务进行通信。
2.1 注册服务
在系统中,系统服务通常会在启动时通过 ServiceManager
注册自己。系统服务注册时,会向 ServiceManager
提供服务名称和一个实现了 IBinder
接口的服务对象。ServiceManager
会将服务名称和服务对象的绑定关系保存在一个全局的 HashMap
中。
服务注册的例子如下:
public class ServiceManager {
private static final HashMap<String, IBinder> sServices = new HashMap<>();
public static void addService(String name, IBinder service) {
synchronized (sServices) {
sServices.put(name, service);
}
}
}
通过调用 addService
方法,ServiceManager
将服务添加到它的服务池中。
2.2 查找服务
当一个应用或系统服务需要访问某个系统服务时,它会通过 ServiceManager
的 getService
方法来获取对应服务的 IBinder
对象。此时,ServiceManager
会查找注册的服务并返回对应的 IBinder
。
public static IBinder getService(String name) {
synchronized (sServices) {
return sServices.get(name);
}
}
调用方获取到的 IBinder
对象就是系统服务的代理,客户端可以通过该代理与服务进行通信。
2.3 服务通信:Binder 机制
服务与客户端之间的通信是通过 Android 的 Binder 机制实现的。ServiceManager
返回的 IBinder
对象是一个代理对象,客户端通过它调用远程服务的接口。
例如,客户端可以通过 IBinder
对象调用 ActivityManagerService
提供的接口来管理应用程序。
2.4 系统服务的启动与绑定
ServiceManager
还负责系统服务的启动与绑定。当客户端请求某个服务时,ServiceManager
会查找该服务是否已经启动,如果没有启动,则会启动该服务,并返回一个 IBinder
对象。
例如,ActivityManagerService
是一个典型的系统服务,它的启动过程是由 SystemServer
启动的,ServiceManager
会注册 ActivityManagerService
并提供它的 IBinder
给客户端应用。应用通过 IBinder
对象与服务进行交互。
3. ServiceManager 与 SystemServer
ServiceManager
是由 SystemServer
启动并管理的,它作为系统服务的一个重要管理者,负责服务的注册、查找、和访问。
SystemServer
启动时会初始化ServiceManager
,并注册所有核心的系统服务(如ActivityManagerService
、PackageManagerService
、WindowManagerService
等)。ServiceManager
维护了一个全局的服务表,客户端可以通过服务名称查询相应的IBinder
对象。
4. ServiceManager 和 Application 服务的区别
4.1 System Service 和 Application Service
System Service:由
SystemServer
启动并管理,通常用于提供底层功能和管理设备资源,如ActivityManagerService
、PackageManagerService
等。它们是系统级别的服务,通常是由系统启动时注册到ServiceManager
。Application Service:是由应用程序启动并绑定的服务,应用程序通过
startService()
或bindService()
来启动它们。ApplicationService
的生命周期通常由客户端应用的启动和绑定控制。
4.2 区别
- 生命周期:
SystemService
是常驻内存的,并且在系统启动时就被启动,而ApplicationService
的生命周期由应用的启动和绑定情况控制。 - 访问范围:
SystemService
对整个系统可用,而ApplicationService
只能在启动它的应用或客户端中使用。
5. 总结
ServiceManager
是 Android 中的一个核心组件,它负责管理和调度系统级服务。它的主要职责是注册和查找服务,并通过 Binder 机制实现服务间的通信。ServiceManager
启动时由 SystemServer
进程进行初始化,并维护一个服务池,所有的系统服务都通过 ServiceManager
注册和访问。
- 启动:
ServiceManager
在SystemServer
中启动,并通过ServiceManager.addService()
方法注册各个系统服务。 - 工作原理:
ServiceManager
通过IBinder
对象管理服务,客户端通过ServiceManager.getService()
获取对应服务的代理对象。 - 区别:
SystemService
是系统级服务,通常常驻内存,而ApplicationService
是应用级服务,由应用启动并绑定。
ServiceManager
通过提供统一的接口,使得 Android 系统中的服务可以被方便地管理和访问,从而支持系统的灵活扩展和高效运行。