加入收藏 | 设为首页 | 会员中心 | 我要投稿 52刷机网 (https://www.52shuaji.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 安卓频道 > 安卓资讯 > 正文

Android binder机制(native服务篇)

发布时间:2017-05-16 19:04:36 所属栏目:安卓资讯 来源:www.jianshu.com
导读:1、前言Android系统使用binder机制进行进程间通信,为了更好地封装,使用户不用关心底层细节,binder机制变得相当复杂。binder使用c/s架构,可类比socket通信,有服务端也有客户端,而binder驱动就相当于网络。Paste_Image.png本文以M...
副标题[/!--empirenews.page--]

1、前言Android系统使用binder机制进行进程间通信,为了更好地封装,使用户不用关心底层细节,binder机制变得相当复杂。binder使用c/s架构,可类比socket通信,有服务端也有客户端,而binder驱动就相当于网络。Paste_Image.png本文以M...

1、前言

Android系统使用binder机制进行进程间通信,为了更好地封装,使用户不用关心底层细节,binder机制变得相当复杂。

binder使用c/s架构,可类比socket通信,有服务端也有客户端 ,而binder驱动就相当于网络。

Android binder机制(native服务篇)
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刷机网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读