Android系统进程间通信Binder机制在低层的C++接口源代码文件分析

-----------------------------------------重点在BpServiceManager和BpBinder(0)-------------------------------------

1、

RefBase.cpp

RefBase.h

定义了如下几个类:

一、class

RefBase{}

定义了所有类的基类,他应该是一个普遍基类,并不是一个抽象类。

二、

template

class sp{}

模板智能指针sp,是binder系统中最常用的类型,用来执行具体的类型变量,

类内使用

T*m_ptr;

存储指向类型对象的指针。

使用

inlineT*get() const{ return m_ptr; }

get函数获取指向的对象。

三、

template

class wp{}

2、

IBinder.h

Binder.cpp

只实现一个类,

class IBinder : public virtual RefBase{}

注意继承自RefBase,并且指定为虚基类,防止“二义性”。

这是Binder最重要的一个低层类,上层所有Binder类型都是继承自它。

他是一个抽象类,除了几个重要虚函数外,其他的都是纯虚函数。

几个重要的虚函数如下所示,

spIBinder::queryLocalInterface(const String16&descriptor)----后续可以用来查询派生类的IInterface

BBinder* IBinder::localBinder()----返回一个本地的Binder对象--BBinder

BpBinder* IBinder::remoteBinder()----返回一个代理的Binder对象--BpBinder

bool IBinder::checkSubclass(const void*

/*subclassID*/) const----检查派生类

3、

Binder.h

Binder.cpp

实现两个类,如下所示:

一、class

BBinder : public IBinder{}

这个类public继承自IBinder,用来实现Binder的本地对象。注意它在private部分声明了

BBinder&operator=(const BBinder& o);

说明这个类对象不能使用operator=进行赋值操作,即对operator=放到了private区,进行了隐藏。

另外,此类对其基类IBinder的所有纯虚函数进行了实现,因此此类可以创建对象,不是一个抽线类。

二、class

BpRefBase : public virtual RefBase{}

这个类应该是最深基类RefBase的一个“代理”,它也是一个“虚基类”,防止后续派生类产生“二义性”

因为是代理,它有一个重要的private成员,

IBinder* constmRemote;

IBinder指针,指向远程的IBinder对象。

使用函数,

inlineIBinder*remote(){ return mRemote; }

来获取。

另外,在private区,有如下定义,

BpRefBase&operator=(const BpRefBase&o);

对operator=进行了隐藏,说明此类对象不支持赋值操作。

private区还有一个变量,

RefBase::weakref_type*mRefs;

目前不知道做什么用的。

4、

BpBinder.h

BpBinder.cpp

class BpBinder : public IBinder{}

这个类是一个重要的类,用它来实现和其他service的交互。public继承自IBinder,用来实现Binder的代理对象。

定义了一个重要的函数,

virtual BpBinder*remoteBinder();

用来返回它自身。

注意函数defaultServiceManager中,

sp b =

ProcessState::self()->getContextObject(NULL);

相当于,

sp b = new BpBinder(0);

注意此类中的成员变量mHandle保存有Binder设备ID,永远为0。

5、

IInterface.h

IInterface.cpp

主要实现如下几个类:

一、class

IInterface : public virtual RefBase{}

所有类的一个公共接口,他是一个抽象类,只能用作继承。注意它使用了virtual继承RefBase,因此它成为“虚基类”,防止后续类再继承它时产生“二义性”。

此类注意onAsBinder是一个纯虚函数,后续的派生类都需要有一个实现,他的返回值为IBinder。

二、template

INTERFACE>

class BnInterface : public INTERFACE,

public BBinder

模板类BnInterface,除了继承模板指定的类外,还继承了BBinder。

有三个重要的虚基类,

virtual spqueryLocalInterface(const String16&_descriptor);

virtual const String16&getInterfaceDescriptor() const;

virtual IBinder*onAsBinder();

其中onAsBinder继承了基类IInterface的纯虚函数。

三、template

INTERFACE>

class BpInterface : public INTERFACE,

public BpRefBase

模板类BpInterface,除了继承模板指定的类外,还继承了代理类BpRefBase。

BpInterface是BnInterface的代理,声明一个重要函数

virtual IBinder*onAsBinder();

6、

IServiceManager.h

IServiceManager.cpp

主要实现如下几个类:

一、

class IServiceManager : public IInterface{}

继承自抽象类IInterface,自身也是抽象类,定义了如下几个纯虚函数:

virtual spgetService( const String16& name)const = 0;

virtual spcheckService( const String16&name) const = 0;

virtual status_taddService( const String16&name,

const sp& service) = 0;

virtual VectorlistServices() = 0;

二、class

BnServiceManager : public BnInterface

展开就是classBnServiceManager :publicIServiceManager, public BBinder

即继承了IServiceManager和BBinder,他是ServiceManager的一个本地对象。

声明一个重要的虚汗数

virtual status_tonTransact(uint32_t code,

const Parcel& data,

Parcel*reply,

uint32_tflags = 0);

用来对消息进行分发。

三、class

BpServiceManager : public BpInterface

展开就class

BpServiceManager : public IServiceManager, public BpRefBase

即继承了IServiceManager和BpRefBase,他是ServiceManager的一个代理对象。

此代理对象对所有的消息进行处理

四、

这个文件中注意一个重要的全局函数,

sp

defaultServiceManager()

用来创建一个全局的IServiceManager对象,

sp

gDefaultServiceManager;

这个函数也创建的是单例,因为函数实现的第一句是,

if (gDefaultServiceManager != NULL) return

gDefaultServiceManager;

里面有这样一句话,

