Android Framework 之 ServiceManager

Android ServiceManager

ServiceManager 在 Android 系统中扮演了核心的角色。主要负责跨进程通信(IPC)的管理和服务的注册与查找。

管理系统服务ServiceManager 提供一个全局的服务注册表,用于存储所有的系统服务。一个服务一旦被注册到 ServiceManager,其他的进程就可以通过 **ServiceManager **来访问这个服务。

提供服务查找功能:ServiceManager 提供 getService() 和 **checkService() **方法,可以通过服务名称来查找服务。其他进程可以通过这些方法获取到已经注册的服务的引用,然后进行跨进程通信。

负责跨进程通信:ServiceManager 提供 IPC 机制,可以让其他进程通过 Binder 机制来访问已经注册的服务,实现进程间的通信。

启动流程

设备启动:首先,设备启动并运行 bootloader,然后启动 Linux 内核。

启动 init 进程Linux 内核启动后,会启动 init 进程。init 进程是 Android 系统中的第一个进程,负责初始化系统环境,并启动其他的系统服务和进程。

启动 Zygote 进程init 进程会启动一系列的 native daemons,包括 Zygote 进程。Zygote 进程是所有 Android 应用进程的父进程,负责孵化新的应用进程。

启动 SystemServer 进程Zygote 进程会孵化出 SystemServer 进程。SystemServer 进程负责启动和管理系统级服务,包括 ServiceManager。

启动 ServiceManagerSystemServer 进程在启动过程中,会启动 ServiceManager,并将各种系统服务注册到 **ServiceManager **中。

以上就是 ServiceManager 的启动流程。在这个流程中,ServiceManager 是由 SystemServer 进程启动的,然后通过 ServiceManager 来管理和调度所有的系统服务。

核心原理

ServiceManager 是 Android 系统中负责管理所有 Binder 服务的核心部分。它的主要作用是管理和调度系统中所有的 Binder 服务,包括系统服务(如 ActivityManagerServiceWindowManagerService 等)和第三方服务。它提供了一种机制,使得一个进程可以通过 Binder 跨进程调用另一个进程中的服务。

ServiceManager 本身也是一个 Binder 服务,其他服务或应用可以通过它获取系统中已注册的 Binder 服务。

ServiceManager 的启动流程:

启动ServiceManagerSystemServer 进程在启动过程中初始化和启动。在 SystemServercreateSystemContext 方法中,会创建一个 ServiceManager 的实例。

注册服务:在 SystemServer 启动各种系统服务的过程中,这些服务的 Binder 会被注册到 ServiceManager 中,这样其他进程就可以通过 ServiceManager 获取这些服务。

ServiceManager 的工作流程:

注册服务:当一个 Binder 服务启动时,它会调用 ServiceManageraddService 方法将自己注册到 ServiceManager 中。

获取服务:当一个进程需要使用某个 Binder 服务时,它会调用 ServiceManagergetService 方法,ServiceManager 会返回对应的 Binder 对象,这样该进程就可以通过 Binder 调用服务中的方法了。

监听服务:一个进程可以调用 ServiceManageraddServiceListener 方法来监听某个服务的状态,例如监听服务是否已启动。

总的来说,ServiceManager 在 Android 系统中扮演着 “服务的服务” 的角色,它负责管理和调度系统中所有的 Binder 服务,使得进程间的通信和交互成为可能。

你可能感兴趣的:(android)