Android ServiceManager:Binder IPC的核心服务中枢

390 阅读2分钟

一、ServiceManager的核心职责

ServiceManager 是 Android 系统中一个特殊的 Native 进程,它是 Binder 机制的“服务注册与查询中心” 。它的存在,为 Binder 跨进程通信提供了统一的命名空间和管理机制。

  • 服务注册中心:所有系统服务(如 AMSWMS)在启动后,都会通过 BinderServiceManager 注册自己。
  • 服务查询入口:App 或其他进程需要调用系统服务时,必须首先通过 ServiceManager 查询到该服务。
  • Binder 上下文管理者ServiceManagerBinder 驱动的上下文管理者(Context Manager) 。它为 Binder 驱动提供了服务注册表,确保服务通信有序。

二、ServiceManager的启动流程

ServiceManager 的启动是 Android 系统启动的关键环节之一。

  1. init 进程启动:设备启动后,Linux 内核启动 init 进程。init 进程是所有用户进程的父进程。
  2. init.rc 脚本init 进程会读取 init.rc 脚本。脚本中的 service servicemanager 配置,告诉 init 进程在系统启动时拉起 ServiceManager
  3. 打开Binder驱动ServiceManager 启动后,会打开 /dev/binder 设备文件,建立与 Binder 驱动的连接。
  4. 成为Context ManagerServiceManager 通过一个特殊的 ioctl 命令 BINDER_SET_CONTEXT_MGR,告诉 Binder 驱动:我将成为 Binder 的上下文管理者。

三、ServiceManager的工作机制

ServiceManager 启动后,会进入一个无限循环,等待并处理来自其他进程的请求。

  • addService:系统服务(如 ActivityManagerService)启动后,会调用 ServiceManageraddService 方法。ServiceManager 随后会将服务名称和 Binder 引用存储到其内部的映射表中。
  • getService:当一个 App 需要调用系统服务时,它会通过 Binder 调用 ServiceManagergetService 方法。ServiceManager 会在映射表中查找对应的服务,并返回其 Binder 引用。
  • 句柄与引用ServiceManager 内部维护的是一个 Name-to-Binder 的映射表。它通过一个整数 Handle 来唯一标识一个 Binder 服务。当客户端通过 getService 查询服务时,它会得到这个 Handle,从而获得服务的 Binder 引用。

四、ServiceManager与SystemServer的协同

  • 启动顺序:ServiceManager -> Zygote -> SystemServer。

  • 分工合作

    • ServiceManager:负责管理服务的注册表,处理跨进程的查找和注册请求。
    • SystemServer:负责启动所有的核心系统服务,并将这些服务的 Binder 引用注册到 ServiceManager

结论

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