Binder基本概念流程学习.docx
《Binder基本概念流程学习.docx》由会员分享,可在线阅读,更多相关《Binder基本概念流程学习.docx(34页珍藏版)》请在冰点文库上搜索。
Binder基本概念流程学习
Binder基本概念流程学习
一MediaService进程启动
Init.rc中描述的service对应linux的进程:
Media进程定义:
servicemedia/system/bin/mediaserver
classmain
usermedia
groupaudiocamerainetnet_btnet_bt_adminnet_bw_acctdrmrpc
iopriort4
servicemanager进程定义:
serviceservicemanager/system/bin/servicemanager
classcore
usersystem
groupsystem
Media中有很多NativeService(AudioFlingerMediaPlayerServiceCameraService
AudioPolicyService等),整个Android(native或者framework)的Service都需要加入
servicemanager中进行统一管理。
那么MediaProcess与ServiceManagerProcess是如何进行通信的呢——Binder.
通过MediaProcess中使用binder进行完成IPC过程,学习Binder的概念和使用方法。
\frameworks\av\media\mediaserver\main_mediaserver.cpp:
intmain(intargc,char**argv)
{
//创建ProcessState当前进程属性
spproc(ProcessState:
:
self());
//IServiceManager对象
spsm=defaultServiceManager();
//初始化MediaPlayerService服务对象
MediaPlayerService:
:
instantiate();
……
//启动进程的线程池
ProcessState:
:
self()->startThreadPool();
//执行线程消息循环
IPCThreadState:
:
self()->joinThreadPool();
}
Sp:
指针运算符和普通运算符的重载StrongPointer。
二MediaProcess执行过程
1ProcessState对象创建
当前进程的状态属性,对象创建:
spProcessState:
:
self()
{
Mutex:
:
Autolock_l(gProcessMutex);
if(gProcess!
=NULL){
returngProcess;
}
gProcess=newProcessState;
returngProcess;
}
ProcessState构造函数:
ProcessState:
:
ProcessState()
:
mDriverFD(open_driver())//打开binder驱动设备
mVMStart(MAP_FAILED)
mManagesContexts(false)
mBinderContextCheckFunc(NULL)
mBinderContextUserData(NULL)
mThreadPoolStarted(false)
mThreadPoolSeq
(1)
{
if(mDriverFD>=0){
//将binder的fd映射到当前进程虚拟空间地址中与binder进行交互
mVMStart=mmap(0,BINDER_VM_SIZE,PROT_READ,
MAP_PRIVATE|MAP_NORESERVE,mDriverFD,0);
}
}
打开binder设备:
staticintopen_driver()
{
//打开binder设备驱动
intfd=open("/dev/binder",O_RDWR);
if(fd>=0){
//bidner最大支持线程数
size_tmaxThreads=15;
result=ioctl(fd,BINDER_SET_MAX_THREADS,&maxThreads);
}
returnfd;
}
ProcessState对象创建过程所做的事:
打开/dev/binder设备,得到binder设备的fd;
将bidner设备fd映射到当前进程虚拟地址空间建立交互的通道;
2IServiceManager对象创建
spsm=defaultServiceManager();
为什么需要一个IServiceManager对象呢,这个类是个抽象提供接口
classIServiceManager:
publicIInterface
{
virtualspgetService(constString16&name)const=0;
virtualstatus_taddService(constString16&name,
constsp&service,
boolallowIsolated=false)=0;
……
};
通过IServiceManager派生对象操作将Service加入到ServiceManager中.
defaultServiceManager()函数:
spdefaultServiceManager()
{
//单例对象
if(gDefaultServiceManager!
=NULL)
returngDefaultServiceManager;
AutoMutex_l(gDefaultServiceManagerLock);
if(gDefaultServiceManager==NULL){
//创建对象
gDefaultServiceManager=interface_cast(
ProcessState:
:
self()->getContextObject(NULL));
}
returngDefaultServiceManager;
}
ProcessState:
:
self()->getContextObject(NULL):
得到一个IBinder对象
ProcessState:
:
self()刚才所创建的ProcessState对象。
spProcessState:
:
getContextObject(constsp&caller)
{
returngetStrongProxyForHandle(0);
}
spProcessState:
:
getStrongProxyForHandle(int32_thandle)
{
spresult;
AutoMutex_l(mLock);
//从表中查询一个handle对应的handle_entry
//若没有则创建一个handle==0
handle_entry*e=lookupHandleLocked(handle);
if(e!
=NULL){
IBinder*b=e->binder;
if(b==NULL||!
e->refs->attemptIncWeak(this)){
//handle_entry对象成员初始化创建handle=0的BpBinder
b=newBpBinder(handle);
e->binder=b;
if(b)e->refs=b->getWeakRefs();
result=b;
}
}
returnresult;
}
handle_entry是什么呢?
structhandle_entry{
IBinder*binder;
RefBase:
:
weakref_type*refs;
};
也就是说ProcessState有一个表VectormHandleToObject;
表里面的每一项存储了一个binder,每一个binder对应一个handle。
Handle=0是什么,句柄?
代表谁的句柄——ServiceManager在binder中的资源。
从ProcessState:
:
self()->getContextObject(NULL)得到一个IBinder——BpBinder(0);
于是得到:
gDefaultServiceManager=interface_cast(BpBinder(0));
使用interface_cast将IBinder实例转化成IServiceManager实例。
3interface_cast函数
\frameworks\native\include\binder\IInterface.h:
interface_cast是个内联模板函数:
template
inlinespinterface_cast(constsp&obj)
{
returnINTERFACE:
:
asInterface(obj);
}
结合前面就是:
inlinespinterface_cast(constsp&obj)
{
returnIServiceManager:
:
asInterface(obj);
}
所以需要到IServiceManager里面去看看是如何实现的
4IServiceManager类
\frameworks\native\include\binder\IServiceManager.h:
IServiceManager是一个抽象类:
classIServiceManager:
publicIInterface
{
public:
//宏声明
DECLARE_META_INTERFACE(ServiceManager);
virtualspgetService(constString16&name)const=0;
virtualstatus_taddService(constString16&name,
constsp&service,
boolallowIsolated=false)=0;
……
}
DECLARE_META_INTERFACE声明:
#defineDECLARE_META_INTERFACE(INTERFACE)\
staticconstandroid:
:
String16descriptor;\
staticandroid:
:
spasInterface(\
constandroid:
:
sp:
IBinder>&obj);\
virtualconstandroid:
:
String16&getInterfaceDescriptor()const;\
I##INTERFACE();\
virtual~I##INTERFACE();\
替换成IServiceManager:
//实现时传入:
android.os.IServiceManager
staticconstandroid:
:
String16descriptor;
staticandroid:
:
spasInterface(
constandroid:
:
sp:
IBinder>&obj);
virtualconstandroid:
:
String16&getInterfaceDescriptor()const;
//构造析构函数
IServiceManager();
virtual~IServiceManager();
实现\frameworks\native\include\binder\IServiceManager.cpp:
IMPLEMENT_META_INTERFACE(ServiceManager,"android.os.IServiceManager");
IMPLEMENT_META_INTERFACE实现:
看一下asInterface接口:
#defineIMPLEMENT_META_INTERFACE(INTERFACE,NAME)\
android:
:
spI##INTERFACE:
:
asInterface(\
constandroid:
:
sp:
IBinder>&obj)\
{\
android:
:
spintr;\
if(obj!
=NULL){\
intr=static_cast(\
obj->queryLocalInterface(\
I##INTERFACE:
:
descriptor).get());\
if(intr==NULL){\
intr=newBp##INTERFACE(obj);\
}\
}\
returnintr;\
} \
替换成IServiceManager:
android:
:
spIServiceManager:
:
asInterface(
constandroid:
:
sp:
IBinder>&obj)
{
//objBpBinder实例
android:
:
spintr;
if(obj!
=NULL){
//返回NULL
intr=static_cast(
obj->queryLocalInterface(
IServiceManager:
:
descriptor).get());
if(intr==NULL){
intr=newBpServiceManager(obj);
}
}
returnintr;
}
这里得到IServiceManager实例:
BpServiceManager:
newBpServiceManager(newBpBinder(0));
5BpServiceManager和BpInterface类
\frameworks\native\libs\binder\IServiceManager.cpp:
BpServiceManager
classBpServiceManager:
publicBpInterface
{
public:
//impl就是newBpBinder(0)
BpServiceManager(constsp&impl)
:
BpInterface(impl)
{
}
virtualspcheckService(constString16&name)const
{
……
remote()->transact(CHECK_SERVICE_TRANSACTION,data,&reply);
}
virtualstatus_taddService(constString16&name,constsp&service,
boolallowIsolated)
{
……
remote()->transact(ADD_SERVICE_TRANSACTION,data,&reply);
}
}
\frameworks\native\include\binder\IInterface.h:
模板类BpInterface
template
classBpInterface:
publicINTERFACE,publicBpRefBase//INTERFACEIServiceManager
{
public:
BpInterface(constsp&remote);
protected:
virtualIBinder*onAsBinder();
};
BpInterface构造函数:
template
inlineBpInterface:
:
BpInterface(constsp&remote)
:
BpRefBase(remote)
{
}
BpRefBase构造函数:
BpRefBase:
:
BpRefBase(constsp&o)
:
mRemote(o.get()),mRefs(NULL),mState(0)
{
//IBindermRemote指向o.get():
newBpBinder(0)
}
gDefaultServiceManager=interface_cast(BpBinder(0));
实际为:
gDefaultServiceManager=newBpServiceManager(newBpBinder(0));
Bn代表BinderNativeBp代表BinderProxy
BpServiceManager代理的BpBinder实例BpBinder代理的handle(0)
这个关系有些复杂,看一下类继承结构图:
上面这个结构看起来感觉很熟悉——Bridge模式。
将Binder数据交互和功能处理桥接起来。
在MediaProcess的main函数中通过:
spsm=defaultServiceManager();
我们得到了sm:
是BpServiceManager对象。
三MediaPlayerService加入到ServiceManager中
回到main函数中:
intmain(intargc,char**argv)
{
//创建ProcessState当前进程属性
spproc(ProcessState:
:
self());
//IServiceManager对象
spsm=defaultServiceManager();
//初始化MediaPlayerService服务对象
MediaPlayerService:
:
instantiate();//执行到这里
……
//启动进程的线程池
ProcessState:
:
self()->startThreadPool();
//执行线程消息循环
IPCThreadState:
:
self()->joinThreadPool();
}
1MediaPlayerService初始化过程
voidMediaPlayerService:
:
instantiate(){
//defaultServiceManager就是上面所述得到的BpServiceManager对象
defaultServiceManager()->addService(
String16("media.player"),newMediaPlayerService());
}
BpServiceManager添加Service:
virtualstatus_taddService(constString16&name,constsp&service,
boolallowIsolated)
{
//生成数据包Parcel
Parceldata,reply;
//WriteRPCheaders写入Interface名字得到“android.os.IServiceManager”
data.writeInterfaceToken(IServiceManager:
:
getInterfaceDescriptor());
//写入Service名字“media.player”
data.writeString16(name);
//写入服务
data.writeStrongBinder(service);
data.writeInt32(allowIsolated?
1:
0);
//remote()返回BpBinder对象
status_terr=remote()->transact(ADD_SERVICE_TRANSACTION,data,&reply);
returnerr==NO_ERROR?
reply.readExceptionCode():
err;
}
remote()->transact到BpBinder中:
status_tBpBinder:
:
transact(uint32_tcode,constParcel&data,Parcel*reply,uint32_tflags)
{
if(mAlive){
//到当前进程IPCThreadState中mHandle=0
status_tstatus=IPCThreadState:
:
self()->transact(
mHandle,code,data,reply,flags);
if(status==DEAD_OBJECT)mAlive=0;
returnstatus;
}
returnDEAD_OBJECT;
}
2IPCThreadState中写入数据到Binder设备过程
IPCThreadState:
:
self()->transact过程:
status_tIPCThreadState:
:
transact(int32_thandle,
uint32_tcode,constParcel&data,
Parcel*reply,uint32_tflags)
{
status_terr=d