Android Binder机制学习

久未见 提交于 2020-01-09 00:27:58

Binder机制是什么:

Binder机制是​ Android系统中进程间通讯(IPC)的一种方式,Android中ContentProvider、Intent、aidl都是基于Binder。

为什么要用Binder机制:

在提及Binder之前,我们先看看我们平时开发的app的状况。每个app就像孤岛一样,生活在系统分配给自己的虚拟机和内存空间,好处是安全,各个app不会互相影响到对方,IE一个网页的崩溃却会导致整个IE应用程序死亡(举个小栗子,IE不属于跨进程)。在这种情况下,必须有一种机制,提供安全高效的通信的功能,Binder就为此而生。所以,Binder是Android系统的一种IPC(进程间通信)方式。ActivityManagerService、WinderManagerService等系统服务的背后都是Binder。

Binder机制的好处:

进程通信大概就两个方面因素,一者性能方面,传输效率问题,传统的管道队列模式采用内存缓冲区的方式,数据先从发送方缓存区拷贝到内核开辟的缓存区中,然后再从内核缓存区拷贝到接收方缓存区,至少有两次拷贝过程,而socket都知道传输效率低,开销大,用于跨网络进程交互比较多,共享内存虽然无需拷贝,但是不安全。
总结一下就是:
Binder机制优点:
1、只需要进行一次数据拷贝,性能上仅次于共享内存
2、基于C/S架构,职责明确,架构清晰,稳定性较好
3、为每个App分配UID,UID是鉴别进程身份的标志,安全性较好

二者这是安全问题,Android作为一个开放式,拥有众多开发者的的平台,应用程序的来源广泛,确保终端安全是非常重要的,传统的IPC通信方式没有任何措施,基本依靠上层协议,其一无法确认对方可靠的身份,Android为每个安装好的应用程序分配了自己的UID,故进程的UID是鉴别进程身份的重要标志,传统的IPC要发送类似的UID也只能放在数据包里,但也容易被拦截,恶意进攻,socket则需要暴露自己的ip和端口,知道这些恶意程序则可以进行任意接入。
综上所述,Android需要一种高效率,安全性高的进程通信方式,也就是Binder,Binder只需要一次拷贝,性能仅次于共享内存,而且采用的传统的C/S结构,稳定性也是没得说,发送添加UID/PID,安全性高。

Binder机制的实现:

1、Binder机制的架构
通信采用C/S架构,包含Client、 Server、 ServiceManager 以及 Binder 驱动
在 framework 层进行了封装,通过 JNI 技术调用 Native(C/C++)层的 Binder 架构
在 Native 层以 ioctl 的方式与 Binder 驱动通讯
在这里插入图片描述
2、Binder机制的实现
android中提供了Binder实体类,Binder 实体是 Server进程 在 Binder 驱动中的存在形式。
该对象保存 Server 和 ServiceManager 的信息(保存在内核空间中),Binder 驱动通过 内核空间的Binder 实体 找到用户空间的Server对象,注册服务后,Binder驱动持有 Server进程创建的Binder实体。
流程总结:客户端通过bindService,通过Binder驱动查询ServiceManager是否已经注册该服务,
如果没有注册,Service进程会想Binder驱动发起服务注册请求,一旦注册,调用该服务的onBind返回一个Binder对象到Binder驱动,已经注册则意味着Binder驱动内包含这个Binder对象,Binder驱动返回一个BinderProxy对象,并通过回调,传递给客户端,客户端通过这个BinderProxy(在java层仍然是Binder对象)操作Binder驱动内的Binder对象(transact方法),Binder驱动含有很多的Binder对象,它们是通过InterfaceToken区分不同服务的。
在这里插入图片描述

Binder通信的四个角色

Client进程:使用服务的进程。

Server进程:提供服务的进程。

ServiceManager进程:ServiceManager的作用是将字符形式的Binder名字转化成Client中对该Binder的引用,使得Client能够通过Binder名字获得对Server中Binder实体的引用。

Binder驱动:驱动负责进程之间Binder通信的建立,Binder在进程之间的传递,Binder引用计数管理,数据包在进程之间的传递和交互等一系列底层支持。

Binder运行机制

在这里插入图片描述
图中Client/Server/ServiceManage之间的相互通信都是基于Binder机制。既然基于Binder机制通信,那么同样也是C/S架构,则图中的3大步骤都有相应的Client端与Server端。

注册服务(addService):Server进程要先注册Service到ServiceManager。该过程:Server是客户端,ServiceManager是服务端。

获取服务(getService):Client进程使用某个Service前,须先向ServiceManager中获取相应的Service。该过程:Client是客户端,ServiceManager是服务端。

使用服务:Client根据得到的Service信息建立与Service所在的Server进程通信的通路,然后就可以直接与Service交互。该过程:client是客户端,server是服务端。

图中的Client,Server,Service Manager之间交互都是虚线表示,是由于它们彼此之间不是直接交互的,而是都通过与Binder驱动进行交互的,从而实现IPC通信方式。其中Binder驱动位于内核空间,Client,Server,Service Manager位于用户空间。Binder驱动和Service Manager可以看做是Android平台的基础架构,而Client和Server是Android的应用层,开发人员只需自定义实现client、Server端,借助Android的基本平台架构便可以直接进行IPC通信。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!