android进程间通讯【Binder】的代码流程介绍.docx

android进程间通讯【Binder】的代码流程介绍.docx

  1. 1、本文档共10页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
android进程间通讯【Binder】的代码流程介绍

Binder简介Binder介绍:Biner最早来源于Openbinder,Google为了摆脱其许可问题,重新开发了自己的一套Binder实现;Binder实现了IPC或RPC,在用户看来,类似本地函数调用一样,将用户进程的参数带到服务进程进行调用,再带着结果返回;Binder不是Linux的IPC机制,而是利用了Linux的内存映射机制【mmap()】实现的一套IPC机制;Binder的IPC过程:两个进程AB,需要通讯时,打开/dev/binder驱动,采用 mmp()获取一块虚拟内存区域,这个大小通常是数MB;当进程A向进程B传递数据时,A使用ioctl()操作/dev/binder,将数据传递给binder驱动;binder驱动依据A传递来的数据大小,申请合适的物理内存来存储这些数据。并在B的虚拟内存区域中找到合适大小的虚存空间,然后修改B的内存映射表,使这段虚存空间映射到刚刚申请的物理内存。这样B就可以访问A传递进来的数据了。Binder常见使用方式Binder的数据流程从应用程序的角度看Binder一共有三个方面【假设接口类为IMyInterface】:Server【local】:形如BnMyInterface,继承并实现IMyInterface的具体功能函数;Client Proxy:形如BpMyInterface,也继承并实现了IMyInterface,但并未具体实现功能函数,只是对每个功能函数会执行transact(),由远端的BnMyInterface类的onTransact()函数执行,根据传入的消息ID再调用相应的具体功能函数;Client:客户端获取到一个接口类IMyInterface,其实际的类型为BpMyInterface【通过基类可以指向派生类】。Server【local】继承关系:BnMyInterface : IMyInterface , BnInterface, BBinder实现BnMyInterface : : onTransact()注册服务:IServiceManager::addService()(2)Client Proxy继承关系:BpMyInterface : IMyInterface , BpInterface, BpRefBase实现BpMyInterface,调用BpMyInterface::remote()- transact()【BpMyInterface并未继承BpBinder,而是内部包含了BpBinder,通过remote()获取】(3)Client获取IMyInterface接口类:IServiceManager::getService()【即BpMyInterface】调用IMyInterface相关的功能函数,其过程是:调用BpMyInterface函数-BpBinder::transact()-BnMyInterface : : onTransact()-调用BnMyInterface函数一个典型的例子IMyInterface.hclass IMediaRecorderClient: public IInterface{virtual void fun() = 0;}IMyInterface.cppclass BpMyInterface : public IMyInterface, public BpRefBase{public void fun(){remote()-transact(TRANS_FUN, 0, 0, 0);//remote()即BpBinder,内部保存了远端的Handler,远端根据此handler获取BBinder;}}class BnMyInterface : public IMyInterface, public BBinder{status_t onTransact(uint32_t code, const Parcel data, Parcel* reply, uint32_t flags){switch(code) {case TRANS_FUN:fun();//将调用MyInterface中的fun();break;default:break;}}}MyInterface.cppclass MyInterface : public BnMyInterface{void fun(){// TODO:}}Server.cpp…defaultServiceManager()-addService( String16(test.IMyInterface ), new MediaPlayerService());…Client.cpp…spIServiceManager sm = defaultSer

文档评论(0)

xcs88858 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

版权声明书
用户编号:8130065136000003

1亿VIP精品文档

相关文档