之前博客分析Binder机制时,集中分析的是Native层Binder的架构,现在来分析一下Java层Binder的架构。
一、Java层中Binder相关的主要类
Java层Binder的功能,依赖于Native层Binder来实现,可以认为Java层Binder架构是Native层Binder架构的一个镜像。
上图为Java层Binder架构的主要成员:
1、系统定义了一个IBinder接口及DeathRecipient接口。
2、Binder类和BinderProxy类实现了IBinder接口。其中,Binder类作为Native层服务端Bn的代表,BinderProxy类作为Native层客户端Bp的代表。
3、BinderInternal类是一个仅供Binder架构使用的类;其内部有一个GcWatcher类,用于处理和Binder架构相关的垃圾回收。
二、建立Java层Binder与Native层间的关系
由于Java层的Binder需要借助Native层Binder系统来开展工作,因此初始时应该建立起Java层Binder和Native层Binder之间的联系。
这是通过JNI函数的注册完成的。
之前的博客分析zygote进程时,我们知道zyote的main函数中,初始化Java虚拟机后,会注册一些JNI函数。
//app_main.cpp的main函数
int main(int argc, char* const argv[])
{
........
if (zygote) {
runtime.start("com.android.internal.os.ZygoteInit", args, zygote);
}.......
}
void AndroidRuntime::start(const char* className, const Vector<String8>& options, bool zygote)
{
.......
//注册JNI函数
if (startReg(env) < 0) {
ALOGE("Unable to register all android natives\n");
return;
}
.......
}
int AndroidRuntime::startReg(JNIEnv* env)
{
......
//调用JNI注册函数,其中gRegJNI数组中定义了需注册的JNI函数
if (register_jni_procs(gRegJNI, NELEM(gRegJNI), env) < 0) {
env->PopLocalFrame(NULL);
return -1;
}
.....
}
static int register_jni_procs(const RegJNIRec array[], size_t count, JNIEnv* env)
{
for (size_t i = 0; i < count; i++) {
//调用对应的执行函数
if (array[i].mProc(env) < 0) {
............
}
}
return 0;
}
在gRegJNI数组中:
static const RegJNIRec gRegJNI[] = {
........
REG_JNI(register_android_os_Binder),
........
}
因此,注册JNI函数时将会调用到register_android_os_Binder:
int register_android_os_Binder(JNIEnv* env)
{
//初始化Java Binder类和Native层的关系
if (int_register_android_os_Binder(env) < 0)
return -1;
//初始化Java BinderInternal类和Native层的关系
if (int_register_android_os_BinderInternal(env) < 0)
return -1;
//初始化Java BinderProxy类和Native层的关系
if (int_register_android_os_BinderProxy(env) < 0)
return -1;
...........
}
上述三个JNI注册函数的风格一致:
static int int_register_android_os_Binder(JNIEnv* env)
{
//kBinderPathName = "android/os/Binder"
jclass clazz = FindClassOrDie(env, kBinderPathName);
//gBinderOffsets保存Binder.java中一些信息;这样Native层就可以调用Java层中方法
gBinderOffsets.mClass = MakeGlobalRefOrDie(env, clazz);
gBinderOffsets.mExecTransact = GetMethodIDOrDie(env, clazz, "execTransact", "(IJJI)Z");
gBinderOffsets.mObject = GetFieldIDOrDie(env, clazz, "mObject", "J");
//注册JNI函数,gBinderMethods中定义了Binder.java中申明的Native方法
return RegisterMethodsOrDie(
env, kBinderPathName,
gBinderMethods, NELEM(gBinderMethods));
}
static int int_register_android_os_BinderInternal(JNIEnv* env)
{
//kBinderInternalPathName = "com/android/internal/os/BinderInternal"
jclass clazz = FindClassOrDie(env, kBinderInternalPathName);
gBinderInternalOffsets.mClass = MakeGlobalRefOrDie(env, clazz);
gBinderInternalOffsets.mForceGc = GetStaticMethodIDOrDie(env, clazz, "forceBinderGc", "()V");
return RegisterMethodsOrDie(
env, kBinderInternalPathName,
gBinderInternalMethods, NELEM(gBinderInternalMethods));
}
static int int_register_android_os_BinderProxy(JNIEnv* env)
{
.................