欢迎来到淘文阁 - 分享文档赚钱的网站! | 帮助中心 好文档才是您的得力助手!
淘文阁 - 分享文档赚钱的网站
全部分类
  • 研究报告>
  • 管理文献>
  • 标准材料>
  • 技术资料>
  • 教育专区>
  • 应用文书>
  • 生活休闲>
  • 考试试题>
  • pptx模板>
  • 工商注册>
  • 期刊短文>
  • 图片设计>
  • ImageVerifierCode 换一换

    2022年Android系统进程间通信Binder机制在低层的C++接口源代码文件 .pdf

    • 资源ID:33403258       资源大小:57.16KB        全文页数:7页
    • 资源格式: PDF        下载积分:4.3金币
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录   QQ登录  
    二维码
    微信扫一扫登录
    下载资源需要4.3金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    2022年Android系统进程间通信Binder机制在低层的C++接口源代码文件 .pdf

    1 -Android系 统 进 程 间 通 信Binder机 制 在 低 层 的C+ 接 口 源 代 码 文 件 分 析- -重点在 BpServiceManager 和 BpBinder(0)- 1、RefBase.cpp RefBase.h 定义了如下几个类:一、 class RefBase 定义了所有类的基类,他应该是一个普遍基类,并不是一个抽象类。二、template class sp 模板智能指针sp,是 binder 系统中最常用的类型,用来执行具体的类型变量,类内使用T* m_ptr; 存储指向类型对象的指针。使用inline T* get() const return m_ptr; get 函数获取指向的对象。三、template class wp 2、IBinder.h Binder.cpp 只实现一个类,class IBinder : public virtual RefBase 注意继承自RefBase,并且指定为虚基类,防止“二义性”。这是 Binder 最重要的一个低层类,上层所有Binder 类型都是继承自它。他是一个抽象类,除了几个重要虚函数外,其他的都是纯虚函数。几个重要的虚函数如下所示,sp IBinder:queryLocalInterface(const String16& descriptor)-后续可以用来查询派生类的IInterface BBinder* IBinder:localBinder()-返回一个本地的Binder 对象 -BBinder BpBinder* IBinder:remoteBinder()-返回一个代理的Binder 对象 -BpBinder bool IBinder:checkSubclass(const void* /*subclassID*/) const-检查派生类3、Binder.h Binder.cpp 实现两个类,如下所示:一、 class BBinder : public IBinder 这个类 public 继承自 IBinder ,用来实现Binder 的本地对象。注意它在private 部分声明了BBinder& operator=(const BBinder& o); 说明这个类对象不能使用operator=进行赋值操作,即对operator=放到了 private 区,进行了隐藏。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 7 页 - - - - - - - - - 2 另外,此类对其基类IBinder 的所有纯虚函数进行了实现,因此此类可以创建对象,不是一个抽线类。二、 class BpRefBase : public virtual RefBase 这个类应该是最深基类RefBase 的一个“代理” ,它也是一个“虚基类”,防止后续派生类产生“二义性”因为是代理,它有一个重要的private 成员,IBinder* const mRemote; IBinder 指针,指向远程的IBinder 对象。使用函数,inline IBinder* remote() return mRemote; 来获取。另外,在private 区,有如下定义,BpRefBase& operator=(const BpRefBase& o); 对 operator=进行了隐藏,说明此类对象不支持赋值操作。private 区还有一个变量,RefBase:weakref_type* mRefs; 目前不知道做什么用的。4、BpBinder.h BpBinder.cpp class BpBinder : public IBinder 这个类是一个重要的类,用它来实现和其他service 的交互。 public 继承自 IBinder ,用来实现Binder 的代理对象。定义了一个重要的函数,virtual BpBinder* remoteBinder(); 用来返回它自身。注意函数defaultServiceManager 中,sp b = ProcessState:self()-getContextObject(NULL); 相当于,sp b = new BpBinder(0); 注意此类中的成员变量mHandle 保存有 Binder 设备 ID,永远为0。5、IInterface.h IInterface.cpp 主要实现如下几个类:一、 class IInterface : public virtual RefBase 所有类的一个公共接口,他是一个抽象类, 只能用作继承。 注意它使用了virtual 继承 RefBase, 因此它成为 “虚基类”,防止后续类再继承它时产生“二义性”。此类注意onAsBinder 是一个纯虚函数,后续的派生类都需要有一个实现,他的返回值为IBinder 。二、 template class BnInterface : public INTERFACE, public BBinder 模板类 BnInterface,除了继承模板指定的类外,还继承了BBinder 。有三个重要的虚基类,virtual sp queryLocalInterface(const String16& _descriptor); virtual const String16& getInterfaceDescriptor() const; virtual IBinder* onAsBinder(); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 7 页 - - - - - - - - - 3 其中 onAsBinder 继承了基类IInterface 的纯虚函数。三、 template class BpInterface : public INTERFACE, public BpRefBase 模板类 BpInterface,除了继承模板指定的类外,还继承了代理类BpRefBase。BpInterface 是 BnInterface 的代理,声明一个重要函数virtual IBinder* onAsBinder(); 6、IServiceManager.h IServiceManager.cpp 主要实现如下几个类:一、class IServiceManager : public IInterface 继承自抽象类IInterface ,自身也是抽象类,定义了如下几个纯虚函数:virtual sp getService( const String16& name) const = 0; virtual sp checkService( const String16& name) const = 0; virtual status_t addService( const String16& name, const sp& service) = 0; virtual Vector listServices() = 0; 二、 class BnServiceManager : public BnInterface 展开就是class BnServiceManager : public IServiceManager, public BBinder 即继承了IServiceManager 和 BBinder ,他是 ServiceManager 的一个本地对象。声明一个重要的虚汗数virtual status_t onTransact( uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags = 0); 用来对消息进行分发。三、 class BpServiceManager : public BpInterface 展开就 class BpServiceManager : public IServiceManager, public BpRefBase 即继承了IServiceManager 和 BpRefBase,他是 ServiceManager 的一个代理对象。此代理对象对所有的消息进行处理四、这个文件中注意一个重要的全局函数,sp defaultServiceManager() 用来创建一个全局的IServiceManager 对象,sp gDefaultServiceManager; 这个函数也创建的是单例,因为函数实现的第一句是,if (gDefaultServiceManager != NULL) return gDefaultServiceManager; 里面有这样一句话,gDefaultServiceManager = interface_cast( ProcessState:self()-getContextObject(NULL); 这样演变,gDefaultServiceManager = interface_cast(new BpBinder(0); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 7 页 - - - - - - - - - 4 gDefaultServiceManager = IServiceManager:asInterface(new BpBinder(0); 看下 IServiceManager:asInterface 的定义:android:sp I#INTERFACE:asInterface( const android:sp& obj) android:sp intr; if (obj != NULL) intr = static_cast( obj-queryLocalInterface( I#INTERFACE:descriptor).get(); if (intr = NULL) intr = new Bp#INTERFACE(obj); return intr; 即android:sp IServiceManager:asInterface(const android:sp& obj) android:sp intr; if (obj != NULL) intr = static_cast( obj-queryLocalInterface(IServiceManager:descriptor).get(); if (intr = NULL) intr = new BpServiceManager(obj); return intr; 因为 new BpBinder(0) 不为空,所以执行static_cast( obj-queryLocalInterface(IServiceManager:descriptor).get(); 即执行 (new BpBinder(0) 的 queryLocalInterface 方法, BpBinder 没有重定义此虚函数,它继承自IBinder ,IBinder 已经实现,将调用基类IBinder 的此函数,可以看到,sp IBinder:queryLocalInterface(const String16& descriptor) return NULL; 返回 NULL ,因此它将执行intr = new BpServiceManager(obj); 即intr = new BpServiceManager(new BpBinder(0); 因此函数defaultServiceManager ,最终返回new BpServiceManager(new BpBinder(0) 给 gDefaultServiceManager 。gDefaultServiceManager = new BpServiceManager(new BpBinder(0); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 7 页 - - - - - - - - - 5 五、通过 BpServiceManager 的构造函数BpServiceManager(const sp& impl) : BpInterface(impl) 可以看到new BpBinder(0) 传给 BpInterface(new BpBinder(0),在调用BpInterface 的构造函数,template inline BpInterface:BpInterface(const sp& remote) : BpRefBase(remote) 继续传给基类BpRefBase 的构造函数,BpRefBase:BpRefBase(const sp& o) : mRemote(o.get(), mRefs(NULL), mState(0) extendObjectLifetime(OBJECT_LIFETIME_WEAK); if (mRemote) mRemote-incStrong(this); / Removed on first IncStrong(). mRefs = mRemote-createWeak(this); / Held for our entire lifetime. 所以new BpBinder(0) 最终是保存在了BpRefBase 中的IBinder* const mRemote; 成员变量中。7、ProcessState.h ProcessState.cpp class ProcessState : public virtual RefBase 此文件定义类对象gProcess = new ProcessState ,他是一个单例模式,每个进程只会有一个,可以通过函数声明static sp self(); 它是 static 的确定。ProcessState的主要作用:(1) 、打开 /dev/binder,建立与内核Binder 驱动交互的通道;(2) 、对返回的fd 进行 mmap 映射,使内核 Binder 驱动分配一块内存接受数据,地址起始地址由成员变量mVMStart保存;(3) 、由于具有唯一性,只会创建一次,因此一个设备直打开设备/dev/binder 一次,一旦打开,全局有效(因为使用全变变量gProcess保存的),后续直接使用即可。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 7 页 - - - - - - - - - 6 8、IPCThreadState.h IPCThreadState.cpp 定义类 class IPCThreadState 此类用来创建一个线程在和Binder 交互工作中使用的数据IPCThreadState 对象。每个线程都有一个IPCThreadState,每个 IPCThreadState 都有一个mIn,一个 mOut, mIn 用来接收来自Binder 设备的数据,而mOut 用来存储发往Binder 设备数据的。一、静态取自身函数和构造函数IPCThreadState* IPCThreadState:self() if (gHaveTLS) restart: const pthread_key_t k = gTLS; IPCThreadState* st = (IPCThreadState*)pthread_getspecific(k); if (st) return st; return new IPCThreadState; if (gShutdown) return NULL; pthread_mutex_lock(&gTLSMutex); if (!gHaveTLS) if (pthread_key_create(&gTLS, threadDestructor) != 0) pthread_mutex_unlock(&gTLSMutex); return NULL; gHaveTLS = true; pthread_mutex_unlock(&gTLSMutex); goto restart; 其中static pthread_key_t gTLS = 0; 用来表示线程本地存储空间(Thread Local Storage)的 ID ,如果它存在表示IPCThreadState(代表线程本地存储空间)已经创建,使用IPCThreadState* st = (IPCThreadState*)pthread_getspecific(k) 将其取出,然后返回它的值。如果为空,使用return new IPCThreadState;创建一个。如果 gHaveTLS 不存在,代表线程本地存储空间未建立,用(pthread_key_create(&gTLS, threadDestructor) != 0) 进行创建,然后跳到restart 处,将其放回。IPCThreadState:IPCThreadState() : mProcess(ProcessState:self(), mMyThreadId(androidGetTid(), mStrictModePolicy(0), mLastTransactionBinderFlags(0) 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 6 页,共 7 页 - - - - - - - - - 7 pthread_setspecific(gTLS, this); clearCaller(); mIn.setDataCapacity(256); mOut.setDataCapacity(256); 注意其中的函数调用pthread_setspecific(gTLS, this); 将 gTLS 和对象 IPCThreadState 联系到一起。另外,初始化列表中有mProcess(ProcessState:self(),说明使用mProcess将本进程进行了保存。-end- 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 7 页,共 7 页 - - - - - - - - -

    注意事项

    本文(2022年Android系统进程间通信Binder机制在低层的C++接口源代码文件 .pdf)为本站会员(C****o)主动上传,淘文阁 - 分享文档赚钱的网站仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知淘文阁 - 分享文档赚钱的网站(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于淘文阁 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

    本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

    工信部备案号:黑ICP备15003705号 © 2020-2023 www.taowenge.com 淘文阁 

    收起
    展开