从概念上理解什么是Binder?

前言

Android有很多跨进程通信方式,比如:Bundle(四大组件)、文件共享、AIDL、Messenger、ContentProvider、Socket,除了文件共享和Socket,其他的方式都是基于Binder,那Binder究竟是什么,本文将从概念上解开疑惑。

一、什么是Binder?

对于Binder通常有以下几种解释:
1.Binder机制是Android系统独有的IPC方式,也是Android系统的核心。
2.Linux内核中的驱动文件(/dev/binder)。
3.在应用层的开发中,它是一个实现了IBinder接口的一个类。
4.从Android Framework的角度来看,它连接了Client、Server、Service Manager和Binder驱动程序。形成一套C/S的通信模式。

二、为什么要使用Binder?

由于C/S的通信模式的广泛使用,会频繁调用IPC,对于手机这样资源和性能有限的移动设备来说,IPC方式面临着很大挑战。Android系统是基于Linux内核开发的,Linux内核本身继承和扩展了一些传统的进程间通信(IPC)机制,例如:管道(Pipe)、信号(Signal)和跟踪(Trace)、报文队列(Message)、共享内存(Share Memory)和信号量(Semaphore)、插口(Socket)。基于传输性能和安全性的要求,传统的IPC方式并不能很好的满足需求,所以Android建立了一套新的IPC方式Binder,它基于C/S的通信模式,在数据传输过程中只需要拷贝一次,性能优秀,既支持实名Binder也支持匿名Binder,安全性高。

三、为什么只需要拷贝一次?

一般的像socket通讯需要两次拷贝,为什么Binder只需要拷贝一次?因为使用了内存映射的方式,简单来说就是使用mmap方法创建一个缓存区,返回值是在内存映射在用户空间的地址,这样分配的内存除了映射进了接收方进程,也映射进了内核空间,所以讲数据拷贝进内核空间也相当于拷贝进了用户空间,这样就实现了一次拷贝。

四、Binder通信模式

其中四个重要的角色:ServerClientServiceManager(下面简称SMgr)以及Binder驱动

从概念上理解什么是Binder?
image.png

如上图所示,Client、Server和ServiceManager位于用户空间,Binder驱动位于内核空间。ServiceManager和Binder驱动由系统层来提供,Client和Server由应用程序来实现。Client、Server和ServiceManager通过系统调用(open、mmap、ioctl)来与内核中的Binder驱动程序进行交互,进而实现不同进程之间的交互。

Binder驱动:

Binder驱动是通信的核心,名叫“驱动”其实不是真正的驱动,只是实现方式和设备驱动程序一样。它工作于内核态,用户空间可通过/dev/binder访问它。Binder驱动负责进程通信的建立、为Binder与数据包在进程之间传递等一系列操作提供底层支持。驱动与应用程序之间定义了一套接口协议,由ioctl()接口来实现。

ServiceManager(简称SMgr):

SMgr的作用就像是DNS(域名服务器),它使Client能够通过字符名字找到对应的实体Binder的引用。Binder分为实名Binder和匿名Binder,在SMgr中注册过的是实名Binder,没有注册过的就是匿名Binder。Binder实体位于Server中,当在SMgr中注册之后,SMgr为穿过进程边界的Binder创建位于内核空间中的实体结点以及对该实体的引用,Binder的命名是字符形式,SMgr维护了实名Binder与binder实体结点的对应关系。
值得注意的是,SMgr作为一个Service端,也有自己的Binder实体,是如何被Client获取的呢?其实在每个Client中SMgr的Binder实体的引用都固定为0,这样Client不需要通过其他方式,也能获得SMgr的Binder实体的引用,从而与SMgr进行通信。

Client:

Client作为服务的请求者,首先它通过0号引用与SMgr建立连接,通过服务的字符名字找SMgr维护的关系表中查询,因为Service都是预先在SMgr进行注册,所以根据服务对应的字符名字能找到对应Service的Binder实体的引用,并返回给Client。这样Client就能跟对应的Server进行通信了。

实名Binder和匿名Binder:

实名Binder是在SMgr中注册过的,而匿名Binder没有在SMgr注册,当Server通过已经建立的Binder连接将自己创建的Binder实体直接返回给Client,Client拿到Binder引用之后就能够与该引用位于Server中的实体进行通信。这样匿名Binder相当于为Client与Server之间建立了一条私密通道,别的进程无法获取到该Binder的引用,能保证安全性。


从概念上理解什么是Binder?
image.png

此图十分准确的反映了Binder是如何将Server、Client、SMgr和Binder驱动连接起来的。

五、总结

对Binder的概念清晰之后,回看文章开头对Binder的几种解释,各个解释看似差异很大,其实很好理解,它们只是从不同角度和Binder在不同场景的表现形式来叙述。