Android系统的IPC(进程间通信)的一种机制是Binder。其实做android开发的时候,遇到Binder的情况还蛮多的比如在继承Service的时候。
Binder采用我们常见的C/S架构,Server,ServiceManager,Client的关系如下:
1. Server向ServiceManager注册服务
2. Client向ServiceManager查询服务
3. Client使用Server提供的服务
所以Client要使用Service,首先在ServiceManager中查询该服务,然后再使用。
书上用了MediaServer的源码来解析Binder,入口代码如下:
int main(int argc,char** argv){ sp<ProcessState> proc(ProcessState::self()); sp<IServiceManager> sm=defaultServiceManager();AudioFlinger::instantiate(); //服务的实例化
MediaPlayerService::instantiate();
CameraService::instantiate();
AudioPolicyService::instantiate();ProcessState::self()->startThreadPool();
IPCThreadState::self()->joinThreadPool();
}
Binder作为IPC机制,少不了对象ProcessState。在ProcessState.cpp中,我们可以看到一个直接和Binder通信相关的函数,open_driver(),这个函数的作用就是打开/dev/binder设备,与内核的Binder驱动有了交互的通道。
那么defaultServiceManager又是干什么的呢?
看一下IServiceManager.cpp中的defaultServiceManager(),返回的是一个IServiceManager对象,
gDefaultServiceManager=interface_cast<IServiceManager>(ProcessState::self()->getContextObject(NULL));
看gretContextObject函数
sp<IBinder> ProcessState::getContextObject(const sp<IBinder>& caller){ if(supportsProcesses()){ return getStrongProxyForHandle(0); }else{ return getContextObject(String16("default"),caller); } }
进入getStrongProxyForHandle(0)函数,这里的Handle在C++中叫做句柄,起到一个资源标识的作用。
sp<IBinder> ProcessState::getStrongProxyForHandle(int32_t handle) { sp<IBinder> result; AutoMutex _l(mLock); handle_entry* e=lookupHandleLocked(handle);查找是否存在handle对应的资源 if(e!=null){ IBinder* b=e->binder; if(b==null||!e->refs->attemptIncWeak(this)){ b=new BpBinder(handle); e->binder=b; if(b) e->refs=b->getWeakRefs(); result=b; }else{ result.force_set(b); e->refs->decWeak(this); } } return result; //返回BpBinder对象 }
好的,这里出现了一个BpBinder,这里我们需要了解一下IBinder的衍生类,BpBinder和BBinder。
- BpBinder可以看做是客户端的Proxy(代理),用来与Server交互。我们作为客户端,所以创建BpBinder对象。
- BBinder则是Server端的代理,是BpBinder交互的直接对象。
好的,看
gDefaultServiceManager=interface_cast<IServiceManager>(ProcessState::self()->getContextObject(NULL));
这里将BpBinder对象通过interface_cast<IServiceManager>转换成了IServiceManager对象。IServiceManager类,顾名思义就是服务的管理类,包括addService,checkService一些管理Service的方法。
IServiceManager和主要类的关系如下:
大概的Binder通信机制搞明白了,那么具体到传输的细节应该是什么样呢?
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于