Bootstrap

Android framework interface_cast 模板方法分析

当我们在阅读android 源码时 经常回看到 defaultServiceManager() 这一个方法里面有 interface_cast<IServiceManager>

咋一看时很懵很复杂,其实复杂的东西慢慢剖析也就会变得很明了。我们先看 interface_cast<> 模板方法的源码

template<typename INTERFACE>
inline sp<INTERFACE> interface_cast(const sp<IBinder>& obj)
{
    return INTERFACE::asInterface(obj);
}

当我们传入一个 IServiceManager 时,该方法变为:

//template<typename INTERFACE>
 

inline sp<IServiceManager> interface_cast(const sp<IBinder>& obj)  {

// 此时obj ProcessState::self()->getContextObject(NULL) 此方法最终返回一个 sp<IBinder> 对象


    return IServiceManager::asInterface(obj);
}

我们发现interface_cast 返回的是一个 IServiceManager::asInterface(obj);

我们查看ServiceManager 这一个类找 asInterface 这一方法。

class IServiceManager : public IInterface
{
public:
    DECLARE_META_INTERFACE(ServiceManager);

    /**
     * Retrieve an existing service, blocking for a few seconds
     * if it doesn't yet exist.
     */
    virtual sp<IBinder>         getService( const String16& name) const = 0;

    /**
     * Retrieve an existing service, non-blocking.
     */
    virtual sp<IBinder>         checkService( const String16& name) const = 0;

    /**
     * Register a service.
     */
    virtual status_t            addService( const String16& name,
                                            const sp<IBinder>& service,
                                            bool allowIsolated = false) = 0;

    /**
     * Return list of all existing services.
     */
    virtual Vector<String16>    listServices() = 0;

    enum {
        GET_SERVICE_TRANSACTION = IBinder::FIRST_CALL_TRANSACTION,
        CHECK_SERVICE_TRANSACTION,
        ADD_SERVICE_TRANSACTION,
        LIST_SERVICES_TRANSACTION,
    };
};

很奇怪我们在这个类和他的父类里面都没有找到 asInterface 这一个方法:但是我们发下这个类里面有一个很值的地方,这里面有一个宏定义  DECLARE_META_INTERFACE(ServiceManager); 

我们继续剖析 这个宏定义 在我们的 IInterface.h 头文件里面 其声明如下:

#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();                                            \ 

我们将 ServiceManager 带进去 此时这个宏定义变成如下:

#define DECLARE_META_INTERFACE(ServiceManager)                               \
    static const android::String16 descriptor;                          \
    static android::sp<IServiceManager> asInterface(                       \
            const android::sp<android::IBinder>& obj);                  \
    virtual const android::String16& getInterfaceDescriptor() const;    \
    IServiceManager();                                                     \
    virtual ~IServiceManager();

原来这个宏帮我们声明了那么多方法    asInterface 方法就在这里  我们把它带入到  IServiceManager 类声明里面

class IServiceManager : public IInterface
{
public:
        static const android::String16 descriptor;                          
        static android::sp<IServiceManager> asInterface( const android::sp<android::IBinder>& obj);                  
        virtual const android::String16& getInterfaceDescriptor() const;    
        IServiceManager();                                                     
        virtual ~IServiceManager();

    /**
     * Retrieve an existing service, blocking for a few seconds
     * if it doesn't yet exist.
     */
    virtual sp<IBinder>         getService( const String16& name) const = 0;

    /**
     * Retrieve an existing service, non-blocking.
     */
    virtual sp<IBinder>         checkService( const String16& name) const = 0;

    /**
     * Register a service.
     */
    virtual status_t            addService( const String16& name,
                                            const sp<IBinder>& service,
                                            bool allowIsolated = false) = 0;

    /**
     * Return list of all existing services.
     */
    virtual Vector<String16>    listServices() = 0;

    enum {
        GET_SERVICE_TRANSACTION = IBinder::FIRST_CALL_TRANSACTION,
        CHECK_SERVICE_TRANSACTION,
        ADD_SERVICE_TRANSACTION,
        LIST_SERVICES_TRANSACTION,
    };
};

当时目前我们只找到了 asInterface 的定义 并没有找到 他的声明,但是我们主要到这

#define DECLARE_META_INTERFACE(ServiceManager) 宏定义下面还有一个宏 

#define IMPLEMENT_META_INTERFACE(INTERFACE, NAME)                       \
    const android::String16 I##INTERFACE::descriptor(NAME);             \
    const android::String16&                                            \
            I##INTERFACE::getInterfaceDescriptor() const {              \
        return I##INTERFACE::descriptor;                                \
    }                                                                   \
    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;                                                    \
    }                                                                   \
    I##INTERFACE::I##INTERFACE() { }                                    \
    I##INTERFACE::~I##INTERFACE() { }                                   \

这宏定义就定义了我们的 asInterface 方法  我们发现这个宏原来是在 IServiceManager.cpp 里面使用的

IMPLEMENT_META_INTERFACE(ServiceManager, "android.os.IServiceManager");

将其展开则为 

    const android::String16 IServiceManager::descriptor("android.os.IServiceManager");             
    const android::String16&  IServiceManager::getInterfaceDescriptor() const {              
        return IServiceManager::descriptor;                                
    }                                                                   
    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;                                                    
    }                                                                   
    IServiceManager::IServiceManager() { }                                    
    IServiceManager::~IServiceManager { }

到此我们终于找到了 asInterface 的庐山真面了

 

;