【Android】Binder的结构

2017-12-15  本文已影响0人  aniegai

        Binder是Android中的一种跨进程通信方式,其在ServiceManager连接到各个Service的过程中扮演了重要的桥梁角色,理解Binder对于理解android四大组件都非常重要。但是Binder驱动的具体实现涉及到大量底层C语言实现,这一部分笔者尚无能力理解,因此本文仅涉及到Binder的基本原理,以及Android在进行跨进程调用时对Binder的使用。

Binder在跨进程C/S下的使用过程

        在跨进程通信的过程中,存在有一个客户端和一个服务端,整个通信过程可分为以下几个步骤

1. Service注册到ServiceManager

首先服务端需要将其提供的Service注册到ServiceManager当中。

具体为Binder驱动在内核空间为Service创建一个Binder实体(红色矩形),并创建一个Binder引用(黄色波浪形)提供给ServiceManager。

ServiceManager将维护一个Map,该Map会对注册的Service及对应Binder引用生成handle值进行保存。

2. Client获取ServiceManager的引用

Client要对ServiceManager发起请求,就需要首先找到ServiceManager

为了找到ServiceManager,Client构建一个handle值为0的Binder引用(黑色波浪形)

Binder驱动在内核中创建相应的Binder引用,并指向ServiceManager在内核空间的Binder实体(黑色矩形),值得注意的是handle值为0的Binder引用在Binder驱动中将自动对应到ServiceManager的Binder实体。

3. Client对ServiceManager发起请求获取Service

Client通过这个引用向内核空间发送希望请求Service的标志名

ServiceManager会根据Client提供的Service的标志名在Map中进行检索,获取到Service的Binder引用,将数据写回到内核空间。

Binder驱动为Client进程创建一个Service端的Binder引用(蓝色波浪形)

返回包含内核空间的Binder引用的handle值的数据给Client,在Client端创建一个Binder引用

至此Client进程与Service进程建立联系

4. Client端与Server端的通信

在Client端和Server端建立通信以后,Client持有自己的Binder实体以及Server的Binder引用,同样Server也持有自己的Binder实体及Client的Binder引用

至此Client端与Server端成功建立通信,并通过持有的引用进行数据传输

特别注意

从以上Binder流程可以发现一点,ServiceManager自身其实就是一个Service进程!只不过它的作用记录注册的Service并其他进程找到需要的Service

实际上,ServiceManager是一个守护进程,从系统启动开始就会初始化,那么我们知道Service需要注册到ServiceManager当中,ServiceManager作为第一个Service又是如何完成注册的呢?

我们可以从client找到ServiceManager的过程中得到答案,ServiceManager在创建的时候Binder驱动会为它创建一个Binder实体,并将其handle值设为0,这样,各个进程想要找到ServiceManager的时候直接在Binder驱动中寻找handle值为0的Binder实体并生成相应Binder引用就可以了

        Binder在android开发应用当中主要场景为Service,包括Messenger,AIDL等,一般Service不需要放在不同进程,因此不太会涉及到上述流程,对于AIDL和Messenger一般应用于不同进程间通信,因此会大量需要应用到上述Binder的核心部分。此外,当启动四大组件时,同样会使用Binder获取服务,例如启动Activity时获取ActivityManagerService,这部分我将在Activity启动流程当中进行分析。

        最后,大概描述一下Service、Messenger、AIDL的应用场景

非跨进程Binder:service在在同一进程,普通Binder即可满足要求,不会走底层

Messenger:service在另一进程,不需要处理多线程问题

AIDL:service在另一进程,且需要处理多线程问题(开发经验尚浅,没碰到过...)

上一篇 下一篇

猜你喜欢

热点阅读