|
副标题[/!--empirenews.page--]
1、前言Android系统使用binder机制进行进程间通信,为了更好地封装,使用户不用关心底层细节,binder机制变得相当复杂。binder使用c/s架构,可类比socket通信,有服务端也有客户端,而binder驱动就相当于网络。Paste_Image.png本文以M...
1、前言 Android系统使用binder机制进行进程间通信,为了更好地封装,使用户不用关心底层细节,binder机制变得相当复杂。 binder使用c/s架构,可类比socket通信,有服务端也有客户端 ,而binder驱动就相当于网络。 Paste_Image.png本文以MediaPlayerService为例,阐述binder机制。 2、ServiceManager ServiceManager,顾名思义,服务的管理者,所有的本地服务在启动的时候都会被保存在ServiceManager中,而用户可直接访问ServiceManager,获取所需要的服务。 ServiceManager运行在一个独立进程中,本地服务在启动时需要获取ServiceManager,将自身保存,这也是一个IPC过程。此时,ServiceManager作为服务端,而本地服务作为客户端。 以MediaPlayerService为例,查看MediaPlayerService是如何与ServiceManager通信,并将自身保存的呢? 查看MediaPlayerService.cpp的instantiate方法: void MediaPlayerService::instantiate() { defaultServiceManager()->addService( String16("media.player"), new MediaPlayerService()); }
查看defaultServiceManager源码: 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; }
现在MediaPlayerService向ServiceManager发出请求,存储服务,ServiceManager此时做为Server端,那么defaultServiceManager究竟返回的是什么对象呢? 3、痛苦的宏定义继续查看ProcessState::self()->getContextObject(NULL)逻辑,ProcessState使用单例模式,确保一个进程中只有一个ProcessState对象。 sp<ProcessState> ProcessState::self() { Mutex::Autolock _l(gProcessMutex); if (gProcess != NULL) { return gProcess; } gProcess = new ProcessState; return gProcess; }
ProcessState的构造方法中又做了什么呢? ProcessState::ProcessState() : mDriverFD(open_driver()) //初始化列表模式,打开binder驱动 , mVMStart(MAP_FAILED) 。。。 { if (mDriverFD >= 0) { // mmap the binder, providing a chunk of virtual address space to receive transactions. mVMStart = mmap(0, BINDER_VM_SIZE, PROT_READ, MAP_PRIVATE | MAP_NORESERVE, mDriverFD, 0); }
ProcessState构造方法中,打开binder驱动,整篇都在讲binder,终于提到有个类与binder驱动交互了。 继续查看getContextObject方法。 sp<IBinder> ProcessState::getContextObject(const sp<IBinder>& /*caller*/) { return getStrongProxyForHandle(0); } sp<IBinder> ProcessState::getStrongProxyForHandle(int32_t handle) { sp<IBinder> result; AutoMutex _l(mLock); // 根据 handle值,在Vector 中查找 handle_entry* e = lookupHandleLocked(handle); if (e != NULL) { IBinder* b = e->binder; //第一次查找,显示会得到空值 if (b == NULL || !e->refs->attemptIncWeak(this)) { 。。。 // 构造一个BpBinder,最终返回它 b = new BpBinder(handle); e->binder = b; if (b) e->refs = b->getWeakRefs(); result = b; } 。。。 } return result; }
回到前文的defaultServiceManager方法中,将返回值代入,得到 //注意,方法中传入的handle为0,所以BpBinder参数为0 gDefaultServiceManager = interface_cast<IServiceManager>(new BpBinder(0));
interface_cast,初看以为是强制类型转换的方法,以为自己太菜,这方法怎么没见过一样,左键点击下查看方法,才发现别有洞天。 inline sp<INTERFACE> interface_cast(const sp<IBinder>& obj) { return INTERFACE::asInterface(obj); }
原来是调用泛型类中的asInterface的方法,那么IServiceManager的asInterface的具体逻辑是什么呢?查看IServiceManager.h或者cpp文件查看,都找不到asInterface这个方法。但看到了下面一段声明: // IServiceManager.h 中引用的 DECLARE_META_INTERFACE(ServiceManager);
点击一看,这个宏定义中正好定义了asInterface 方法。 #define DECLARE_META_INTERFACE(INTERFACE) static const android::String16 descriptor; static android::sp<I##INTERFACE> asInterface( const android::sp<android::IBinder>& obj); virtual const android::String16& getInterfaceDescriptor() const; I##INTERFACE(); virtual ~I##INTERFACE();
但这只是方法定义,哪里实现的呢?已经在h文件中看到宏定义了,那么cpp文件中是否会有另外一定宏定义,来实现此方法呢? 答案是肯定的,在IServiceManager.cpp中果然看到一段宏定义 IMPLEMENT_META_INTERFACE(ServiceManager, "android.os.IServiceManager");
(编辑:52刷机网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|