前言
interface_cast在AndroidFramework中很常见,虽然记得住,但也容易忘记,因此记录一下,方便自己查阅。
正文
这里以IServiceManager.cpp为例。
IServiceManager.cpp
目录:\frameworks\native\libs\binder\IServiceManager.cpp
// IServiceManager.cpp //单例模式 sp<IServiceManager> defaultServiceManager() { if (gDefaultServiceManager != NULL) return gDefaultServiceManager; { AutoMutex _l(gDefaultServiceManagerLock); while (gDefaultServiceManager == NULL) { //1. gDefaultServiceManager是谁的对象? gDefaultServiceManager = interface_cast<IServiceManager>( ProcessState::self()->getContextObject(NULL)); if (gDefaultServiceManager == NULL) sleep(1); } } return gDefaultServiceManager; }
从上面interface_cast()转换后,gDefaultServiceManager是谁的对象?是不是很好奇!
gDefaultServiceManager是BpServiceManager的对象!
具体怎么来的,就需要知道interface_cast的作用。
引用的头文件
#include <binder/IInterface.h>
IInterface.h
目录:\frameworks\native\include\binder\IInterface.h
template<typename INTERFACE> inline sp<INTERFACE> interface_cast(const sp<IBinder>& obj) { return INTERFACE::asInterface(obj); }
模板类,继续看asInterface()
// ---------------------------------------------------------------------- //接口声明 #define DECLARE_META_INTERFACE(INTERFACE) \ static const ::android::String16 descriptor; \ static ::android::sp<I##INTERFACE> asInterface( \ const ::android::sp<::android::IBinder>& obj); \ virtual const ::android::String16& getInterfaceDescriptor() const; \ I##INTERFACE(); \ virtual ~I##INTERFACE(); \ //接口实现 #define IMPLEMENT_META_INTERFACE(INTERFACE, NAME) \ const ::android::String16 I##INTERFACE::descriptor(NAME); \ const ::android::String16& \ I##INTERFACE::getInterfaceDescriptor() const { \ return I##INTERFACE::descriptor; \ } \ //重点 start ::android::sp<I##INTERFACE> I##INTERFACE::asInterface( \ const ::android::sp<::android::IBinder>& obj) \ { \ ::android::sp<I##INTERFACE> intr; \ if (obj != NULL) { \ intr = static_cast<I##INTERFACE*>( \ obj->queryLocalInterface( \ I##INTERFACE::descriptor).get()); \ if (intr == NULL) { \ intr = new Bp##INTERFACE(obj); \ } \ } \ return intr; \ } \ //重点 end I##INTERFACE::I##INTERFACE() { } \ I##INTERFACE::~I##INTERFACE() { } \ #define CHECK_INTERFACE(interface, data, reply) \ if (!(data).checkInterface(this)) { return PERMISSION_DENIED; } \ // ----------------------------------------------------------------------
主要看接口实现部分。如果看明白了
interface_cast<IServiceManager>(ProcessState::self()->getContextObject(NULL));
就知道为啥返回的是BpServiceManager的对象!
翻译一下上面重点部分
PS: 把INTERFACE替换一下即可。
::android::sp<IServiceManager> IServiceManager::asInterface( const ::android::sp<::android::IBinder>& obj) { ::android::sp<IServiceManager> intr; if (obj != NULL) { intr = static_cast<IServiceManager*>( obj->queryLocalInterface( IServiceManager::descriptor).get()); if (intr == NULL) { intr = new BpServiceManager(obj); //看这里 } } return intr; }
从上面就是可以知道,gDefaultServiceManager就是BpServiceManager对象。
参考文章
《》
《
© 版权声明