前沿:在了解Binder机制的时候首先不防来了解下什么是Binder机制,用一句话简单描述就是binder机制是android的一种进程间通信机制。

大家都知道Android是继承使用Linux的内核的,而linnux中本身就包含了进程通信机制,那么为什么android会另起炉,所以要了解binder机制就要先知道相比较与Linux的通信机制它有什么优点

Linux中使用的IPC通信机制如下:

传统IPC:无名pipe, signal, trace, 有名管道(最常见)
AT&T Unix 系统V:共享内存,信号灯,消息队列
socket:也是进程间通信机制(我们常常理解成网络通信机制)
不管是管道和消息列队因为采用存储转发方式,所以至少需要拷贝2次数据,效率低;而Unix虽然在传输时没有拷贝数据,但其控制机制复杂(比如跨进程通信时,需获取对方进程的pid,得多种机制协同操作)。而在安全性方面ipc机制只是依赖上层协议来进行安全控制所以安全性低

Binder机制:首先采用的是c/s通信模式效率高(虽然socket也是c/s通信模式,但是它是通用接口所以效率低),而且Binder机制的 所需要的UID/PID是由Binder机制本身在内核空间添加身份标识,安全性高。并且Binder可以建立私有通道,这是linux的通信机制所无法实现的 (Linux访问的接入点是开放的)。

综上所述,Android采用Binder机制是有道理的。既然Binder机制这么多优点,那么我们接下来看看它是怎样通过C/S模型来实现的。

1.怎么通过c/s模式实现:

在android中,有很多Service都是通过binder来通信的,比如MediaServer旗下包含了众多service:
AudioFlinger 音频核心服务
AudioPolicyService:音频策略相关的重要服务
MediaPlayerService:多媒体系统中的重要服务
CameraService:有关摄像/照相的重要服务
在C/S中的模式流程如下
Server注册服务。Server作为众多Service的拥有者,当它想向Client提供服务时,得先去Service Manager(以后缩写成SM)那儿注册自己的服务。Server可以向SM注册一个或多个服务。
Client申请服务。Client作为Service的使用者,当它想使用服务时,得向SM申请自己所需要的服务。Client可以申请一个或多个服务。当Client申请服务成功后,Client就可以使用服务了。
SM一方面管理Server所提供的服务,同时又响应Client的请求并为之分配相应的服务。扮演的角色相当于月老,两边牵线。这种通信方式的好处是: 一方面,service和Client请求便于管理,另一方面在应用程序开发时,只需为Client建立到Server的连接,就可花很少时间和精力去实 现Server相应功能。

2.Binder与这个通信模式有什么关系呢:

Binder通信机制流程(整体框架)
上图即是Binder的通信模型。我们可以发现:
Client和Server是存在于用户空间
Client与Server通信的实现,是由Binder驱动在内核空间实现
SM作为守护进程,处理客户端请求,管理所有服务项。

**说明sevice是如何像sm注册服务的

首先,XXXServer(XXX代表某个)在自己的进程中向Binder驱动申请创建一个XXXService的Binder的实体,
Binder驱动为这个XXXService创建位于内核中的Binder实体节点以及Binder的引用,注意,是将名字和新建的引用打包传递给SM(实体没有传给SM),通知SM注册一个名叫XXX的Service。
SM收到数据包后,从中取出XXXService名字和引用,填入一张查找表中。
此时,如果有Client向SM发送申请服务XXXService的请求,那么SM就可以在查找表中找到该Service的Binder引用,并把Binder引用(XXXBpBinder)返回给Client。

好了,大概Binder的通信流程就介绍完毕了

总结:Binder机制就是sevice在内核中创建binder名字和引用,向sm注册一个服务,然后sm拿到binder的名字和引用填入到一张查找表中,当client向sm申请服务时,sm查找到对应的binder应用并把Binder引用(XXXBpBinder)返回给Client。