授课语音

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 ServiceManagerBinder 机制

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 查找服务

当一个应用或系统服务需要访问某个系统服务时,它会通过 ServiceManagergetService 方法来获取对应服务的 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,并注册所有核心的系统服务(如 ActivityManagerServicePackageManagerServiceWindowManagerService 等)。
  • ServiceManager 维护了一个全局的服务表,客户端可以通过服务名称查询相应的 IBinder 对象。

4. ServiceManager 和 Application 服务的区别

4.1 System Service 和 Application Service

  • System Service:由 SystemServer 启动并管理,通常用于提供底层功能和管理设备资源,如 ActivityManagerServicePackageManagerService 等。它们是系统级别的服务,通常是由系统启动时注册到 ServiceManager

  • Application Service:是由应用程序启动并绑定的服务,应用程序通过 startService()bindService() 来启动它们。ApplicationService 的生命周期通常由客户端应用的启动和绑定控制。

4.2 区别

  • 生命周期SystemService 是常驻内存的,并且在系统启动时就被启动,而 ApplicationService 的生命周期由应用的启动和绑定情况控制。
  • 访问范围SystemService 对整个系统可用,而 ApplicationService 只能在启动它的应用或客户端中使用。

5. 总结

ServiceManager 是 Android 中的一个核心组件,它负责管理和调度系统级服务。它的主要职责是注册和查找服务,并通过 Binder 机制实现服务间的通信。ServiceManager 启动时由 SystemServer 进程进行初始化,并维护一个服务池,所有的系统服务都通过 ServiceManager 注册和访问。

  • 启动ServiceManagerSystemServer 中启动,并通过 ServiceManager.addService() 方法注册各个系统服务。
  • 工作原理ServiceManager 通过 IBinder 对象管理服务,客户端通过 ServiceManager.getService() 获取对应服务的代理对象。
  • 区别SystemService 是系统级服务,通常常驻内存,而 ApplicationService 是应用级服务,由应用启动并绑定。

ServiceManager 通过提供统一的接口,使得 Android 系统中的服务可以被方便地管理和访问,从而支持系统的灵活扩展和高效运行。

去1:1私密咨询

系列课程: