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

上传人:C****o 文档编号:33403258 上传时间:2022-08-10 格式:PDF 页数:7 大小:57.16KB
返回 下载 相关 举报
2022年Android系统进程间通信Binder机制在低层的C++接口源代码文件 .pdf_第1页
第1页 / 共7页
2022年Android系统进程间通信Binder机制在低层的C++接口源代码文件 .pdf_第2页
第2页 / 共7页
点击查看更多>>
资源描述

《2022年Android系统进程间通信Binder机制在低层的C++接口源代码文件 .pdf》由会员分享,可在线阅读,更多相关《2022年Android系统进程间通信Binder机制在低层的C++接口源代码文件 .pdf(7页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、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_pt

2、r; get 函数获取指向的对象。三、template class wp 2、IBinder.h Binder.cpp 只实现一个类,class IBinder : public virtual RefBase 注意继承自RefBase,并且指定为虚基类,防止“二义性”。这是 Binder 最重要的一个低层类,上层所有Binder 类型都是继承自它。他是一个抽象类,除了几个重要虚函数外,其他的都是纯虚函数。几个重要的虚函数如下所示,sp IBinder:queryLocalInterface(const String16& descriptor)-后续可以用来查询派生类的IInterface

3、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 的本地对象。注意它在priva

4、te 部分声明了BBinder& operator=(const BBinder& o); 说明这个类对象不能使用operator=进行赋值操作,即对operator=放到了 private 区,进行了隐藏。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 7 页 - - - - - - - - - 2 另外,此类对其基类IBinder 的所有纯虚函数进行了实现,因此此类可以创建对象,不是一个抽线类。二、 class BpRefBase : public virtual R

5、efBase 这个类应该是最深基类RefBase 的一个“代理” ,它也是一个“虚基类”,防止后续派生类产生“二义性”因为是代理,它有一个重要的private 成员,IBinder* const mRemote; IBinder 指针,指向远程的IBinder 对象。使用函数,inline IBinder* remote() return mRemote; 来获取。另外,在private 区,有如下定义,BpRefBase& operator=(const BpRefBase& o); 对 operator=进行了隐藏,说明此类对象不支持赋值操作。private 区还有一个变量,RefBase

6、: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

7、 = new BpBinder(0); 注意此类中的成员变量mHandle 保存有 Binder 设备 ID,永远为0。5、IInterface.h IInterface.cpp 主要实现如下几个类:一、 class IInterface : public virtual RefBase 所有类的一个公共接口,他是一个抽象类, 只能用作继承。 注意它使用了virtual 继承 RefBase, 因此它成为 “虚基类”,防止后续类再继承它时产生“二义性”。此类注意onAsBinder 是一个纯虚函数,后续的派生类都需要有一个实现,他的返回值为IBinder 。二、 template class

8、BnInterface : public INTERFACE, public BBinder 模板类 BnInterface,除了继承模板指定的类外,还继承了BBinder 。有三个重要的虚基类,virtual sp queryLocalInterface(const String16& _descriptor); virtual const String16& getInterfaceDescriptor() const; virtual IBinder* onAsBinder(); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - -

9、 - 名师精心整理 - - - - - - - 第 2 页,共 7 页 - - - - - - - - - 3 其中 onAsBinder 继承了基类IInterface 的纯虚函数。三、 template class BpInterface : public INTERFACE, public BpRefBase 模板类 BpInterface,除了继承模板指定的类外,还继承了代理类BpRefBase。BpInterface 是 BnInterface 的代理,声明一个重要函数virtual IBinder* onAsBinder(); 6、IServiceManager.h IServic

10、eManager.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; virtua

11、l 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 f

12、lags = 0); 用来对消息进行分发。三、 class BpServiceManager : public BpInterface 展开就 class BpServiceManager : public IServiceManager, public BpRefBase 即继承了IServiceManager 和 BpRefBase,他是 ServiceManager 的一个代理对象。此代理对象对所有的消息进行处理四、这个文件中注意一个重要的全局函数,sp defaultServiceManager() 用来创建一个全局的IServiceManager 对象,sp gDefaultServ

13、iceManager; 这个函数也创建的是单例,因为函数实现的第一句是,if (gDefaultServiceManager != NULL) return gDefaultServiceManager; 里面有这样一句话,gDefaultServiceManager = interface_cast( ProcessState:self()-getContextObject(NULL); 这样演变,gDefaultServiceManager = interface_cast(new BpBinder(0); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - -

14、- - - - - - - - 名师精心整理 - - - - - - - 第 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-queryLoca

15、lInterface( 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

16、 = 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 String

17、16& 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); 名师资料总结 - - -精品资料欢迎下

18、载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 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)

19、 : 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. 所以

20、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)

21、 、对返回的fd 进行 mmap 映射,使内核 Binder 驱动分配一块内存接受数据,地址起始地址由成员变量mVMStart保存;(3) 、由于具有唯一性,只会创建一次,因此一个设备直打开设备/dev/binder 一次,一旦打开,全局有效(因为使用全变变量gProcess保存的),后续直接使用即可。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 7 页 - - - - - - - - - 6 8、IPCThreadState.h IPCThreadState.cpp

22、定义类 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* s

23、t = (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_un

24、lock(&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

25、_create(&gTLS, threadDestructor) != 0) 进行创建,然后跳到restart 处,将其放回。IPCThreadState:IPCThreadState() : mProcess(ProcessState:self(), mMyThreadId(androidGetTid(), mStrictModePolicy(0), mLastTransactionBinderFlags(0) 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 6 页,共 7 页 -

26、 - - - - - - - - 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 页 - - - - - - - - -

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 高考资料

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

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