
Android 里的 IPC

Android 的 IPC 简介
IPC 就是 Inter-Process Conmmunication 的缩写,含义就是进程间通信
通常,一个进程就是代表着一个程序实例,一个进程最多只能运行一个程序,但一个程序却可以占有多个进程。
Android 可以通过 ShareUID 来是一个进程里运行两个程序。
我们知道,线程间通信是相对容易的,这是因为线程之间的内存访问并没有过多限制,但在进程间却不是这样,每个进程都有自己的独立内存空间,访问内存地址就变得困难了,这就需要一些额外手段了。
Android 常见的 IPC 方式
- Binder
- Intent 单次传递
- AIDL(Android Interface Definition Language):用于在不同进程中调用方法(跨进程方法调用)。
- Messenger:Messenger 是 AIDL 的封装版本,基于 Handler + Message + Binder 实现。
- ContentProvider:用于不同应用之间共享数据。
- BroadcastReceiver(广播):用于发送系统或应用级别的消息。
- Socket:使用网络套接字通信,适用于跨设备或长连接。
- IO:可以将需要跨进程传递的资源序列化到本地文件
多进程带来的问题
如果你将某个 Activity 比如 SecondActivity 在 Manifest 里面设置了 process 属性,然后在 MainActivity 直接更改某个静态变量,会发现 SecondAcitivity 访问的还是旧的值。
这是因为 Android 会给每一个进程分配一个独立的虚拟机,导致了每个进程都有自己独立的虚拟内存地址,共 4G ,其中 3G 是用户空间,1G 是内核空间,当然内核空间的大小是可以通过参数配置调整的。对于用户空间,不同进程之间彼此是不能共享的,而内核空间却是可共享的。
而我们在代码中使用,Client 进程向 Server 进程通信,恰恰是利用进程间可共享的内核内存空间来完成底层通信工作的,Client 端与Server 端进程往往采用 ioctl 等方法跟内核空间的驱动进行交互。
ioctl
是一种「不走常规 I/O 读写」的系统调用,用于对设备执行控制命令,例如设置参数、获取状态、绑定资源等。例子:假设你要和一个显卡驱动打交道,普通的
read()
、write()
只能读写数据。但要设置分辨率、刷新率、GPU 模式这些“控制类”操作,必须通过ioctl
。
接下来本章我们的重点就是————Binder
Binder
Binder通信采用C/S架构,从组件视角来说,包含Client、Server、ServiceManager以及binder驱动,其中ServiceManager用于管理系统中的各种服务。架构图如下所示:
此处的
Service Manager
是指 Native 层的ServiceManager
(C++),并非指 framework 层的ServiceManager
(Java)。
// todo
- Title: Android 里的 IPC
- Author: lucas
- Created at : 2025-05-19 15:26:51
- Updated at : 2025-05-20 16:07:03
- Link: https://darkflamemasterdev.github.io/2025/05/19/Android-里的-IPC/
- License: This work is licensed under CC BY-NC-SA 4.0.