美文网首页
Android-Binder机制详解

Android-Binder机制详解

作者: 沙漠里的一粒金 | 来源:发表于2018-06-01 11:02 被阅读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学习指南

    相关文章

      网友评论

          本文标题:Android-Binder机制详解

          本文链接:https://www.haomeiwen.com/subject/onjhsftx.html