这一点可能比较难以理解,里仁教育讲师稍候就会为你们分析,这里就先记住Binder不只能够与本地进程通讯,还能够与远程进程通讯;这里的本地进程就是咱们所说的本地对象,而远程进程则是咱们所说的远程服务的一个“引用” 。php
Binder的实质就是要把对象从一个进程映射到另外一个进程中,而无论这个对象是本地的仍是远程的。若是是本地对象,更好理解;若是是远程对象,就按照咱们上面所讲的来理解,即将远程对象的“引用”从一个进程映射到另外一个进程中,因而当使用这个远程对象时,实际上就是使用远程对象在本地的一个“引用”,相似于把这个远程对象看成一个本地对象在使用。这也就是Binder与其余IPC机制不一样的地方。spa
这个本地“对象”与远程对象的“引用”有什么不一样呢?本地“对象”表示本地进程的地址空间的一个地址,而远程对象的“引用”则是一个抽象的32位句柄。它们之间是互斥的:全部的进程本地对象都是本地进程的一个地址(address、ptr、binder),全部的远程进程的对象的“引用”都是一个句柄。对于发送者进程来讲,无论是“对象”仍是“引用”,它都会认为被发送的Binder对象是一个远程对象的句柄(即远程对象的“引用”)。对象
可是,当Binder对象的数据被发送到远端接收进程时,远端接收进程则会认为该Binder对象是一个本地对象地址(即本地对象)。正如咱们以前说的,当Binder对象被接收进程接收后,无论该Binder对象是本地的仍是远程的,它都会被看成一个本地进程来处理。所以,从第三方的角度来讲,尽管名称不一样,对于一次完整的Binder调用,都将指向同一个对象,Binder驱动则负责两种不一样名称的对象的正确映射,这样才能把数据发送给正确的进程进行通讯。这个映射关系也是进程间引用对象的基础,对一个对象的引用,在远程是句柄,在本地则是地址(即本地对象的地址)。进程