美文网首页
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