💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
**在Code 的世界里,两个对象能直接相互访问的前提是这两个对象都存在于相同的内存地址空间中**,如果**两个对象分别存在于两个不同的进程中**,比如上面我们说到的ActivityManager 和ActivityManagerService,那么**这两个对象是不能直接相互调用的,这时我们就需要使用到一种跨进程通信技术,使存在于两个不同进程的对象能够互访**。 **传统的跨进程通信方式**有很多,**比如Socket 、信号量、管道、内存共享、消息队列等**,这些传统的跨进程通信方式在Linux 中都存在,**大家知道Android 是基于Linux的,按理来说其使用现成的跨进程通信方式是理所应当,那么为什么还要大费周张地自己设计一个新的通信机制呢**?这只能**说明Binder 具有其他通信方式无可比拟的优势,传统的跨进程通信机制,比如Socket,开销大且效率不高,而管道和l 队列拷贝次数多,更重要的是,对于移动设备来说,安全性相当重要,而传统的通信机制安全性低,大部分情况下接收方无法得到发送方进程的可信PID/UID ,难以对其身份现别。而Binder 在设计的时候就考虑到了以上各种缺点,在确保传输性能的同时又提高了安全性。** **Binder 所涉及的4 个主要模块** * Binder Client * Binder Server * ServerManager * Binder Driver 这4 者之间的关系类似于网络访问 * Binder Client 相当于我们的客户端PC * Binder Server 相当于服务器 * ServerManager相当于DNS 服务器 * Binder Driver 则相当于一个路由器 它们的关系如图18-3 所示。 ![](https://box.kancloud.cn/359847af18988a2fc77db29cd89bbb49_703x247.png) 其中**Binder Driver实现在内核空间**中,而**其余的3 者Binder Client 、Binder Server、ServerManager实现在用户空间中**。 **Binder Driver 位于内核空间中**, 其以字符设备中的misc 类型注册,用户可以从`/dev/binder `设备文件节点上,通过open 和ioctl 文件操作函数与Binder Driver 进行通信,其**主要负责Binder 通信的建立,以及其在进程间的传递和Binder 引用计数管理/数据包的传输等**。而Binder Client 与BinderServer 之间的跨进程通信则统一通过Binder Driver 处理转发,对于Binder Client 来说, 其只需要知道自己要使用的Binder 的名字以及该Binder 实体在ServerManager 中的0 号引用即可,访问的原理也比较简单, Binder Client 先是通过0 号引用去访问SeiverManager 获取该Binder 的引用,得到引用后就可以像普通方法调用那样调用Binder 实体的方法。最后我们的ServerManager 则用来管理Binder Server, Binder Client 可以通过它来查询Binder Server 接口,刚才我们说到Binder Client 可以通过ServerManager 来获取Binder 的引用,这个Binder 的引用就是由ServerManager 来转换的,这里与其说转换不如说映射更直接, Binder Server 在生成一个Binder 实体的同时会为其绑定一个名字并将这个名字封装成一个数据包传递给Binder Driver, Binder Driver 接收到这个数据包后,如果发现这个Binder 是新传递来的,那么就会为其在内核空间中创建相应的Binder 实体节点和一个对该实体节点的引用,这个实体节点在相应的源码中叫做Binder node 而其引用则叫做Binder ref,创建完毕后, Binder Driver 就会将该引用传递给ServerManager, ServerManager 收到后就会从中取出该Binder 的名字和引用插入一张数据表中,这跟DNS 中存储的域名到E 地址的映射原理类似,而对于网络访问来说,而DNS 服务器也并不一定对每一个IP 地址都有域名映射的记录,我们常常也会碰到直接通过田地址访问服务器的情况,而Binder 也一样并非一定要在ServerManager 中有记录,很多时候Binder Server 会将一个Binder 实体封装进数据包传递给Binder Client ,而此时BinderServer 会在该数据包中标注Binder 实体的位置, Binder Driver 则会为该匿名的Binder 生成实体节点和实体引用,并将该引用传递给Binder Client,那么有人可能会有疑问,既然ServerManager 的作用类似于DNS 服务器,那么其本质是不是应该是一个Binder Server 才对呢?答案是肯定的,ServerManager 就是一个标准的Binder Server,并且在Android 中约定其在Binder 通信的过程中唯一标识(类似于四地址)永远是0。