如何理解 Android Binder 递归

Posted

技术标签:

【中文标题】如何理解 Android Binder 递归【英文标题】:How to understand Android Binder recursion 【发布时间】:2016-06-13 07:39:46 【问题描述】:

我阅读了android Developer about IBinder/Binder 上的文档。

上面写着

Binder 系统还支持跨进程递归。为了 例如,如果进程 A 向进程 B 执行事务,并且进程 B 在处理该事务时调用 IBinder 上的 transact() 在A中实现,那么A中当前正在等待的线程 完成原始交易将负责调用 Binder.onTransact() 在 B 调用的对象上。这确保了 调用远程绑定对象时的递归语义相同 就像调用本地对象时一样。

我对此有两个问题

然后线程 A 中当前正在等待原 要完成的事务将负责调用 Binder.onTransact() B调用的对象

首先,如何通知被阻塞的线程去做除了原始程序之外的其他事情?

其次,线程完成onTransact()后,是否会再次阻塞等待原始事务。

【问题讨论】:

【参考方案1】:

首先,如何通知被阻塞的线程去做除了原始程序之外的其他事情?

Binder 是为了抽象出 IPC 的过程,因此这个问题本质上简化为“被调用函数如何在返回之前调用函数”。既然这显然是可能的,而且是明智的,它也应该与 Binder 一起使用。

在实施方面,它将通过解释从绑定事务操作接收到的数据来完成 - 如果这是“为我调用此方法”而不是“您的返回值是”的编码,那么这就是将会发生的事情。

第二,线程执行完onTransact()后,是否会再次阻塞等待原来的事务。

是的,因为从处理 binder 事务的代码中调用的方法最终会返回那里(除非出现异常、进程死亡、信号或类似情况)

【讨论】:

以上是关于如何理解 Android Binder 递归的主要内容,如果未能解决你的问题,请参考以下文章

细读《深入理解 Android 内核设计思想》Binder 机制 [下]

Android 手写Binder 教你理解android中的进程间通信

转:轻松理解 Android Binder,只需要读这一篇

Android-深入理解Binder

腾讯面试官:Binder的系统服务是如何获取的?

腾讯面试官:Binder的系统服务是如何获取的?