AIDL“单程”远程呼叫的订购保证是什么?

时间:2013-12-13 11:10:53

标签: android aidl android-binder

AIDL方法和接口标有" 单向"关键字是远程进程的异步Binder调用,并且据说不保证调用的顺序。另一方面,Dianne Hackborn(Binder的作者)的最后评论( https://groups.google.com/forum/#!topic/android-developers/FFY-hg2Jx0M)说:

  

"交付的顺序与目标对象相关联(因此您可以接收不同的呼叫)   接口无序)"

这似乎表明,对相同界面的调用会保持其顺序。

任何人都可以澄清这个吗?

3 个答案:

答案 0 :(得分:13)

作为一般规则,单向调用是异步的,可以在不同的线程上同时调度而不进行排序保证。但是,系统对在同一IBinder对象上发生的单向调用强制执行特殊排序保证:在这种情况下,将按原始调用的顺序一次调度一个事务。请注意,此排序适用于在同一IBinder对象上单向调用的特定情况。其他任何事情 - 调用不同的IBinder个对象或单向混合和同步调用 - 都不会给你任何订单保证。

这项工作的方式是在内核中每个IBinder对象都有一个单向事务队列来分派。单向呼叫会添加到该队列(非单向呼叫会绕过队列)。当每个先前的事务完成时,一次一个地从一个队列中调度事务。因此,您可能会看到这些调用在不同的线程上调度,但系统确保一次只执行一个调用。 (同样仅针对单个IBinder对象,单向调用两个不同的IBinder对象可以同时执行。)

答案 1 :(得分:0)

据我记忆,Binder中的所有事务都是同步的,这意味着客户端发起呼叫并等待服务器的回复。但是,在单向通信的情况下,服务器收到这样的呼叫只是返回,因此,这种类型的通信是单向的。

服务中的调用在不同的Binder线程中处理,因此,在同步通信的情况下,您可以确保客户端将在请求后收到回复(因为客户端等待来自服务器的响应)。但是,在单向调用的情况下,可能会出现来自客户端的请求将在不同的Binder线程中处理的情况。这就是为什么,在我看来,写的是订单没有定义。

答案 2 :(得分:0)

默认情况下,AIDL调用是同步的,这意味着客户端将处于等待状态,直到方法返回,但是如果我们使用“oneway”关键字,则方法调用是异步的,即它立即返回,客户端将在稍后接收回调.Hence,the没有为回调定义排序。