Binder基本概念流程学习.docx
- 文档编号:23519759
- 上传时间:2023-05-17
- 格式:DOCX
- 页数:34
- 大小:270.13KB
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当前进程属性
sp
:
self());
//IServiceManager对象
sp
//初始化MediaPlayerService服务对象
MediaPlayerService:
:
instantiate();
……
//启动进程的线程池
ProcessState:
:
self()->startThreadPool();
//执行线程消息循环
IPCThreadState:
:
self()->joinThreadPool();
}
Sp:
指针运算符和普通运算符的重载StrongPointer。
二MediaProcess执行过程
1ProcessState对象创建
当前进程的状态属性,对象创建:
sp
:
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对象创建
sp
为什么需要一个IServiceManager对象呢,这个类是个抽象提供接口
classIServiceManager:
publicIInterface
{
virtualsp
virtualstatus_taddService(constString16&name,
constsp
boolallowIsolated=false)=0;
……
};
通过IServiceManager派生对象操作将Service加入到ServiceManager中.
defaultServiceManager()函数:
sp
{
//单例对象
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对象。
sp
:
getContextObject(constsp
{
returngetStrongProxyForHandle(0);
}
sp
:
getStrongProxyForHandle(int32_thandle)
{
sp
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有一个表Vector
表里面的每一项存储了一个binder,每一个binder对应一个handle。
Handle=0是什么,句柄?
代表谁的句柄——ServiceManager在binder中的资源。
从ProcessState:
:
self()->getContextObject(NULL)得到一个IBinder——BpBinder(0);
于是得到:
gDefaultServiceManager=interface_cast
使用interface_cast将IBinder实例转化成IServiceManager实例。
3interface_cast函数
\frameworks\native\include\binder\IInterface.h:
interface_cast是个内联模板函数:
template
inlinesp
{
returnINTERFACE:
:
asInterface(obj);
}
结合前面就是:
inlinesp
{
returnIServiceManager:
:
asInterface(obj);
}
所以需要到IServiceManager里面去看看是如何实现的
4IServiceManager类
\frameworks\native\include\binder\IServiceManager.h:
IServiceManager是一个抽象类:
classIServiceManager:
publicIInterface
{
public:
//宏声明
DECLARE_META_INTERFACE(ServiceManager);
virtualsp
virtualstatus_taddService(constString16&name,
constsp
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: : sp 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: : sp : asInterface( constandroid: : sp : IBinder>&obj) { //objBpBinder实例 android: : sp 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 : BpInterface { } virtualsp { …… remote()->transact(CHECK_SERVICE_TRANSACTION,data,&reply); } virtualstatus_taddService(constString16&name,constsp boolallowIsolated) { …… remote()->transact(ADD_SERVICE_TRANSACTION,data,&reply); } } \frameworks\native\include\binder\IInterface.h: 模板类BpInterface template classBpInterface: publicINTERFACE,publicBpRefBase//INTERFACEIServiceManager { public: BpInterface(constsp protected: virtualIBinder*onAsBinder(); }; BpInterface构造函数: template inlineBpInterface : BpInterface(constsp : BpRefBase(remote) { } BpRefBase构造函数: BpRefBase: : BpRefBase(constsp : mRemote(o.get()),mRefs(NULL),mState(0) { //IBindermRemote指向o.get(): newBpBinder(0) } gDefaultServiceManager=interface_cast 实际为: gDefaultServiceManager=newBpServiceManager(newBpBinder(0)); Bn代表BinderNativeBp代表BinderProxy BpServiceManager代理的BpBinder实例BpBinder代理的handle(0) 这个关系有些复杂,看一下类继承结构图: 上面这个结构看起来感觉很熟悉——Bridge模式。 将Binder数据交互和功能处理桥接起来。 在MediaProcess的main函数中通过: sp 我们得到了sm: 是BpServiceManager对象。 三MediaPlayerService加入到ServiceManager中 回到main函数中: intmain(intargc,char**argv) { //创建ProcessState当前进程属性 sp : self()); //IServiceManager对象 sp //初始化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 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
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Binder 基本概念 流程 学习