Android Binder 进程间通信

什么是Binder

Binder是Android系统中进程间通讯(IPC)的一种方式,也是Android系统中重要的特征之一。Android中的四大组件Activity、Service、Broadcast、ContentProvider,不同的App都运行在不同的进程中,它是这些进程间通讯的桥梁。正如其名“粘合剂”一样,它把系统中各个组件粘合到一起,是各个组件的桥梁。

IPC原理

IPC通信指的是两个进程之间交换数据,如图中的Client进程和Server进程。

Android为每个进程提供了虚拟内存空间,而每个Android进程只能运行在自己进程所拥有的虚拟内存空间。

内存空间又分为用户空间和内核空间,前者的数据不能进程间共享,但是后者可以。图中的Client进程和Server进程就是利用了进程间可以共享各自内核空间的数据,来完成底层通讯的工作。

Android的C/S通信机制

C/S通信指的就是Client和Server两个进程的通信,但实际通信时除了包含这两个进程,还有一个Service Manager,它用于管理各种服务。

这些服务通常是Android系统的核心功能模块,例如传感器管理、电源管理、WIFI管理、闹钟服务等,与Android四大组件中的服务不同。

当一个Server(服务端)想要提供一种服务,首先需要在Service Manager注册该服务。

而当Client(客户端)想要使用Server中的服务时,不能直接访问,而是要从Service Manager获取该服务,才能使用Server所提供的服务,来与Server进行通信。

Binder通信模块

引入Binder通信后,客户端、服务端和Service Manager之间不能通过API直接互相访问,而是与内核空间的Binder驱动通过ioctl方式来完成进程间的数据交换。

关键概念

  • Binder实体对象:Binder服务的提供者,类型是BBinder,位于服务端。
  • Binder引用对象:Binder实体对象在客户端进程的代表,类型是BpBinder,位于客户端。
  • IBinder对象:Binder实体对象和引用对象的统称,也是他们的父类。
  • Binder代理对象:又称接口对象,为客户端的上层应用提供接口服务,类型是IInterface。

Binder引用对象和代理对象都是服务端进程中的,把它们分离的好处是一个引用对象可以有多个代理对象,方便上层应用使用。

通讯过程

注册服务

  • Server进程向Binder驱动申请创建服务的Binder实体。
  • Binder驱动为这个服务创建位于内核的Binder实体和Binder引用。
  • 创建完成后,服务端通过Binder驱动将Binder引用发送给Service Manager。
  • Service Manager收到数据后,取出被创建服务的名字和引用,填入一张查找表。

通过以上步骤,Server进程通过Binder驱动完成了在Service Manager的服务注册。

在注册服务的过程中,Server进程是客户端,而Service Manager是服务端。

获取服务

  • Client进程利用Handle值为0的引用找到Service Manager。
  • Client进程向Service Manager发送xxxService的访问申请。
  • Service Manager从请求表中获取xxxService的名字,在查找表中找到对应的条目,取出对应的Binder引用。
  • Service Manager把xxxService的Binder引用传给Client进程。
使用服务

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值