这篇文章会先对照Binder机制与Linux的通信机制的区别,了解为什么Android会另起炉灶,採用Binder。接着,会依据Binder的机制,去理解什么是Service Manager,在C/S模型中扮演什么角色。最后,会从一次完整的通信活动中,去理解Binder通信的过程。
尽管Android继承使用Linux的内核,但Linux与Android的通信机制不同。
在Linux中使用的IPC通信机制例如以下:
而在Android中,并没有使用这些,取而代之的是Binder机制。Binder机制是採用OpenBinder演化而来,在Android中使用它的原因例如以下:
综上所述,Android採用Binder机制是有道理的。既然Binder机制这么多长处,那么我们接下来看看它是如何通过C/S模型来实现的。
在android中,有非常多Service都是通过binder来通信的,比方MediaServer旗下包括了众多service:
Binder在C/S中的流程例如以下:
上图即是Binder的通信模型。我们能够发现:
为了方便理解,我们能够把SM理解成DNSserver; 那么Binder Driver 就相当于路由的功能。这里就涉及到Client和Server是怎样通信的问题。以下对1.2中提到的3个流程进行说明。
在进一步了解Binder通信机制之前,我们先弄清几个概念。
假设你足够细心,会发现这里有一个问题:
Sm和Server都是进程,Server向SM注冊Binder须要进程间通信,当前实现的是进程间通信却又用到进程间通信。这就好比鸡生蛋、蛋生鸡,但至少得先有当中之中的一个。
巧妙的Binder解决思路:
针对Binder的通信机制,Server端拥有的是Binder的实体;Client端拥有的是Binder的引用。
假设把SM看作Server端,让它在Binder驱动一执行起来时就有自己的Binder实体(代码中设置ServiceManager的Binder其handle值恒为0)。这个Binder实体没有名字也不须要注冊,全部的client都觉得handle值为0的binder引用是用来与SM通信的(代码中是这么实现的),那么这个问题就攻克了。那么,Client和Server中这么达成协议了(handle值为0的引用是专门与SM通信之用的),还不行,还须要让SM有handle值为0的实体才算大功告成。怎么实现的呢?!当一个进程调用Binder驱动时,使用BINDER_SET_CONTEXT_MGR命令(在驱动的binder_ioctl中)将自己注冊成SM时,Binder驱动会自己主动为它创建Binder实体。这个Binder的引用对全部的Client都为0。
Server向SM注冊了Binder实体及其名字后,Client就能够通过Service的名字在SM的查找表中获得该Binder的引用了(BpBinder)。Client也利用保留的handle值为0的引用向SM请求訪问某个Service:我申请訪问XXXService的引用。SM就会从请求数据包中获得XXXService的名字,在查找表中找到该名字相应的条目,取出Binder的引用打包回复给client。之后,Client就能够利用XXXService的引用使用XXXService的服务了。
假设有很多其它的Client请求该Service,系统中就会有很多其它的Client获得这个引用。
首先要理清一个概念:client拥有自己Binder的实体,以及Server的Binder的引用;Server拥有自己Binder的实体,以及Client的Binder的引用。我们也能够从接收方和发送方的方式来理解:
也就是说,我们在建立了C/S通路后,无需考虑谁是Client谁是Server,仅仅要理清谁是发送方谁是接收方,就能知道Binder的实体和引用在哪边。
建立CS通路后的流程:(当接收方获得Binder的实体,发送方获得Binder的引用后)
之前在介绍Android使用Binder机制的长处中,提到Binder能够建立点对点的私有通道,匿名Binder就是这样的方式。在Binder通信中,并非全部用来通信的Binder实体都须要注冊给SM广而告之的,Server能够通过已建立的实体Binder连接将创建的Binder实体传给Client。而这个Binder没有向SM注冊名字。这样Server与Client的通信就有非常高的隐私性和安全性。
这样,整个Binder的通信流程就介绍完成了,可是对于详细的代码实现(比方binder_transaction_data是什么?binder_write_read.write_buffer又是什么?详细的驱动和逻辑实现又是怎么样?),在后面章节中会一一介绍。
几点疑问:
1. 是谁,怎么样成为SM守护进程,handle为0的binder实体什么时候创建?
2. binder引用和实体是怎样创建的?在驱动中怎样实现的通信?
3. 在SM中,binder实体是如何转换成为引用的?
4. Server是怎样注冊服务,Client是怎样获取服务的?
读完兴许文章就会知道答案了!
Binder机制1---Binder原理介绍,布布扣,bubuko.com
原文:http://www.cnblogs.com/mengfanrong/p/3805337.html