binder是安卓系统中非常重要的传输方法,笔者之前所在公司进程间通信采用的都是binder方法,之前笔者只是会用,能看懂,最近趁着手头的事情告一段落,决定对它的机制做了一番研究,以下就是我的分析成果,不对之处,请各位大神多多指教。
一、为什么要用binder
二、binder的原理
三、binder的结构
四、binder传输时序
五、总结
一、为什么要用binder
首先在说binder结构之前,我们要说一下我们为什么要用binder。要回答这个问题,我们先简单说一下binder是什么。所谓binder,就是在Android系统中所创造出来的一种进程间的通信机制。通过这样一种通信机制,我们可以实现进程间通信,那么有人可能要问进程间通信有很多,比如管道,消息队列等等。binder有什么读到之处吗?有的,最大的不同就在于其他的所有消息队列他们都是取了两次数据,即放入了一次,取出了一次,而binder的话只需要传递一次就可以了,这是binder的非常神奇的地方。
二、binder的原理
以32位总线为例,我们的虚拟内存是4G,创建完成之后,有3G是给了用户层,1G给了内核,其中内核是连接各个进程之间的,可以进行通信,所以binder就是利用了这一点。
三、binder的结构
binder的结构主要分成三大部分,分别是客户端(获取数据的部分),ServiceManager(管理部分),服务端(提供数据的部分)。
四、binder的传输时序
binder的总体时序如下:
1、开机时候服务端对ServiceManger端进行注册。
2、调用的时候ServiceManager端会给客户端创建一个代理
3、客户端向代理提出一个获取相应服务的请求,代理通过ServiceManager端将其发送到服务端
4、服务端经过处理后将结果返回给客户端代理
5、客户端处理该请求
所以其时序可以分成两部分,第一部分就是开机时候服务端对ServiceManager端进行注册
第二部分就是客户端向服务端提出请求
第一部分:1、判断当前服务时候注册进入
2、如果有不用注册
3、如果没有创建一个新的服务端,并将其放到链表中
4、通知binder驱动注册成功。
第二部分:这一部分也可以分成两部分,第一部分为创建代理过程,第二部分为客户端发送请求过程
第一:ServiceManager——Processstate——BPbinder
第二:客户端——BPbinder——ProcessState——IPCThread——binder驱动——ServiceManager(函数调用)——getService——transnt——服务端——进入死循环——ontransnt函数
五、总结
binder主要利用了内核层的传输通道,其中间有ServiceManager进行管理,但是该服务却又不介入客户端和服务器中间,客户端直接向服务器申请数据,这就是binder驱动的奥妙所在。
PS:本部分是该系列的第一章,大概讲了一个架子,里面的具体内容留待以后在讲,谢谢。