WEB开发网
开发学院手机开发Android 开发 Android IPC框架分析 Binder,Service,Service m... 阅读

Android IPC框架分析 Binder,Service,Service manager

 2010-08-22 04:52:00 来源:WEB开发网   
核心提示:注意看看关键的代码BinderInternal.getContextObject() @BinderInteral.javaNATIVE JNI:getContextObject() @android_util_Binder.cppAndroid_util_getConextObject @android_util_B

注意看看关键的代码

BinderInternal.getContextObject() @BinderInteral.java

NATIVE JNI:getContextObject() @android_util_Binder.cpp

Android_util_getConextObject @android_util_Binder.cpp

ProcessState::self()->getCotextObject(0) @processState.cpp

getStrongProxyForHandle(0) @

NEW BpBinder(0)

注意ProcessState::self()->getCotextObject(0) @processtate.cpp,就是该函数在进程空间建立 了ProcessState对象,打开了Binder设备devinder,并且传递了参数0,这个0代表了与Service Manager这个服务绑定。

(2) 通过调用ServiceManager.asInterface(ContextObject)建立一个代理ServiceManger。

mRemote= ContextObject(Binder)

这样就建立起来ServiceManagerProxy通讯框架。

(3)客户端通过调用ServiceManager的getService的方法建立一个相关的代理Binder。

ServiceMangerProxy.remote.transact(GET_SERVICE)

IBinder=ret.ReadStrongBinder() -》这个就是JVM空间的代理Binder

JNI Navite: android_os_Parcel_readStrongBinder() @android_util_binder.cpp

Parcel->readStrongBinder() @pacel.cpp

unflatten_binder @pacel.cpp

getStrongProxyForHandle(flat_handle)

NEW BpBinder(flat_handle)-》这个就是底层c++空间新建的代理Binder。

整个建立过程可以使用如下的示意图来表示:

Activity为了建立一个IPC,需要建立两个连接:访问Servicemanager Service的连接,IXXX具体XXX Service的代理对象与XXXService的连接。这两个连接对应c++空间ProcessState中BpBinder。对IXXX的操作最后就是对BpBinder的操作。由于我们在写一个Service时,在一个Package中写了Service Native部分和Service Proxy部分,而Native和Proxy都实现相同的接口:IXXX Interface,但是一个在服务端,一个在客服端。客户端调用的方式是使用remote->transact方法向Service发出请求,而在服务端的OnTransact中则是处理这些请求。所以在Android Client空间就看到这个效果:只需要调用代理对象方法就达到了对远程服务的调用目的,实际上这个调用路径好长好长。

上一页  1 2 3 4 5  下一页

Tags:Android IPC 框架

编辑录入:coldstar [复制链接] [打 印]
赞助商链接