Binder 是 Android 系统提供的一种 IPC(进程间通信)机制。为了完成进程间的通信,binder 使用 AIDL 来描述进程间的接口。
进程间通信原理
对于用户空间,不同进程之间彼此是不能共享的,而内核空间却是可共享的。
\
Binder 原理
Binder 通信采用 C/S 架构,从组件视角来说,包含 Client、Server、ServiceManager 以及 binder 驱动。
\
Binder 通信模型
\
Binder 内存转移关系
Binder 单次通信只需要进行一次拷贝,因为它使用了内存映射,将一块物理内存(若干个物理页)分别映射到接收端用户空间和内核空间,达到用户空间和内核空间共享数据的目的。
发送端要向接收端发送数据时,内核直接通过 copy_from_user 将数据拷贝到内核空间映射区,此时由于共享物理内存,接收进程的内存映射区也就能拿到该数据了。
\
Binder 套件架构
内核层的 Binder 驱动已经提供了 IPC 功能,不过还需要在 framework native 层提供一些对于驱动层的调用封装,使 framework 开发者更易于使用,由此封装出了 native Binder;同时,由于 framework native 层是 c/c++语言实现,对于应用开发者,需要更加方便的 Java 层的封装,衍生出 Java Binder;最后在此之上,为了减少重复代码的编写和规范接口,在 Java Binder 的基础上又封装出了 AIDL。经过层层封装,在使用者使用 AIDL 时对于 Binder 基本上是无感知的。
领取专属 10元无门槛券
私享最新 技术干货