IPCThreadState

IPCThreadState
在Android中,每个参与Binder通信的线程都会有一个IPCThreadState实例与之关联。我最开始接触到这个类是在BpBinder::transact方法中。

transact

IPCThreadState_第1张图片
其就是调用的IPCThreadState::transact来完成的数据传输工作,其工作可以分为两步:

 

发送数据

实际上,writeTransactionData只是将数据转换成binder_transaction_data结构并重新写入到IPCThreadState::mOut中。

并没有真正的将数据发送出去。实际的发送操作是在waitForResponse中完成的。

接收数据

TF_ONE_WAY表示的是单向通信,不需要对端回复。所以这里接收数据就多了几个判断分支。区别就是参数不一样。该函数必定需要被执行的,因为数据要发出去啊。。。

IPCThreadState_第2张图片

writeTransactionData

IPCThreadState_第3张图片


我们创建一个Service,通过addService注册到ServiceManager时,就涉及到了传输一个IBinder对象的问题。libbinder将IBinder对象转换成一个flat_binder_object结构,虽然将该结构写入到Parcel中,最终在转换成binder_transaction_data。

waitForResponse
waitForResponse实际上又是通过调用IPCThreadState::talkWithDriver方法来完成数据接发工作。随后再处理我们接收到的数据。

IPCThreadState_第4张图片

 

我们需要处理如下这些cmd:

IPCThreadState_第5张图片

 

处理CMD的函数就是waitForResponse和executeCommand。这里就不贴代码了。

talkWithDriver
很容易理解,我们前面通过writeTransactionData,已经把数据写入到了binder_transaction_data中。talkWithDriver就是调用ioctl(BINDER_WRITE_READ)完成真正的数据接发。

其他
IPCThreadState_第6张图片

 

你可能感兴趣的:(相机开发,驱动与内核,android)