gDefaultServiceManager = interface_cast(

ProcessState::self()->getContextObject(NULL));

这样演变,

gDefaultServiceManager = interface_cast(newBpBinder(0));

gDefaultServiceManager = IServiceManager::asInterface(new BpBinder(0));

看下IServiceManager::asInterface的定义:

android::sp I##INTERFACE::asInterface(\

const android::sp& obj)\

{\

android::sp intr;\

if (obj != NULL) {\

intr =static_cast(\

obj->queryLocalInterface(\

I##INTERFACE::descriptor).get());\

if (intr == NULL) {\

intr = newBp##INTERFACE(obj);\

}\

}\

return intr;\

}\

android::sp IServiceManager::asInterface(constandroid::sp& obj)

{

android::sp intr;

if (obj != NULL) {

intr = static_cast(

obj->queryLocalInterface(IServiceManager::descriptor).get());

if (intr == NULL) {

intr = new BpServiceManager(obj);

}

}

return intr;

}

因为new BpBinder(0)不为空,所以执行

static_cast(

obj->queryLocalInterface(IServiceManager::descriptor).get());

执行(new

BpBinder(0))的queryLocalInterface方法,BpBinder没有重定义此虚函数,它继承自IBinder,IBinder已经实现,将调用基类IBinder的此函数,可以看到,

spIBinder::queryLocalInterface(constString16& descriptor)

{

return NULL;

}

返回NULL,因此它将执行

intr = new BpServiceManager(obj);

intr = new BpServiceManager(new

BpBinder(0));

因此函数defaultServiceManager,最终返回new BpServiceManager(new

BpBinder(0))给gDefaultServiceManager。

gDefaultServiceManager = new

BpServiceManager(new BpBinder(0));

五、

通过BpServiceManager的构造函数

BpServiceManager(const sp& impl)

: BpInterface(impl)

{

}

可以看到new

BpBinder(0)传给BpInterface(new

BpBinder(0)),在调用BpInterface的构造函数,

template

inline

BpInterface::BpInterface(const sp& remote)

:BpRefBase(remote)

{

}

继续传给基类BpRefBase的构造函数,

BpRefBase::BpRefBase(const

sp& o)

:mRemote(o.get()), mRefs(NULL), mState(0)

{

extendObjectLifetime(OBJECT_LIFETIME_WEAK);

if (mRemote) {

mRemote->incStrong(this);// Removed on first IncStrong().

mRefs = mRemote->createWeak(this);// Held for our entire lifetime.

}

}

所以

new BpBinder(0)

最终是保存在了BpRefBase中的

IBinder* constmRemote;

成员变量中。

7、

ProcessState.h

ProcessState.cpp

class ProcessState : public virtual

RefBase{}

此文件定义类对象

gProcess = new ProcessState

,他是一个单例模式,每个进程只会有一个,可以通过函数声明

staticspself();

它是static的确定。

ProcessState的主要作用:

(1)、打开/dev/binder,建立与内核Binder驱动交互的通道;

(2)、对返回的fd进行mmap映射,使内核Binder驱动分配一块内存接受数据,地址起始地址由成员变量mVMStart保存;

(3)、由于具有唯一性,只会创建一次,因此一个设备直打开设备/dev/binder一次,一旦打开,全局有效(因为使用全变变量gProcess保存的),后续直接使用即可。

8、

IPCThreadState.h

IPCThreadState.cpp

定义类class

IPCThreadState{}

此类用来创建一个线程在和Binder交互工作中使用的数据IPCThreadState对象。

每个线程都有一个IPCThreadState,每个IPCThreadState都有一个mIn,一个mOut,mIn用来接收来自Binder设备的数据,而mOut用来存储发往Binder设备数据的。

一、静态取自身函数和构造函数

IPCThreadState* IPCThreadState::self()

{

if (gHaveTLS) {

restart:

const pthread_key_t k = gTLS;

IPCThreadState* st = (IPCThreadState*)pthread_getspecific(k);

if (st) return st;

return new IPCThreadState;

}

if (gShutdown) return NULL;

pthread_mutex_lock(&gTLSMutex);

if (!gHaveTLS) {

if (pthread_key_create(&gTLS, threadDestructor) != 0) {

pthread_mutex_unlock(&gTLSMutex);

return NULL;

}

gHaveTLS = true;

}

pthread_mutex_unlock(&gTLSMutex);

goto restart;

}

其中

static pthread_key_t gTLS = 0;

用来表示线程本地存储空间(Thread

Local Storage)的ID,如果它存在表示IPCThreadState(代表线程本地存储空间)已经创建,使用

IPCThreadState* st =

(IPCThreadState*)pthread_getspecific(k)将其取出,然后返回它的值。

如果为空,使用return

new IPCThreadState;创建一个。

如果gHaveTLS不存在,代表线程本地存储空间未建立,用

(pthread_key_create(&gTLS,

threadDestructor) != 0)

进行创建,然后跳到restart处,将其放回。

IPCThreadState::IPCThreadState()

:mProcess(ProcessState::self()),

mMyThreadId(androidGetTid()),

mStrictModePolicy(0),

mLastTransactionBinderFlags(0)

{

pthread_setspecific(gTLS,this);

clearCaller();

mIn.setDataCapacity(256);

mOut.setDataCapacity(256);

}

注意其中的函数调用

pthread_setspecific(gTLS, this);

将gTLS和对象IPCThreadState联系到一起。

另外,初始化列表中有mProcess(ProcessState::self()),说明使用mProcess将本进程进行了保存。

你可能感兴趣的:(Android系统进程间通信Binder机制在低层的C++接口源代码文件分析)