Android进程间通信:Binder机制

写在最前端

在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驱动进行数据的传输。所以进程之间要进行通信,必须通过如下图所示的模拟途径:

Android进程间通信:Binder机制_第1张图片
image

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进程的桥梁,类似于网线

上述步骤的模拟图如下:

Android进程间通信:Binder机制_第2张图片
image

进程通信的整体使用步骤说明:

  • (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模型中数据传递的详细介绍

Android进程间通信:Binder机制_第3张图片
image

如上图所示,详细介绍了当Client进程与Server进程之间建立好连接后,通过Binder驱动为媒介进行数据传输的详细过程。整体分为三个步骤:

  • (1)Client进程发送数据:①②③④⑤
  • (2)执行对应的服务功能:
  • (3)Server进程返回执行的结果:⑦⑧⑨⑩

因为上图已经将步骤的具体操作说明写上了,标注的都非常详细,此处就不再展开详细复述。

4 Android开发者在开发中需要实现的点

上面已将全面的介绍了Android进程间通信的Binder机制:Client-Server模型。模型设计中的好多思想是值得我们学习和深思的,但是Binder机制涉及的知识这么多,好多人似乎都被它吓到了。其实不然,既然作为Android中进程间通信的方式,这些其实都是Android为我们实现好的,在开发中我们只需要知道如何使用就行了。下面我们就了解一下哪些是Android已经帮我们实现好的,哪些是需要我们开发者实现的。

其实在Android系统中,Binder驱动和ServerManager进程都是Android已经帮我们实现好了的,Client进程和Server进程是我们需要自己实现的。这也好理解,就在赘述了。如下图所示:

Android进程间通信:Binder机制_第4张图片
image

综上:

  • 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源码来详细品味。编写仓促,有问题点欢迎指正。

-----------------分----------------割---------------线-------------------

你可能感兴趣的:(Android进程间通信:Binder机制)