Android面试系列文章2018之Android部分Binder机制篇

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/ClAndEllen/article/details/79343389

Android面试系列文章2018之Android部分Binder机制篇

  对于要求经验较少的面试,面试的时候Binder机制不会被面试官提到的,但是如果你面试的是长达几年经验的面试,那么Binder机制,你应该要好好理一理,进程间通信是非常重要的,很多公司要求我们不仅仅会使用,而且还要求弄清它的原理,刚接触Binder你肯定会搞的一头雾水,因为它有点太复杂了,但是弄清楚它,那么你就很厉害了,因为Android里面它可以称得上最复杂的知识体系之一,如果你对自己有高的要求,那么你一定要弄懂它。

Binder知识体系图

1.Binder是什么?

  Binder是一种进程间通信(IPC)的一种机制,英文翻译成中文就是“粘合剂”的意思,从Linux系统角度分析,Binder是一个驱动,我们调用它都是通过系统来调用。
  因为Binder机制涉及的东西既多且杂,根据项目实践中的经验,很多新手往往学习到中途就迷失了方向。为了避免类似情况的发生,我们有必要先讲述下即将登场的几个主角的概念与功能。希望读者可以先了解“它是什么、有哪些组成元素”,进而上升到“为什么会有这些组成、内部原理是什么”。
  如果统观Binder中的各个组成元素,就会惊奇地发现它和TCP/IP网络有很多相似之处。

  • Binder驱动→路由器
  • Service Manager→DNS
  • Binder Client→客户端
  • Binder Server→服务器

  TCP/IP中一个典型的服务连接过程(比如客户端通过浏览器访问Google主页)如下图所示。

一个典型的TCP/IP访问过程

  在这个简化的流程图中共出现了4种角色,即Client,Server,DNS和Router。它们的目标就是让Client和Server建立连接,主要分为如下几个步骤。

  • 1.Client向DNS查询Google.com的IP地址,显然,Client一定得先知道DNS的IP地址,才有可能向它发起查询。DNS的IP设置是在客户端接入网络前就完成了的,否则Client将无法正常访问域名服务器。当然,如果Client已经知晓了Server的IP,那么完全可以跨越这一步而直接与Server连接。比如Windows操作系统就提供了一个hosts文件,用于查询常用网址域名与IP地址的对应关系。当用户需要访问某个网址时,系统会先从这个文件中判断是否已经存在有这个域名的对应IP。如果有就不需要大费周折地向DNS查询了,从而加快访问速度。
  • 2.DNS将查询结果返回Client,因而Client的IP地址对于DNS也必须是可知的,这些信息都会被封装在TCP/IP包中。
  • 3.Client发起连接。
  • 4.Client在得到Google.com的IP地址后,就可以据此来向Google.com服务器发起连接了。

  在这一系列流程中,我们并没有特别提及Router的作用。因为它所担负的责任就是将数据包投递到用户设定的目标IP中,即Router是整个通信结构中的基础。
  从这个典型的TCP/IP参考模型中,我们还能得到什么提示呢?
  首先,在TCP/IP参考模型中,对于IP层及以上的用户来说,IP地址是他们彼此之间沟通的凭证——任何用户在整个互联网中的IP标识符都是唯一的。
  其次,Router是构建一个通信网络的基础,它可以根据用户填写的目标IP地址正确地把数据包发送到位。
  最后,DNS角色并不是必须的,它的出现是为了帮助人们使复杂难记的IP地址与可读性更强的域名建立关联,并提供查询功能。而客户端能使用DNS的前提是它已经正确配置了DNS服务器的IP地址。
  清楚了网络通信中各个功能模块所扮演的角色,接下来把它与Binder做一个对比。Binder的原型图如下所示:

Binder原型图

  Binder的本质目标用一句话来描述,就是进程1(客户端)希望与进程2(服务器)进行互访。但因为它们之间是跨进程(跨网络)的,所以必须借助于Binder驱动(路由器)来把请求正确投递到对方所在的进程(网络)中。而参与通信的进程们需要持有Binder“颁发”的唯一标志(IP地址)。如下图所示。

Binder驱动是进程间“路由”的关键

  和TCP/IP网络类似,Binder中的“DNS”也并不是必需的——前提是客户端能记住它要访问的进程的Binder的标志(IP地址);而且要特别注意这个标志是“动态IP”,这就意味着即使客户端记住了本次通信过程中目标进程的唯一标志,下一次访问仍然需要重新获取,这无疑加大了客户端的难度。“DNS”的出现可以完美解决这个问题,用于管理Binder标志与可读性更强的“域名”间的对应关系,并向用户提供查询功能。

  那么Binder机制中,DNS的角色又由谁来诠释呢?
  没错,就是Service Manager,如下图所示:

Service Manager 所扮演的角色

  你可能会问,既然Service Manager是DNS,那么它的“IP地址”是什么呢?Binder机制对此做了特别的规定,Service Manager在Binder通信过程中的唯一标志永远是0。

2.智能指针

https://www.cnblogs.com/zhaoshuai1215/archive/2013/11/20/3432963.html

3.进程间数据传递的载体Parcel

https://blog.csdn.net/zhoupenglei/article/details/46323391

4.Binder驱动与协议

https://blog.csdn.net/qiyei2009/article/details/78996106

5.“DNS”服务器ServiceManager(Binder Server)

https://blog.csdn.net/wlwl0071986/article/details/50977573

6.Binder客户端

https://www.cnblogs.com/itgungnir/p/6640120.html

7.Android接口描述语言AIDL

7.1 如何创建AIDL

https://blog.csdn.net/u011240877/article/details/72765136

8.匿名Binder Server

https://blog.csdn.net/lewif/article/details/50696510

此篇文章仅仅是高级Android或者资深Android程序员研究的,在此小弟推荐研读《深入理解Android内核设计思想》林学森 上 第6章《进程间通信——Binder》,此篇文章内容全来自于此书内容。

没有更多推荐了,返回首页