导航号,我的单页导航
文章目录

前言

interface_castAndroid Framework中很常见,虽然记得住,但也容易忘记,因此记录一下,方便自己查阅。

正文

这里以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对象。

参考文章

  1. interface_cast 的使用举例

  2. Binder系列5—注册服务(addService)

© 版权声明
导航号,我的单页导航

暂无评论

暂无评论...