谈谈你对 Binder 的理解
Binder 是什么?
-
Binder
:黏合剂,可以理解为黏合了两个不同的进程。
为什么选择 Binder ?
我们知道 Android 虚拟机是基于 Linux 实现的,而 Linux 的 IPC 通信主要有管道、消息队列、信号量、socket、共享内存等。
我们在开发 APP 时都会要求性能好,数据安全且传输快,所以我们首要从性能和安全性这两方面来看:
性能
-
socket
作为一款通用接口,其传输效率低,开销大,主要用在跨网络的进程间通信和本机上进程间的低速通信。 - 消息队列和管道采用 存储-转发 方式,即数据先从发送方缓存区拷贝到内核开辟的缓存区中,然后再从内核缓存区拷贝到接收方缓存区,至少有两次拷贝过程。
- 共享内存虽然无需拷贝,但控制复杂,难以使用。
-
Binder
基于Client-Server
通信模式,传输过程只需一次拷贝,性能较好,效率虽然比共享内存的零次要低,但比管道和socket
的两次要高。
安全性
Binder
的 Client-Server
通信模式,为发送方添加 UID/PID
身份,既支持 实名Binder
也支持 匿名Binder
,保证了跨进程通讯的安全。
引用一张图:
Binder 通信流程
-
Service
在ServiceManager
中注册 -
Client
想要调用Service
的方法,需要先获取Service
对象,ServiceManager
会返回给它一个代理对象,即Proxy
-
Client
调用Proxy
的方法,ServiceManager
会帮它调用Service
对应的方法,并把结果返给它。
Android 中使用 Binder 的场景
ActivityManagerService
、 PackageManagerService
、 WindowManagerService
等 XXXManagerService
形式的基本都会用到,一般会在 SystemService
来注册这些系统服务。
其它的如 NotificationCompatSideChannelService
、 ContentProviderNative
等等,都有引用到。