Android 里的 IPC

Android 里的 IPC

lucas Lv5

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用于管理系统中的各种服务。架构图如下所示:

Binder 架构图

此处的 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.
Comments