美文网首页
Android 基础学习(4) ---- Binder 原理进阶

Android 基础学习(4) ---- Binder 原理进阶

作者: 特立独行的佩奇 | 来源:发表于2022-12-04 17:25 被阅读0次
    IPCThreadState对象

    在Binder Client 端的发送数据流程中,最终是调用到 remote()->transact( )函数,remote() 函数返回的是 BpBinder 对象,所以本质上调用的是 BpBinder 的transact( )函数;

    status_t BpBinder::transact(
        uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
    {
        // Once a binder has died, it will never come back to life.
        if (mAlive) {
            status_t status = IPCThreadState::self()->transact(
                mHandle, code, data, reply, flags);
            if (status == DEAD_OBJECT) mAlive = 0;
            return status;
        }
    

    IPCThreadState 使用的是单例模式,是用于和Binder 驱动交互的类,IPCThreadState 有一个重要成员 ProcessState,也是使用单例模式实现;

    ProcessState对象

    IPCThreadState 有一个成员变量mProcess,类型就是ProcessState,ProcessState 有两个重要成员:mDriverFD和mHandleToObject

    • mDriverFD 保存的是应用程序 open 的 /dev/binder 的fd,因为ProcessState 是单例模式实现的,所以 binder 设备节点也只会被打开一次;
    ProcessState::ProcessState(const char *driver)
        : mDriverName(String8(driver))
        , mDriverFD(open_driver(driver))
        , mVMStart(MAP_FAILED)
        , mThreadCountLock(PTHREAD_MUTEX_INITIALIZER)
        , mThreadCountDecrement(PTHREAD_COND_INITIALIZER)
        , mExecutingThreadsCount(0)
        , mMaxThreads(DEFAULT_MAX_BINDER_THREADS)
        , mStarvationStartTimeMs(0)
        , mManagesContexts(false)
        , mBinderContextCheckFunc(NULL)
        , mBinderContextUserData(NULL)
        , mThreadPoolStarted(false)
        , mThreadPoolSeq(1)
    
    • mHandleToObject 是一个Vector 类型
    Vector<handle_entry>mHandleToObject;
    struct handle_entry {
        IBinder* binder;
        RefBase::weakref_type* refs;
    };
    

    Vector中的每个元素都保存了两个变量:Server的句柄,以及Server对应的BpBinder对象;实际上Server的句柄是Server在Binder驱动中的Binder引用的描述;句柄0是ServiceManager的句,其中的binder域,记录的就是BpBinder对象;

    BpBinder 的构造流程

    Binder Client 端获取 BpBinder for MyService 的流程如下:


    image.png

    BpBinder 的构造函数如下,最关键的信息是传入的 handle 值

    BpBinder::BpBinder(int32_t handle, int32_t trackedUid)
        : mHandle(handle)
        , mAlive(1)
        , mObitsSent(0)
        , mObituaries(NULL)
        , mTrackedUid(trackedUid)
    {
        ALOGV("Creating BpBinder %p handle %d\n", this, mHandle);
    
        extendObjectLifetime(OBJECT_LIFETIME_WEAK);
        IPCThreadState::self()->incWeakHandle(handle, this);
    }
    
    • ServiceManager 类似于Binder 体系中的服务器,它也是使用Binder 实现的,defaultServiceManager 函数可以直接返回
      对象 BpServiceManager,这样就可以直接使用ServiceManager 服务提供的接口;
    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) 同样调用到了上图中的 getStrongProxyForHandle 函数,但是这里没有查询相应的 handle 值,Binder 框架规定,ServiceManager 的 BpBinder 的handle 值为 0;

    sp<IBinder> ProcessState::getContextObject(const sp<IBinder>& /*caller*/)
    {
        return getStrongProxyForHandle(0);
    }
    
    • ServiceManager 的getService 函数,输入参数是 注册到ServiceManager 的Service名称,输出是对应Service 的BpBinder对象,getService 会调用到内部的 checkService函数,在 reply.readStrongBinder() 中获取BpBinder 对象
        virtual sp<IBinder> checkService( const String16& name) const
        {
            Parcel data, reply;
            data.writeInterfaceToken(IServiceManager::getInterfaceDescriptor());
            data.writeString16(name);
            remote()->transact(CHECK_SERVICE_TRANSACTION, data, &reply);
            return reply.readStrongBinder();
        }
    

    相关文章

      网友评论

          本文标题:Android 基础学习(4) ---- Binder 原理进阶

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