binder学习笔记

binder是android系统服务与应用进程之间的桥梁,可以说是整个android系统的基石.


1. binder概述

binder机制主要分为Java层,native层和驱动层.其中Java层和native层运行在用户空间,驱动层运行在内核空间.Java层主要是应用进程的接口, 通过jni调用到native层,主要实现在native层和驱动层.binder驱动通过内存映射达到一次拷贝就实现进程间通信的目的.从设计模式看,binder使用了代理模式,在java层和native层都有本地端和代理端.以AMS为例,在java层的本地端为ActivityManagerNative,而AMS是他的子类,ActivityManagerNative又是Binder的子类.其实所有android系统服务都是Binder的子类.在java层对应代理端和本地端的还有BinderProxy与Binder.而在native层的本地端是BBinder, 代理端是BpBinder. 下面借用一张http://gityuan.com的图.


                                                                                      binder层次图

Binder通信涉及三个进程,client进程,service进程和service manager进程.service manager进程是binder进程通信的大管家,系统在启动的时候将系统服务(AMS,PMS,WMS等)注册到service manager中,在注册过程中,service manger进程会给服务创建binder本地对象JavaBBinder,JavaBBinder持有Java服务的对象引用.应用进程访问这些系统服务时需要先从service manager处获取服务的远程代理对象.应用进程自己的service组件不需要在service manager上注册,其他应用进程如果需要使用,直接绑定service即可,绑定的过程实际上是通过AMS直接获取应用service的binder代理对象.


                                                                                                                 binder架构图

2.通信流程

一次binder通信大体上可分为以下4个步骤:

1) client进程调用service manager的getService(0方法获取服务发远程代理对象.

    在执行getService()过程中,service manager先为目标服务进程创建native层Binder代理对象BpBinder,并把驱动传上来的句柄值handle传进BpBinder,然后为目标服务进程创建       java层的代理对象BinderProxy,并把BpBinder作为参数mObject传进BinderProxy,最后用BinderProxy作为参数mRemote为目标服务进程创建远程代理对象xxxServiceProxy.

2) client进程发起与service进程的通信

   这一步就按照java层,native层和驱动层分为3个小步骤

   java层: client进程在获取service的远程代理后,可以使用service提供的各种服务.具体实现是通过远程代理xxxServiceProxy调用mRmote的transact()方法,而mRemote是 

   BinderProxy对象,也就是说最终调用了BinderProxy对象的transact()方法.

   native层: BinderProxy通过jni进入native后,首先将java层的parcel对象转换为C++的parcel对象,然后获取服务端在native的binder代理对象BpBinder,最后调用BpBinder的 

   transact()方法将数据拷贝到内核空间.之后client进程向binder驱动发起ioctl请求,最后循环调用talkWithDriver()方法并阻塞在这里一直到接收到BR_XXX命令才会结束该过程,

   驱动层: binder驱动根据拷贝到内核空间数据中的BpBinder对象的handle值找到目标进程,并将内核空间中存储通信数据的这段内存映射到目标服务进程的用户空间中,并给目标

   进程发送BC_TRANSACTION命令.

3) 目标进程的处理并返回

    目标进程在收到命令后,调用服务的JavaBBinder的onTransact()方法,经过几次调用最终调到目标service的onTransact()方法,并在该方法中做相应处理.处理完后将结果写入

    reply并用同样的方法拷贝到binder驱动中.

4) client进程接收返回结果

    client进程因为一直阻塞在waitForResponse()中,接收到返回结果后,停止阻塞,继续后面的动作.


==============================================================================================================

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值