Android-Binder机制详解

2018-06-01  本文已影响0人  沙漠里的一粒金

最近在学习Binder机制,通过书籍和网络上查找了大量的资料,也看了大量的博客,都是从底层讲的,全是C的代码,看的我是一脸懵逼,整个就是怀疑人生了!下面我简单的总结以下自己对Binder的理解。

在学习Binder的时候请牢牢抓住一下几点:

a:Binder是一种通信机制,负责进程间的通信

b:Binder通信,采用了C/S框架。对于Server来说,Binder指的是本地对象;对于Client来说,Binder指的是代理对象

c:对于信息传输而言,Binder是可以进行跨进程传输的对象

d:AIDL是Binder的一个实例

什么是Binder?

Binder是Android中进程(IPC)通信的一种方式,不同的App在不同的进程中运行,Binder是这些进程间的通信桥梁

Binder架构

a:Binder通信采用C/S架构,从组件视图来看,包含Client,Server,Binder驱动和ServicerManager,其中ServicerManager负责管理各种服务

b:Binder在Framework层进行了封装,通过JNI技术调用Native层的Binder架构

c:Binder在Native层通过ioctl方式与Binder驱动通信

进行一次完整的通信

a:首先需要注册服务端,只有注册了服务端,客户端才有通讯的目标,服务端通过 ServiceManager 注册服务,注册的过程就是向 Binder 驱动的全局链表 binder_procs 中插入服务端的信息(binder_proc 结构体,每个 binder_proc 结构体中都有 todo 任务队列),然后向 ServiceManager 的 svcinfo 列表中缓存一下注册的服务。

b:有了服务端,客户端就可以跟服务端通讯了,通讯之前需要先获取到服务,拿到服务的代理,也可以理解为引用。

c:我们在使用 Binder 时基本都是调用 framework 层封装好的方法,AIDL 就是 framework 层提供的傻瓜式是使用方式。假设服务已经注册完,我们来看看客户端怎么执行服务端的方法。

d:首先我们通过 ServiceManager 获取到服务端的 BinderProxy 代理对象,通过调用 BinderProxy 将参数,方法标识(例如:TRANSACTION_test,AIDL中自动生成)传给 ServiceManager,同时客户端线程进入等待状态。

e:ServiceManager 将用户空间的参数等请求数据复制到内核空间,并向服务端插入一条执行执行方法的事务。事务执行完通知 ServiceManager 将执行结果从内核空间复制到用户空间,并唤醒等待的线程,响应结果,通讯结束。

网上资料很多,个人觉得比较好的如下: 

1. Bander设计与实现 

2. 老罗的 Android进程间通信(IPC)机制Binder简要介绍和学习计划 系列 

3. Innost的 深入理解Binder 系列 

4. Gityuan的 Binder系列 (基于 Android 6.0) 

5. Binder学习指南

上一篇下一篇

猜你喜欢

热点阅读