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();
}
网友评论