详细说说粘合剂通信原理与机制

  

先上一张粘结剂的工作流程图。(如果不清晰,可以复制图片链接到浏览器或保存到本地查看,我经常都是这样看图的哈)

  
  

<强>更多安卓高级面试合集放在github上面了(更多面试文档,项目下载,源码)
https://github.com/xiangjiana/androids
<强>需要更多项目下载,源码<强>的小伙伴可以点击联系我获取

     

详细说说粘合剂通信原理与机制

  

上面提到一些用户空间,内核空间的概念,用户空间也能大概猜到是什么东西,而内核空间,就知道它是很底层的东西好了。而模块呢,可以简单的理解为实现一个功能的程序或一个硬件电路等,比如玩单片机的时候,会有红外线模块,蓝牙模块,wifi模块等。这些概念的东西搜索一下百科知道就好。

  

<>强粘结剂驱动

  

粘结剂驱动运行在内核空间,它就是那个内核模块了.Binder驱动很重要,承担了进程间通信的数据转发等。一提到驱动,也是比较熟悉,你插个U盘,需要驱动吧。而粘结剂驱动也差不多,虽然名字取得很好,功能还很强大。但也不是什么神奇的东西。

  

<>强粘合剂跨进程通信模型

  

粘合剂的通信模型有4个角色:绑定客户,绑定服务器,粘合剂司机(粘结剂驱动),ServiceManager。

  

想象一个情景:我到北京旅行,要给高中同学寄一张明信片,明信片肯定要写上地址吧,不然怎么寄给对方呢?那么我怎么拿到这个地址呢,很简单,翻一下毕业相册就好了。而这个记录着同学们通信地址的毕业相册,就相当与一个通讯录。在活页夹的通信模型中扮演的是ServiceManager的角色。好,现在已经有了通信地址了,那么就找到邮局寄出去就好了。过几天同学就高高兴兴的收到了明信片。那么这个邮局在活页夹通信模型中扮演的是粘结剂驱动的角色,而作为寄信人的我就是绑定客户,收信人同学就是绑定服务器。

  

先上一张图来描述上面的那个情景:

  

详细说说粘合剂通信原理与机制

  

可以看到ServiceManager,绑定客户,绑定服务器处于不同的进程,他们三个都在用户空间,而粘结剂驱动在内核空间。(我是特意把粘结剂驱动画的比较大的,因为粘结剂驱动的作用最大)

  

<强>那先来简述一下这个通信模型:

  

首先是有一个ServiceManager,刚开始这个通讯录是空白的,然后服务器进程向ServiceManager注册一个映射关系表,比如雷同学把自己的地址湖南省长沙市xx区写进通讯录,那么就形成了一张表:

  
  

雷同学→湖南省长沙市xx区

     

之后端进程想要和服务器进程通信,首先向ServiceManager查询地址,ServiceManager收到查询的请求之后,返回查询结果给客户。

  

注意到这里不管是服务器进程注册,还是客户查询,都是经过粘结剂驱动的,这也真是粘结剂驱动的作用所在,先不急,下面的原理会分析到。

  

这时候我就拿着地址就开始寄明信片咯。当我把明信片放扔进邮筒,之后的工作就是由邮局去完成了,也就是粘结剂驱动去完成通信的转发。

  

<>强粘结剂通信原理

  

从寄明信片的例子中,邮递员从邮筒取出明信片,然后跨越千山万水将明信片送达。从这点我们也能想的到,其实粘结剂驱动完成的工作是很重要的。

  

我们来还原一个活页夹跨进程通信的过程。案例:客户进程调用服务器进程的计算机对象的添加方法。

  

接下来的内容你可能需要知道代理模式才能更好的理解,不过没学习过代理模式也没关系,可以先读下去,然后在去补一下代理模式,再回来看这篇文章。思路会清晰很多。

  
  

1。服务器进程向ServiceManager注册,告诉ServiceManager我是谁,我有什么,我能做什么,就好比徐同学(服务器进程)有一台笔记本(计算机对象),这台笔记本有个添加方法。这时映射关系表就生成了。

  

2。客户进程向ServiceManager查询,我要调用服务器进程的计算机对象的添加方法,可以看到这个过程经过粘结剂驱动,这时候粘结剂驱动就开始发挥他的作用了。当向ServiceManager查询完毕,是返回一个计算机对象给客户进程吗?其实不然,粘结剂驱动将计算机对象转换成了computerProxy对象,并转发给了客户进程,因此,端进程拿到的并不是真实的计算机对象,而是一个代理对象,即computerProxy对象。很容易理解这个computerProxy对象也是有添加方法,(如果连添加方法都没有,岂不是欺骗了客户?),但是这个添加方法只是对参数进行一些包装而已。

详细说说粘合剂通信原理与机制