如何理解 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 机制 [下]