Android Framework 面试系列(三)ServiceManager

505 阅读2分钟

ServiceManager 是所有系统服务的注册中心,提供的功能有注册服务、查找服务、获取服务等。它的实现代码在 service_manager.cpp 中。

ServiceManager 的启动流程

ServiceManager 进程是由 init 进程启动的,是一个单独运行的 native 进程。和 zygote 一样,ServiceManager 进程启动过程也是:init 读取 init.rc 配置文件,然后根据配置文件使用 fork 启动ServiceManager 进程。

在启动完成后,ServiceManager 进程主要做了三件事:

  1. 打开 Binder 驱动
  2. 注册自己的服务,方便其他进程获取 ServiceManager 的Binder服务接口
  3. epoll 机制监听 Binder 事务

addService、getService、checkService

在 ServiceManager 中有三个重要的方法:

  • addService():允许服务将自己注册到 ServiceManager 中,以便客户端可以查找它们。一旦注册,服务端的 Binder 引用,就可以被客户端通过 ServiceManager 获取到。
  • getService() 和 checkService():它们都允许客户端查找注册在 ServiceManager 中的服务。客户端可以通过 getService()和 checkService() 获取到服务的 Binder 引用,然后就可以发起 Binder 事务,调用该服务的方法。它们的区别是,getService() 会阻塞线程,而 checkService() 不会。

系统服务的注册和获取流程

这里以 AMS 的注册和获取为例。注册流程如下图所示:SystemServer 进程启动后,就会启动 AMS 服务。服务启动后,就会通过 Binder 驱动,获取 ServiceManger 的 Binder 引用,服务获取到 ServiceManager 的 Binder 引用后,发起 Binder 事务,调用 ServiceManager 的 addService()方法来注册 AMS 服务。

image.png

获取流程如下图所示,通过 getService() 或 checkService() 方法,普通的用户进程就可以利用 AMS 服务的名称,通过 ServiceManager 获取到 AMS 服务对应的 Binder 引用。

image.png

参考