Android系统binder机制的研究分析

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:本部分是该系列的第一章,大概讲了一个架子,里面的具体内容留待以后在讲,谢谢。

       

猜你喜欢

转载自www.cnblogs.com/songyuchen/p/13184227.html