美文网首页
Android进程间通信(五)——Native层获取servic

Android进程间通信(五)——Native层获取servic

作者: Boahui | 来源:发表于2021-07-13 08:37 被阅读0次

    Android进程间通信(四)——系统服务注册到servicemanager源码分析中包含了ServerManager服务获取servicemanager并注册系统服务的流程。这个流程中包含了Java层获取servicemanager服务的流程,常见的还有native层获取servicemanager,与Java层有所不同,本篇文章着重介绍native层获取servicemanager的流程。native层获取servicemanager的方法为IServiceManager.cpp的defaultServiceManager方法,源码github地址

    sp<IServiceManager> defaultServiceManager()
    {
        if (gDefaultServiceManager != NULL) return gDefaultServiceManager;
        
        {
            AutoMutex _l(gDefaultServiceManagerLock);
            while (gDefaultServiceManager == NULL) {
                gDefaultServiceManager = interface_cast<IServiceManager>(
                    ProcessState::self()->getContextObject(NULL));
                if (gDefaultServiceManager == NULL)
                    sleep(1);
            }
        }
        
        return gDefaultServiceManager;
    }
    

    ProcessState::self()->getContextObject(NULL)这个之前我们已经介绍过,返回的是一个BpBinder(0),注意这个方法是个单例,用while循环是防止servicemanager还没有注册完成。
    1.ProcessState::self()->getContextObject(NULL)

    • ProcessState::self()
      a.打开binder驱动
      b.设置最大线程数15
      c.mmap设置共享内存

    2.getContextObject

    • 创建一个BpBinder对象

    3.interface_cast<IServiceManager>

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

    IServiceManager替换INTERFACE,也就是调用IServiceManager.asInterface,但我们在IServiceManager中式找不到这个方法的,其实这个asInterface式通过define定义的,实际我们就是把IServiceManager替换宏定义中的INTERFACE

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

    带入展开后,其实这个只是声明,类似Java中的接口

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

    实现代码为

     const android::String16 IServiceManager::descriptor(NAME);             \
        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::~IServiceManagerE() { }                                   \
    

    所以 asInterface 的返回为 new BpServiceManager(BpBinder(0))

    class BpServiceManager : public BpInterface<IServiceManager>
    {
    public:
        BpServiceManager(const sp<IBinder>& impl)
            : BpInterface<IServiceManager>(impl)
        {
        }
        virtual status_t addService(const String16& name, const sp<IBinder>& service,
                bool allowIsolated)
        {
            Parcel data, reply;
            data.writeInterfaceToken(IServiceManager::getInterfaceDescriptor());
            data.writeString16(name);
            data.writeStrongBinder(service);
            data.writeInt32(allowIsolated ? 1 : 0);
            status_t err = remote()->transact(ADD_SERVICE_TRANSACTION, data, &reply);//实际还是会调用BpBinder
            return err == NO_ERROR ? reply.readExceptionCode() : err;
        }
    ......
    

    总结:Nativce层和Java层作为客户端获取servicemanager流程有所不同,但最终都是对BpBinder的封装


    相关文章

      网友评论

          本文标题:Android进程间通信(五)——Native层获取servic

          本文链接:https://www.haomeiwen.com/subject/afddpltx.html