谈谈你对 Binder 的理解

原始网页直通车



Binder 是什么?

  • Binder :黏合剂,可以理解为黏合了两个不同的进程。
    谈谈你对 Binder 的理解

为什么选择 Binder ?

我们知道 Android 虚拟机是基于 Linux 实现的,而 Linux 的 IPC 通信主要有管道、消息队列、信号量、socket、共享内存等。

我们在开发 APP 时都会要求性能好,数据安全且传输快,所以我们首要从性能和安全性这两方面来看:

性能

  • socket 作为一款通用接口,其传输效率低,开销大,主要用在跨网络的进程间通信和本机上进程间的低速通信。
  • 消息队列和管道采用 存储-转发 方式,即数据先从发送方缓存区拷贝到内核开辟的缓存区中,然后再从内核缓存区拷贝到接收方缓存区,至少有两次拷贝过程。
  • 共享内存虽然无需拷贝,但控制复杂,难以使用。
  • Binder 基于 Client-Server 通信模式,传输过程只需一次拷贝,性能较好,效率虽然比共享内存的零次要低,但比管道和 socket 的两次要高。

安全性

BinderClient-Server 通信模式,为发送方添加 UID/PID 身份,既支持 实名Binder 也支持 匿名Binder ,保证了跨进程通讯的安全。


引用一张图:
谈谈你对 Binder 的理解


Binder 通信流程

  1. ServiceServiceManager 中注册
  2. Client 想要调用 Service 的方法,需要先获取 Service 对象, ServiceManager 会返回给它一个代理对象,即 Proxy
  3. Client 调用 Proxy 的方法, ServiceManager 会帮它调用 Service 对应的方法,并把结果返给它。

Android 中使用 Binder 的场景

ActivityManagerServicePackageManagerServiceWindowManagerServiceXXXManagerService 形式的基本都会用到,一般会在 SystemService 来注册这些系统服务。

其它的如 NotificationCompatSideChannelServiceContentProviderNative 等等,都有引用到。


参考链接

Android跨进程通信:图文详解 Binder 机制 原理