Android进程间通信方式

519 阅读5分钟

1、什么是IPC

IPC是Inter-Process-Communication的缩写,意思是进程间通信或者跨进程通信; 说起进程间通信,我们应该首先来了解一下什么是进程。按照操作系统的描述,线程是CPU调度的最小单元,而进程一般指一个执行单元,在移动设备上指一个程序或应用;一个进程可以包含多个线程;

IPC的使用场景:

由于某些原因,应用自身需要采用多进程模式来实现。可能原因有:           某些模块因特殊原因要运行在单独进程中;           为加大一个应用可使用的内存,需通过多进程来获取多份内存空间。

当前应用需要向其它应用获取数据

Android的进程架构:

每一个Android进程都是独立的,且都由两部分组成,一部分是用户空间,另一部分是内核空间,如下图

image.png

为什么要用到多进程?

在Android系统中一个应用默认只有一个进程,每个进程都有自己独立的资源和内存空间,其它进程不能任意访问当前进程的内存和资源,系统给每个进程分配的内存会有限制。如果一个进程占用内存超过了这个内存限制,就会报OOM的问题,很多涉及到大图片的频繁操作或者需要读取一大段数据在内存中使用时,很容易报OOM的问题,为了彻底地解决应用内存的问题,Android引入了多进程的概念,它允许在同一个应用内,为了分担主进程的压力,将占用内存的某些页面单独开一个进程,比如Flash、视频播放页面,频繁绘制的页面等。Android多进程使用很简单,只需要在AndroidManifest.xml的声明四大组件的标签中增加”android:process”属性即可,process分私有进程和全局进程,以“:”号开头的属于私有进程,其他应用组件不可以和他跑在同一个进程中;不以“:”号开头的属于全局进程,其他应用可以通过ShareUID的方式和他跑在同一个进程中;

但是多进程模式出现以下问题: 1、静态成员和单例模式完全失效 2、线程同步机制完全失效 3、SharedPreferences的可靠性下降 4、Application多次创建

因此为了避免这些问题Android中有多种IPC机制,如AIDL,Messenger,Socket,ContentProvider,但是这些机制底层全部都是用了Binder机制来实现的,什么是Binder?要了解Android系统中的IPC我们首先要了解的就是Binder;

二、Binder机制原理

1、Binder机制

Binder是Android系统中的一种IPC进程间通信结构。 Binder的整个设计是C/S结构,客户端进程通过获取服务端进程的代理,并通过向这个代理接口方法中读写数据来完成进程间的数据通信。 Android之所以选择Binder,有2个方面的原因。 1是安全,每个进程都会被Android系统分配UID和PID,不像传统的在数据里加入UID,这就让那些恶意进程无法直接和其他进程通信,进程间通信的安全性得到提升。 2是高效,像Socket之类的IPC每次数据拷贝都需要2次,而Binder只要1次,在手机这种资源紧张的情况下很重要。

Binder机制原理图:

image.png

1.客户端获取服务端的代理对象(proxy)。我们需要明确的是客户端进程并不能直接操作服务端中的方法,如果要操作服务端中的方法,那么有一个可行的解决方法就是在客户端建立一个服务端进程的代理对象,这个代理对象具备和服务端进程一样的功能,要访问服务端进程中的某个方法,只需要访问代理对象中对应的方法即可; 2.客户端通过调用代理对象向服务端发送请求。 3.代理对象将用户请求通过Binder驱动发送到服务器进程; 4.服务端进程处理客户端发过来的请求,处理完之后通过Binder驱动返回处理结果给客户端的服务端代理对象; 5.代理对象将请求结果进一步返回给客户端进程。 通过以上5个步骤,就完成了一次Binder通信。

2、Binder机制的组成

Binder机制由三部分组成,即: 1.Client; 2.Server; 3.ServiceManager。

三部分组件之间的关系: 1.Client、Server、ServiceManager均在用户空间中实现,而Binder驱动程序则是在内核空间中实现的; 2.在Binder通信中,Server进程先注册一些Service到ServiceManager中,ServiceManager负责管理这些Service并向Client提供相关的接口; 3.Client进程要和某一个具体的Service通信,必须先从ServiceManager中获取该Service的相关信息,Client根据得到的Service信息与Service所在的Server进程建立通信,之后Clent就可以与Service进行交互了; 4.Binder驱动程序提供设备文件/dev/binder与用户空间进行交互,Client、Server和ServiceManager通过open和ioctl文件操作函数与Binder驱动程序进行通信; 5.Client、Server、ServiceManager三者之间的交互都是基于Binder通信的,所以通过任意两者这件的关系,都可以解释Binder的机制。

image.png

参考:

  1. # Android IPC机制详解(一)

  2. # 面试题:IPC(跨进程通信)

  3. # Android里的多进程和跨进程通讯方式

  4. # Android 多进程通信