Binder基本概念流程学习.docx

上传人:b****8 文档编号:9216976 上传时间:2023-05-17 格式:DOCX 页数:34 大小:270.13KB
下载 相关 举报
Binder基本概念流程学习.docx_第1页
第1页 / 共34页
Binder基本概念流程学习.docx_第2页
第2页 / 共34页
Binder基本概念流程学习.docx_第3页
第3页 / 共34页
Binder基本概念流程学习.docx_第4页
第4页 / 共34页
Binder基本概念流程学习.docx_第5页
第5页 / 共34页
Binder基本概念流程学习.docx_第6页
第6页 / 共34页
Binder基本概念流程学习.docx_第7页
第7页 / 共34页
Binder基本概念流程学习.docx_第8页
第8页 / 共34页
Binder基本概念流程学习.docx_第9页
第9页 / 共34页
Binder基本概念流程学习.docx_第10页
第10页 / 共34页
Binder基本概念流程学习.docx_第11页
第11页 / 共34页
Binder基本概念流程学习.docx_第12页
第12页 / 共34页
Binder基本概念流程学习.docx_第13页
第13页 / 共34页
Binder基本概念流程学习.docx_第14页
第14页 / 共34页
Binder基本概念流程学习.docx_第15页
第15页 / 共34页
Binder基本概念流程学习.docx_第16页
第16页 / 共34页
Binder基本概念流程学习.docx_第17页
第17页 / 共34页
Binder基本概念流程学习.docx_第18页
第18页 / 共34页
Binder基本概念流程学习.docx_第19页
第19页 / 共34页
Binder基本概念流程学习.docx_第20页
第20页 / 共34页
亲,该文档总共34页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

Binder基本概念流程学习.docx

《Binder基本概念流程学习.docx》由会员分享,可在线阅读,更多相关《Binder基本概念流程学习.docx(34页珍藏版)》请在冰点文库上搜索。

Binder基本概念流程学习.docx

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

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 考试认证 > 财会金融考试

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2