Android-Binder机制详解
最近在学习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学习指南