在上一篇文章《Binder客户端和驱动端通信流程实例分析----以acquireWakeLock()函数为例(一)》中,我们介绍了亮屏锁WakeLock类的acquire()函数如何将Binder请求从app上层一步步向下传递到frameworknative层的IPCThreadState类的transact()函数。
IPCThreadState类的transact()函数主要做的事情如下:
1. 调用IPCThreadState::writeTransactionData()函数把包含Binder请求信息的parcel内容拆解重组到一个binder_transaction_data结构体的变量中,再把命令码cmd和binder_transaction_data写入到mOut变量,mOut变量在后续的处理中将被包含在一个binder_write_read结构体变量中,通过ioctl()传给Binder驱动;
2. 调用IPCThreadState::waitForResponse()进入一个与Binder驱动进行沟通的while循环,该循环主要代码如下(因篇幅所限,进行了缩略):
while (1) {
if ((err=talkWithDriver()) < NO_ERROR) break;
err = mIn.errorCheck();
if (err < NO_ERROR) break;
if (mIn.dataAvail() == 0) continue;
cmd = (uint32_t)mIn.readInt32();
switch (cmd) {
case BR_TRANSACTION_COMPLETE:
if (!reply && !acquireResult) goto finish;
break;
case BR_DEAD_REPLY:
err = DEAD_OBJEC

本文深入剖析Android Binder通信机制,以acquireWakeLock()为例,详细阐述从应用层到驱动层的交互过程,包括IPCThreadState的transact()、talkWithDriver()函数,以及在Linux内核中的ioctl()调用路径,最终解释Binder驱动如何处理事务。
1906

被折叠的 条评论
为什么被折叠?



