写在最前端
在Android系统中,每一个app都是运行在一个独立的进程中的,不同进程之间是相互隔离、相互独立的,Android系统如此设计的目的是保障app的安全性和独立性。试想如果你开发的app程序在运行的过程中,可以被其他任意app调用和访问,这是多么可怕的事情。但是时代发展的规律告诉我们,有交流才会有进步,相互合作才会共赢。Android也顺应这种时代发展规律,所以为用户提供了一套进程间通信的机制(IPC)——Binder机制。
Binder机制本身比较强大,其中的Binder驱动等都是在Linux内核中,如果通过分析源码的方式,很多不熟悉C/C++的人可能会感到非常困难,本次只宏观分析,宗旨是让大家对Binder机制有一个宏观上的理解,重点是理解和吸收这种设计的思想。
注意:本文中没有结合源码进行分析,有需要看源码的请绕过~~
转发请标明出处:https://blog.csdn.net/Dream_201603/article/details/85260739
Binder通信机制原理
1 进程通信途径
首先要知道,进程空间分两部分,一部分运行在Linux的内核空间,另一部分运行在用户空间。Android系统中所有进程共用一个内核空间,不同进程的内核空间可以共享数据,但是不同进程的用户空间不可以共享数据。进程内,用户空间可以通过“系统调用”来访问内核空间。内核空间内,可以通过Binde驱动进行数据的传输。所以进程之间要进行通信,必须通过如下图所示的模拟途径:
2 Binder通信机制(Client-Server模型)
现在对跨进程间通信的路径有了一个宏观上的认知,下面将介绍Binder通信机制中的Client-Server模型。当前模拟一下两个进程之间的通信:假设其中一个进程提供一种加密数据的服务,另一个进程想要通过该服务将自己的数据进行加密。现在我们称提供加密服务的进程为Server进程(服务端),要使用服务的进程称为Client进程(客户端)。
- Server进程:提供服务的进程,类似于服务器
- Client进程:要使用服务的进程,类似于客户端
在Android中,进程在用户空间是不能进行消息传输的,在内核空间中是通过Binder驱动进行传递消息的,任意一个进程都可以提供服务的,提供服务的进程只需要将自己的信息告知Binder驱动,Binder驱动就会将提供服务的进程信息保存在ServerManager进程中,ServerManager进程是用来管理Server进程的注册与查询的。当有Client进程要使用这个Server进程的服务时,Client进程首先向Binder驱动提出要使用这个Server进程,Binder驱动会通过ServerManager进程获取该Server进程的信息并返回该Clinet进程,Client进程通过这些信息与Server进程进行连接,之后通过Binder驱动就可以进行消息的传输了。
- ServerManager进程:用来管理Server进程的注册与查询,类似于路由器
- Binder驱动:连接Server进程、Client进程和ServerManager进程的桥梁,类似于网线
上述步骤的模拟图如下:
进程通信的整体使用步骤说明:
- (1)注册服务
- ①Server进程向Binder驱动发起注册服务的请求。
- ②Binder驱动将注册请求传递给ServerManager进程。
- ServerManager进程记录该服务的信息。
至此,服务注册成功。
- (2) 建立连接
- ③Client进程向Binder驱动发起获取指定服务的请求,并携带要获取的服务名称
- ④Binder驱动将请求传递给ServerManager进程
- ServerManager进程根据服务名称查找Client进程需要的Server进程对应的信息
- ⑤ServerManager进程将对应的信息传发送给Binder驱动
- ⑥Binder驱动将对应的信息传递给Clinet进程
至此,Client进程与Server进程之间建立连接。
- (3) 使用服务
- ⑦Client进程发送要处理的数据
- Binder驱动将Client进程发送的数据传递给Server进程
- ⑧Server进程获取到Client进程发送过来的数据
至此,数据传输完成。
3 Client-Server模型中数据传递的详细介绍
如上图所示,详细介绍了当Client进程与Server进程之间建立好连接后,通过Binder驱动为媒介进行数据传输的详细过程。整体分为三个步骤:
- (1)Client进程发送数据:①②③④⑤
- (2)执行对应的服务功能:⑥
- (3)Server进程返回执行的结果:⑦⑧⑨⑩
因为上图已经将步骤的具体操作说明写上了,标注的都非常详细,此处就不再展开详细复述。
4 Android开发者在开发中需要实现的点
上面已将全面的介绍了Android进程间通信的Binder机制:Client-Server模型。模型设计中的好多思想是值得我们学习和深思的,但是Binder机制涉及的知识这么多,好多人似乎都被它吓到了。其实不然,既然作为Android中进程间通信的方式,这些其实都是Android为我们实现好的,在开发中我们只需要知道如何使用就行了。下面我们就了解一下哪些是Android已经帮我们实现好的,哪些是需要我们开发者实现的。
其实在Android系统中,Binder驱动和ServerManager进程都是Android已经帮我们实现好了的,Client进程和Server进程是我们需要自己实现的。这也好理解,就在赘述了。如下图所示:
综上:
- Binder驱动和ServerManager进程是Android系统已经实现好的
- Client进程和Server进程是需要开发者自己实现的
5 补充说明的点:Binder请求的线程管理
以上就将Binder机制基本介绍完全,有些细节上的点需要补充一下,主要补充的是Binder请求时的线程管理。为什么要引入线程管理,其实很好理解,因为Server进程是给Client进程提供服务的,也就是说Server进程只提供服务,而Client进程只是使用。那就会出现多个Client进程使用同一个Server进程,为了并发操作,所以Server进程会创建额很多线程来处理Binder请求。多线程操作自然就引出了线程池的概念,而在Binder机制中,管理Binder模型的线程是采用的Binder驱动的线程池,并由Binder驱动管理该线程池。一个进程的Binder线程数默认最大是16,超过之后不会再创建新的线程,而是会阻塞等待空闲的Binder线程。
总结
Android中通过Binder机制进行进程间通信是非常普遍的,常用的有:内容提供者、AIDL等。到此,基本将Android进程间通信的Binder机制讲述完成,有想更深入了解的可以通过Android源码来详细品味。编写仓促,有问题点欢迎指正。
-----------------分----------------割---------------线-------------------