android binder 进程间通信机制5-Service注册和代理对象的获取

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所在的进程取得联系进行通信。

 

你可能感兴趣的:(android)