2022年Android系统进程间通信Binder机制在低层的C++接口源代码文件 .pdf
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_05.gif)
《2022年Android系统进程间通信Binder机制在低层的C++接口源代码文件 .pdf》由会员分享,可在线阅读,更多相关《2022年Android系统进程间通信Binder机制在低层的C++接口源代码文件 .pdf(7页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
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); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - -
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 2022年Android系统进程间通信Binder机制在低层的C+接口源代码文件 2022 Android 系统 进程 通信 Binder 机制 低层 C+ 接口 源代码 文件
![提示](https://www.taowenge.com/images/bang_tan.gif)
限制150内