Android系统进程间通信Binder机制在应用程序框架层的Java接口源代码分析----------------------------
bind涉及的文件------------------------------------------------------------------------------------------>
1、JAVA层相关:--------------------------<BinderProxy对象是关键>-----------
---ServiceManager.java
public final class ServiceManager{
private static IServiceManager sServiceManager;//定义一个IServiceManager静态类对象成员,保存ServiceManager的代理ServiceManagerProxy。
它通过函数getIServiceManager来获取初值。
getIServiceManager()函数很重要,它定义和生成了JAVA层ServiceManager的代理ServiceManagerProxy和Binder的代理BinderProxy(通过调用JNI函数getContextObject在JNI层获取的)。定义如下:
private static IServiceManager getIServiceManager() {
if (sServiceManager != null) {
return sServiceManager;
}
// Find the service manager
sServiceManager = ServiceManagerNative.asInterface(BinderInternal.getContextObject());
// this statement is equal
//sServiceManager = ServiceManagerNative.asInterface(new BinderProxy());
//sServiceManager = new ServiceManagerProxy(new BinderProxy());
//end
return sServiceManager;
}
***首先通过BinderInternal的getContextObject方法得到一个BinderProxy对象。getContextObject是一个JNI调用,在JNI(android_util_Binder.cpp)中实现new一个BinderProxy返回。
***其次通过ServiceManagerNative的方法asInterface得到(new)一个ServiceManagerProxy对象。并将BinderProxy对象保存到类成员mRemote中。
***此函数使我们在Java层,拥有了一个Service Manager远程接口ServiceManagerProxy,而这个ServiceManagerProxy对象在JNI层有一个句柄值为0的BpBinder对象与之通过gBinderProxyOffsets(或者说BinderProxy.mObject保存有BpBinder对象的地址)关联起来。
}
getIServiceManager函数用到了ServiceManagerNative和BinderInternal类。
---IServiceManager.java
public interface IServiceManager extends IInterface{}继承自IInterface接口,本身还是接口。
此文件定义一个接口,其中声明了和C++相似的交互接口,以及各类操作的消息。
---ServiceManagerNative.java
public abstract class ServiceManagerNative extends Binder implements {}
定义了类ServiceManagerNative(本地)
ServiceManagerNative继承自Binder,并实现IServiceManager的接口。它的asInterface()提供一个ServiceManagerProxy对象。
class ServiceManagerProxy implements IServiceManager {}
定义了类ServiceManagerProxy(代理)
ServiceManagerProxy继承自IServiceManager,并实现了其声明的操作函数,只会被ServiceManagerNative创建,
它实现了IServiceManager的接口,IServiceManager提供了getService和addService两个成员函数来管理系统中的Service。
---BinderInternal.java
public class BinderInternal{}此类主要用来提供一些测试用的接口,都是JNI调用。
同时方法getContextObject通过JNI得到BinderProxy对象,用来给JAVA层提供调用。
JNI层的函数对应如下:
static jobject android_os_BinderInternal_getContextObject(JNIEnv* env, jobject clazz)
{
sp<IBinder> b = ProcessState::self()->getContextObject(NULL);
return javaObjectForIBinder(env, b);
}
sp<IBinder> b = ProcessState::self()->getContextObject(NULL);
相当于
sp<IBinder> b = new BpBinder(0);
接着调用javaObjectForIBinder把这个BpBinder对象转换成一个BinderProxy对象
注意:
gBinderOffsets变量是用来记录JAVA层Binder类的相关信息的,它是在注册Binder类的JNI方法的int_register_android_os_Binder函数初始化的;
gBinderProxyOffsets是用来变量是用来记录JAVA层BinderProxy类的相关信息的,它是在注册BinderProxy类的JNI方法的int_register_android_os_BinderProxy函数初始化的。
在函数javaObjectForIBinder中创建了一个BinderProxy对象:
object = env->NewObject(gBinderProxyOffsets.mClass, gBinderProxyOffsets.mConstructor);
C++层的BpBinder对象和JAVA层的BinderProxy对象关联,是通过函数javaObjectForIBinder中的如下语句,
env->SetIntField(object, gBinderProxyOffsets.mObject, (int)val.get());
建立的,BinderProxy.mObject成员变量记录了这个BpBinder对象的地址。
同时使用,
val->attachObject(&gBinderProxyOffsets, refObject,
jnienv_to_javavm(env), proxy_cleanup);
把BinderProxy的地址放到BpBinder里面去,以后通过调用BpBinder::findObj可以找到。
---Binder.java
public class Binder implements IBinder{}
final class BinderProxy implements IBinder{}
此文件定义Binder和BinderProxy类
Binder实现的IBinder的接口,他的大部分函数都是通过JNI调用底层实现的。
BinderProxy是JAVA层的关键类,在JNI通过gBinderProxyOffsets来使用。
---IInterface.java
public interface IInterface{}
此文件只定义JAVA的接口IInterface,其内生命了asBinder函数,返回值为IBinder对象。
---IBinder.java
public interface IBinder {}
此文件只定义了接口IBinder。此接口声明了接口紧密相关的几个方法。
---Parcel.java
public final class Parcel {}
Parcel类是用Java来实现的,它跟用C++实现的Parcel类的作用是一样的,即用来在两个进程之间传递数据。
2、C++层相关:------------------------------<BpBinder是关键>-----------
BpBinder.cpp
BpBinder.h
sp<IBinder> b = ProcessState::self()->getContextObject(NULL);
相当于,
sp<IBinder> b = new BpBinder(0);
3、JNI相关文件:------------------------<JavaBBinderHolder和JavaBBinder是关键>-----------
android_util_Binder.cpp
class JavaBBinder : public BBinder JavaBBinder继承自C++的BBinder类
int_register_android_os_Binder()注册Binder类的JNI方法
static const JNINativeMethod gBinderMethods[] JAVA和C++层函数映射表
register_android_os_Binder此函数用来注册所有类型的JNI
class JavaBBinderHolder : public RefBase{}
此类是实现JNI的关键类对象。
我们就是要把JavaBBinderHolder里面的JavaBBinder类型Binder实体添加到Service Manager中去,以便使得这个HelloService有Client来请求服务时,由Binder驱动程序来唤醒这个Server线程,进而调用这个JavaBBinder类型Binder实体的onTransact函数来进一步处理,这个函数我们在后面会继续介绍。
class JavaBBinder : public BBinder{}
android_util_Binder.h
函数,
android_os_BinderInternal_getContextObject
gBinderInternalMethods表
Jni.h
JNIHelp.c
jniRegisterNativeMethods注册JNI函数