IPC 跨进程通信

Inter-Process Communication · Android 多进程开发详解

进程间通信 内存隔离 Binder机制 通信方式

目录导航(点击跳转)

一、IPC 概念与定义

1 IPC 全称与核心概念

IPC全称 Inter-Process Communication,也就是跨进程通信

它主要用于 Android不同进程之间进行交流,比如:

  • 下载服务实时回调进度
  • 跨进程数据共享
  • 独立服务组件通信

本质上,IPC 是一种机制,允许两个或多个进程之间交换数据和信号。

二、多进程特性与用途

1 多进程的核心目的:内存隔离

多进程主要是为了内存隔离而不是去获得更多的内存分配。

  • 系统限制:系统给每个应用设定了总内存上限
  • 独立运行环境:每个进程都有自己独立的虚拟机,独立的内存空间
"每个进程拥有独立的 Linux 进程地址空间和 ART 运行时环境,包括独立的堆内存、GC、JNI 环境等。"
2 实际应用场景:崩溃隔离

多进程的一个重要实际用途是崩溃隔离

SceneView中遇到的实际案例:

  • ViewNode组件内部 destroy()方法的资源释放顺序和 Filament渲染引擎生命周期规则相悖
  • 材质实例会被优先销毁,但是渲染引擎还在持有引用
  • 直接导致整个进程的崩溃

解决方案:为其开辟一个新的进程与主进程隔离,可以暂时解决这个 Bug。

3 多进程的挑战:数据隔离

因为每个进程有自己独立的内存,其他进程不能随便访问,这就让进程之间的数据交流并不容易。

正是由于这种隔离性,需要专门的跨进程通信机制来实现进程间的数据交换。

三、进程间通信方式

基于 Binder 的通信方式

  • AIDL Android Interface Definition Language,支持多线程并发 RPC,可传递复杂数据类型
  • Messenger 基于 Handler 实现,串行处理消息,适合简单消息传递场景
  • ContentProvider Android 四大组件之一,主要用于数据共享和访问,支持进程间数据查询
  • Intent/Bundle 通过 Intent 携带 Bundle 数据,适合组件间通信,数据大小受限

非 Binder 的通信方式

  • 文件共享 通过读写文件实现数据交换,简单但不适合高频通信,需要处理并发问题
  • Socket 基于 TCP/IP 协议的网络通信,可跨设备通信,适合复杂场景
  • Ashmem 共享内存机制,多个进程可访问同一块物理内存,适合大数据量传输
4 各类通信方式对比

下表从并发能力、实现复杂度、数据大小、适用场景四个维度对比六种主流 IPC 方式:

方式并发支持实现复杂度数据量最佳场景
AIDL多线程并发复杂RPC、实时通信
Messenger串行(Handler)简单消息传递
ContentProvider多线程数据共享、CRUD
文件共享需自行处理低频数据交换
Socket取决于实现跨设备通信
Ashmem需同步机制极大大数据量共享内存
Binder机制
需处理并发
不支持跨设备
系统原生支持