一、分层架构:Binder通信的完整链路
Binder 是 Android 专门为进程间通信(IPC)设计的核心机制。它通过一个四层架构,实现了高效、安全、基于客户端-服务端模型的通信。
1. 应用层:AIDL与用户接口
- 功能:开发者通过 AIDL(Android Interface Definition Language)定义服务接口,AIDL 编译器会自动生成
Proxy和Stub代码。这层为开发者提供了简洁、易用的 API。 - 核心类:
android.os.IInterface、android.os.IBinder。
2. Java框架层:代理模式与ServiceManager
Binder:android.os.Binder是IBinder接口的实现,代表了服务端的实体。ServiceManager:Binder驱动的上下文管理者,它提供了一个统一的服务注册和查询入口,所有系统服务都必须在此登记。- 代理模式:客户端通过
Proxy调用远程服务,Proxy将调用封装成Parcel。服务端通过Stub的onTransact()方法接收并处理请求。
3. Native层:libbinder库
-
功能:
libbinder库是Binder的 Native 实现。它封装了与Binder驱动的交互,提供了一系列 C++ 类。 -
核心类:
BpBinder:Binder代理(客户端),负责向服务端发送请求。BBinder:Binder实体(服务端),负责处理请求。IPCThreadState:管理线程的Binder通信状态。
4. 驱动层:Binder内核模块
-
功能:
Binder驱动是 Linux 内核中的一个模块。它负责处理所有Binder通信,包括内存映射、线程调度和权限控制。 -
核心机制:
- 内存映射:通过
mmap系统调用,在内核与用户空间共享缓冲区,实现一次拷贝。 - 线程调度:
Binder驱动管理Binder线程池,当有请求到来时,它会唤醒一个空闲线程处理。
- 内存映射:通过
二、Binder通信的完整流程:从transact到onTransact
-
客户端调用:
- 客户端调用
Proxy的方法。 Proxy将方法编号和参数打包成Parcel,并通过 JNI 调用 Native 层BpBinder的transact()。
- 客户端调用
-
Native层处理:
BpBinder::transact()调用IPCThreadState::transact()。IPCThreadState通过ioctl(BINDER_WRITE_READ)系统调用,将Parcel发送给Binder驱动。
-
驱动层路由:
Binder驱动接收到请求,根据handle找到目标进程的Binder实体。- 它将事务加入目标进程的待处理队列,并唤醒一个空闲线程。
-
服务端响应:
- 被唤醒的线程从驱动中读取事务,调用
BBinder::onTransact()。 onTransact()解包Parcel,调用实际的服务方法,并将结果返回。
- 被唤醒的线程从驱动中读取事务,调用
三、性能与安全设计
- 性能:
Binder的“一次拷贝”机制(基于内存映射)避免了传统 IPC 的两次拷贝开销,极大地提升了通信性能。 - 安全:
Binder驱动能够获取到调用方的 UID/PID,并进行严格的权限校验,从而防止恶意进程进行非法调用。 - 线程管理:
Binder线程池的动态管理,确保了在并发请求下的高吞吐量和系统的稳定性。