Android ServiceManager:核心服务的注册与发现机制

406 阅读2分钟

一、服务注册的核心流程

ServiceManager 注册服务的过程,是 Android 启动时的一个关键环节。它通过一个标准的、跨进程的流程,将所有核心服务集中管理。

1. 系统服务启动

  • SystemServer 进程启动时,它会初始化一系列核心服务,如 ActivityManagerService(AMS)、PackageManagerService(PMS)等。
  • 这些服务都实现了 IBinder 接口,使其能够通过 Binder 机制进行跨进程通信。

2. 注册到ServiceManager

  • SystemServer 随后会调用 ServiceManager.addService() 方法,将服务注册到 ServiceManager
  • ServiceManager 是一个特殊的 Binder 服务,其句柄(Handle)固定为**0**,这使得所有进程都能通过这个句柄找到它。

3. 登记服务信息

  • addService() 调用中,SystemServer 会提供两个关键信息:

    • 服务名:一个唯一的字符串标识符,如 "activity"
    • Binder 引用:服务端的 IBinder 对象,它是其他进程调用该服务的唯一凭证。

二、ServiceManager的底层处理机制

ServiceManager 接收到注册请求后,会进行一系列严谨的处理。

  1. 权限校验ServiceManager 会检查调用者的身份和权限。只有像 SystemServer 这样具备高权限的进程,才能注册核心系统服务。这是一种强大的安全机制,防止恶意服务冒充系统服务。
  2. 存储服务信息ServiceManager 内部维护一个 Native 层的哈希表(Map<String, IBinder>)。它会将服务名作为 Key,服务的 Binder 引用作为 Value,存储起来。
  3. 成为Binder上下文管理者:在 ServiceManager 启动时,它会向 Binder 驱动发送一个特殊的 ioctl 命令 BINDER_SET_CONTEXT_MGR,告诉驱动自己将管理所有服务的注册和查询。

三、服务发现与跨进程调用

ServiceManager 不仅负责注册,更重要的是,它为服务发现提供了统一入口。

  1. 查询服务:当一个 App 需要调用 ActivityManagerService 时,它会通过 Binder 调用 ServiceManagergetService() 方法,并传入服务名 "activity"
  2. 返回Binder引用ServiceManager 在哈希表中查找 "activity",并返回 ActivityManagerServiceBinder 引用。
  3. 跨进程调用:App 拿到 Binder 引用后,就可以通过 Binder 机制,直接向 ActivityManagerService 发送跨进程调用请求。

四、总结:ServiceManager的意义

ServiceManager 是 Android Binder 框架的核心服务中枢。它的存在,为 Binder 跨进程通信提供了统一的命名空间和管理机制,是 Android 系统稳定运行的基石。

核心价值

  • 集中管理:所有核心服务集中登记,避免散落各处。
  • 服务发现:为 App 提供了一个统一、可靠的服务查找入口。
  • 权限隔离:在注册和查询阶段进行权限校验,防止恶意服务破坏系统。