一句话说透Android里面的ServiceManage查找服务

362 阅读2分钟

Android ServiceManager:核心服务的发现与通信中枢


一、ServiceManager的核心职责

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

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

二、查找服务的核心流程

App 查找一个服务的完整流程,是一个严谨的跨进程通信过程。

1. App发起查询请求

  • 当 App 调用 getSystemService() 方法时,它会向 ServiceManager 发起查询请求。
  • ServiceManager 是一个特殊的 Binder 服务,其句柄(Handle)固定为**0**,这使得所有进程都能通过这个句柄找到它。

2. ServiceManager的查询与返回

  • ServiceManager 接收到请求后,会在其内部维护的映射表中,按服务名查找对应的服务。
  • 如果服务存在,ServiceManager 会返回该服务的 Binder 引用。Binder 驱动随后在 App 进程中创建一个**Binder 代理(Proxy)**。

3. 客户端调用

  • App 拿到 Binder 代理后,就可以通过它直接向远程服务发起跨进程调用。这个过程对开发者是透明的,客户端可以像调用本地方法一样调用远程服务。

三、关键机制与优化

  • 权限校验ServiceManagergetService 阶段会进行权限校验。对于敏感服务(如 location),如果调用者没有相应的权限,ServiceManager 会拒绝查询,返回 null
  • 客户端缓存:为了避免重复的跨进程调用,Context.getSystemService() 内部会缓存已经查询过的服务。首次获取服务时,会向 ServiceManager 查询;后续再获取同一个服务时,会直接从缓存中返回。
  • Binder 句柄Binder 句柄是一个整数值,它在 Binder 驱动中,用于唯一标识一个 Binder 服务。ServiceManager 的映射表就是由服务名和 Binder 句柄组成的。

四、总结

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

核心价值

  • 统一入口:为 App 提供了一个统一、可靠的服务查找入口。
  • 权限管控:在注册和查询阶段进行权限校验,防止恶意服务破坏系统。
  • 跨进程协调Binder 通信依赖 ServiceManager 维护的全局服务表,从而实现了高效的跨进程调用。