ServiceManager,其实也是一个Service,不过它的Server端实现并未使用Binder库的结构实现,而是直接打开binder/dev进行通信的,不具有普遍性。
下面以MediaServer中的MediaPlayService为例,说明更加普遍的使用binder通信机制的Service的实现。
一、Service组件的启动
Service组件是在Server进程中运行的,Server进程通常从其main函数启动,启动时通常做两件事:
1.首先将它里面的Service组件注册到ServiceManager中
2.启动一个Binder线程池来等待和处理Client进程的通信请求。
以MediaServer及其中的MediaPlayService为例,其入口位置为:frameworks\av\media\mediaserver\Main_mediaserver.cpp中。
MeidaPlayService的部分结构图如下:
其完整结构完全按照binder库的结构实现。
其启动过程如下:
上图中talkWithDriver调用中,使用ioctl与binder驱动程序进行交互,会将通信数据封装为一个binder_write_read结构体,使用BINDER_WRITE_READ协议通信。
在Binder驱动程序内部使用binder_ioctl对所要处理的数据进行分发,最终通过binder_thread_read 和 binder_thread_write,将注册请求告诉ServiceManager,并将处理结果再次经过Binder驱动返回MediaServer进程。
二、Service代理对象的获取
Service代理对象的获取过程为一个Client进程与ServiceManager进程标准的Binder通信过程:
示意图如下:
其中getService会调用checkService,IServiceManager的这真正实现类为BpServiceManager,它是ServiceManager的代理对象。Client进程通过它,经由Binder驱动程序与ServiceManager所在的进程取得联系进行通信。