【Android】Binder机制 以及 为什么要使用Binder机制

之前在阿里二面的时候被问到了这个问题,面试官让我讲讲Handler机制,我之前虽然了解过但是没有深入研究过,稀里糊涂说了一堆我自己都听不懂的话,面试官也很无奈,说你说的我也没大听清(估计是我说的太乱了,面试官委婉的表示我的回答并不好),然后问我知道为什么要用Binder知道吗,我想了会也没想出一个好的理由,遂放弃,面完后查阅资料深入了解了一下Binder机制,以下是我的个人总结:

一句话总结:

ServerManager的作用是将字符形式的Binder名字转化成Client中对该Binder的引用,使得Client能够通过Binder名字获得对Server中Binder实体的引用。

为什么要用Binder

先说说为什么用Binder吧,因为Android是基于linux底层实现的,而linux已经有了几个进程间通讯的方式,比如管道、消息队列,共享内存,但是管道和消息队列的实现方式大概是,一个提供服务的进程也就是发送方,将提供的数据从发送方的缓存区拷贝到内核的缓存区,然后接收方再开辟一块缓存区,从内核缓存区将数据拷贝的自己的缓存区,期间需要进行两次拷贝,而且拷贝过程中,接收方不知道需要开辟一块多大的缓存区才能放得下发送方发送的数据,所以只能开辟一块尽可能大的缓存区,这样会造成空间的浪费,或者先通过进程通信了解到需要开辟多大的缓存区,再来开辟缓存区,这样虽然不会造成空间上的浪费但是会造成时间上的浪费,而共享内存不用进行数据的拷贝,但是对于数据的访问难以控制,安全性不好,所以Android提供了一个Binder机制,用于进程间的通信。

Binder机制及原理

Binder基于Client和Server通信模式,提供数据或者是服务的发送方相当于Server,需要请求服务的相当于Client,整个Binder机制有四个重要的部分,分别是Client,Server,ServerManager和Binder,首先Server创建一个Binder的实体,为这个Binder起一个名字,然后将这个Binder和名字一块发送给ServerManager,让ServerManagerqu去注册这个Binder,ServerManager收到以后去内核区创建一个Binder的实体,同时自己持有这个Binder的引用。
这里还有一点是server和serverManager是处于不同的进程的,server通知serverManager注册Binder的时候,也用到了Binder来实现进程间的通讯,就好像我要一只鸡,但是前提需要有个鸡蛋,而鸡蛋必须鸡才能下下来, Android采取的方式是先创造一只鸡来下蛋,serverManager在注册的时候会自动创建一个Binder实体,编号为0,这是内核里创建出来的第一个Binder实体,刚才提到的,提供数据或服务的server,相对于serverManager来说就是一个Client,server通过那个编号0获取第一个Binder的引用,借此来完成与serverManager的通信。
Server中的Binder实体在serverManager里注册完后,Client通过那个编号为0的Binder与serverManager通信,告诉serverManager他想要请求哪个server,然后告诉serverManager它所要请求的server所持有的Binder的名字,serverManager收到Client的请求信息后,通过Client发送的Binder名字,在已经注册的索引表中找到对应的Binder,将这个Binder的引用发回给Client,Client就可以通过这个Binder的引用,来获取Server中的数据或者使用Server中的服务了。

实名Binder与匿名Binder

上面所说的是实名Binder,因为一个Server的Binder在serverManager里注册以后,任何一个Client都可以获取到这个Binder的名字,进而获取Server中的数据或者使用Server中的服务,还有一种方式是匿名Binder,匿名Binder是建立在实名Binder基础上的,当一个Client通过实名Binder获取到Binder的引用后,他就可以和持有这个实名Binder实体的Server进行通信了,就相当于Client和Server建立了连接,–然后Server可以将它内部的另一个匿名Binder实体的引用,通过这个连接发送给Client,Client通过这个Binder与Server建立了第二条连接,这个连接是私密的,是一对一的,实名Binder是多对一的,匿名的意思是说这个Binder是没有在ServerManager里注册的,这个匿名Binder并没有名字,只要Server没有主动将这个Binder的引用发送给其他Client,其他的Client就不能获取这个Binder的引用,也就不能通过这个私密的Binder与Server建立私密连接,而只能通过已经在ServerManager里注册的Binder来建立连接。

Binder优点

Binder的优点在于数据传输速率比较快,相比于传统的IPC管道通信,Binder只需要进行一次数据的拷贝,而且每一个进程都有对应的ID,安全性也比较高。
关于Binder为什么只需要进行一次数据的拷贝,因为Binder是server创建的,而serverManager又在内核区创建了了Binder的实体,当server需要发送数据给client的时候,他知道server要发送的数据的大小,然后通知client开辟出一块这么大的内存,然后数据直接从server拷贝到了client开辟出的内存区,这样client就可以访问这些数据了。

大概就这些了,以上是我根据大佬的博客总结出来的,我将Binder总结成比较容易讲述的语言以便我面试的时候和面试官交流,想深入了解Binder原理请查看此篇博客:

作者:universus 来源:CSDN 原文:https://blog.csdn.net/universus/article/details/6211589
感谢大佬

点赞