Binder机制(2)

来源:互联网 发布:手机版数据库软件 编辑:程序博客网 时间:2024/06/03 17:37

注册MediaPlayerService

下面分析MediaPlayerService,代码如下:


根据前面的分析可知,defaultServiceManager()实际返回的对象是BpServiceManager,它是IServiceManager的后代,代码如下所示:



这里addService函数中把请求数据打包为data后,传给了BpBinder的transact函数,就把通信的工作叫给了BpBinder了。


之前在BpBinder中找不到任何与Binder设备交互的地方,秘密在这个transact函数中,它的实现如下:


这里遇见了IPCThreadState,它和Binder的通信有关,对其进行深入分析:

IPCThreadState的实现代码在IPCThreadState.cpp中,如下所示:



接下来,转向分析它的构造函数IPCThreadState(),如下所示:


每个线程都有一个IPCThreadState,每个IPCThreadState中都有一个mIn,一个mOut

其中,mIn是用来接收来自Binder设备的数据的,mOut则是用来存储发往Binder设备的数据的。


传输工作是很辛苦的,我们刚才看到BpBinder的transact调用了IPCThreadState的transact函数,这个函数实际完成了与Binder通信的工作,代码如下所示:


多熟悉的流程: 先发数据,然后等结果。

不过我们有必要确认一下handle这个参数有什么作用。先看writeTransactionData函数,实现如下:



现在已经把addService的请求信息写道了mOut中了,接下来再看看发送请求和接收回复部分的实现,代码在waitForReponse函数中。如下所示:


OK,我们已经发送了请求数据,假设马上就收到了回复,后续该怎么处理?看看executeCommand函数,如下所示:





下面看下如何和binder设备交互。talkwithDriver函数:




0 0