
本文共 2748 字,大约阅读时间需要 9 分钟。
Android MediaServer 之 ServiceManager 简析
一 MediaServer 之 Server端
1.1 步骤一
在Android系统中,MediaServer作为ServiceManager的客户端,其Server进程需要先向ServiceManager注册服务。具体来说,Server进程通过调用defaultServiceManager()
函数获取IServiceManager接口的实例。这个函数的核心作用是创建并返回一个BpBinder对象,这个BpBinder对象作为ServiceManager的代理,负责管理系统中的各种服务。
1.2 步骤二
1.2.1 defaultServiceManager()分析
defaultServiceManager()
函数通过调用ProcessState::self()->getContextObject(NULL)
获取一个BpBinder对象。BpBinder是Android系统中与Binder通信相关的代理类,其主要职责是将客户端的请求转发给Binder设备。通过interface_cast
函数,将BpBinder强制转换为IServiceManager接口,得到一个可以与ServiceManager交互的代理对象。
1.2.2 BpBinder 与 IServiceManager简析
1.2.2.1 BBinder简析
BBinder和BpBinder都是从IBinder类派生而来的,BBinder是Binder设备的本地代理,用于处理Binder设备本身的通信需求。而BpBinder是客户端用来与Server进程交互的代理类,p即Proxy的意思,表示BpBinder是对BBinder的代理。
1.2.2.2 IServiceManager简析
IServiceManager接口定义了ServiceManager所提供的业务逻辑,包括注册服务、查询服务、添加服务等功能。ServiceManager通过Binder机制管理系统中的各种服务,Client进程需要通过ServiceManager获取服务信息并与服务进程建立通信通路。
1.2.2.2.1 定义业务逻辑
通过DECLARE_META_INTERFACE和IMPLEMENT_META_INTERFACE宏,ServiceManager接口将业务逻辑与通信挂钩紧密结合。IServiceManager接口定义了几个关键方法,用于管理服务的生命周期和与客户端的交互。
1.2.2.2.2 业务与通信挂钩
ServiceManager通过Binder机制实现服务的动态注册和发现。客户端可以通过IServiceManager的getService方法获取所需服务的BpBinder对象,并通过interface_cast将其转换为具体的服务接口,完成与服务进程的通信。
1.3 步骤三
在MediaServer的Server端,通信的工作交给BpBinder处理。具体来说,BpBinder通过transact()方法与Binder设备进行通信。transact()方法将请求打包成Parcel数据,并通过IPCThreadState进行处理,完成与Binder设备的交互。
1.3.1 将通信的工作交给 BpBinder
在MediaPlayerService的instantiate()方法中,通过调用defaultServiceManager()获取ServiceManager代理,并调用addService方法将MediaPlayerService注册到ServiceManager中。这个过程将请求数据打包成Parcel,包含接口令、服务名称、服务实例等信息,然后通过BpBinder的transact方法提交到Binder设备。
1.3.2 BpBinder->transact()分析
BpBinder的transact方法通过调用IPCThreadState::self()->transact()完成与Binder设备的通信。IPCThreadState类负责管理进程间的通信,包括线程本地存储空间和Binder设备的交互。
1.3.3 分析 IPCThreadState
IPCThreadState是进程间通信的核心类,负责管理线程本地存储空间和Binder设备的交互。transact方法通过writeTransactionData和waitForResponse完成数据的传输和响应的等待。
二 MediaServer 之 Client端
在Client端,想要使用MediaServer的服务,需要先通过ServiceManager获取相应的服务信息。具体来说,Client进程通过调用getService方法获取BpBinder对象,并通过interface_cast将其转换为具体的MediaPlayerService接口,完成与服务进程的通信。
2.1 查询 ServiceManager
通过调用ServiceManager的getService方法,Client进程可以获取对应的BpBinder对象。这个过程可能需要多次尝试,因为ServiceManager上可能尚未注册对应的服务。在这种情况下,Client进程需要等待直到服务注册完成。
2.2 获取 MediaPlayerService
在IMediaDeathNotifier类中,通过getMediaPlayerService方法获取MediaPlayerService的BpBinder对象。该方法首先获取ServiceManager代理,然后循环调用getService方法直到成功获取到BpBinder对象。成功获取后,将BpBinder对象通过interface_cast转换为MediaPlayerService接口,完成与服务进程的通信。
三 MediaServer 之 ServiceManager 简析
ServiceManager是Android系统中管理系统服务的核心组件。它通过Binder机制实现服务的动态注册、发现和管理。ServiceManager的Server进程向ServiceManager注册服务,Client进程通过ServiceManager获取服务信息并与服务进程建立通信通路。
通过以上分析可以看出,ServiceManager在Android系统中的重要性。它不仅管理着系统中的各种服务,还通过Binder机制实现了进程间的通信与交互,为Android系统的功能扩展提供了强大的支持。
发表评论
最新留言
关于作者
