Android7.0 Binder通信(4) Java层中的Binder

本文详细解析了Android7.0中Java层Binder的架构,包括主要类、Binder与Native层的关联建立、服务注册过程以及服务端响应请求的方式。分析了Java层服务如何通过JNI注册Native函数,并通过ServiceManagerProxy将请求传递到Native层的Binder架构。
摘要由CSDN通过智能技术生成

之前博客分析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)
{
    .................
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值