专栏名称: 刘望舒
腾讯云最具价值专家
目录
相关文章推荐
复利大王  ·  520怀孕事件? ·  8 小时前  
复利大王  ·  卷疯了:食堂档口末位淘汰 ·  昨天  
鸿洋  ·  2025 Google I/O 带来的 ... ·  2 天前  
复利大王  ·  北大软微男在女厕所偷拍! ·  2 天前  
复利大王  ·  工行软开不续签? ·  2 天前  
51好读  ›  专栏  ›  刘望舒

腾讯面试官:知道什么是Java Binder吗?

刘望舒  · 掘金  · android  · 2020-02-25 16:56

正文

请到「今天看啥」查看全文


  1. Java Binder (对应Framework层的Binder)
  2. Native Binder(对应Native层的Binder)
  3. Kernel Binder(对应Kernel层的Binder)

在此前的文章中,我一直都在介绍Native Binder和Kernel Binder的内容,它们的架构简单总结为下图。

MgRMbF.png

Android Binder原理(二)ServiceManager中的Binder机制 这篇文章中,我讲过BpBinder是Client端与Server交互的代理类,而BBinder则代表了Server端,那么上图就可以改为:

MgWuRI.png
从上图可以看到,Native Binder实际是基于C/S架构,Bpinder是Client端,BBinder是Server端,在 Android Binder原理(四)ServiceManager的启动过程 这篇文章中,我们得知Native Binder通过ioctl函数和Binder驱动进行数据交互。 Java Binder是需要借助Native Binder来进行工作的,因此Java Binder在设计上也是一个C/S架构,可以说Java Binder是Native Binder的一个镜像,所以在学习Java Binder前,最好先要学习此前文章讲解的Native Binder的内容。本篇文章先来讲解Java Binder是如何初始化的,即Java Binder的JNI注册。

1.Java Binder的JNI注册

Java Binder要想和Native Binder进行通信,需要通过JNI,JNI的注册是在Zygote进程启动过程中注册的,代码如下所示。
frameworks/base/core/jni/AndroidRuntime.cpp

void AndroidRuntime::start(const char* className, const Vector<String8>& options, bool zygote)
{
    ...
    JniInvocation jni_invocation;
    jni_invocation.Init(NULL);
    JNIEnv* env;
    if (startVm(&mJavaVM, &env, zygote) != 0) {//1
        return;
    }
    onVmCreated(env);
    if (startReg(env) < 0) {
        ALOGE("Unable to register all android natives\n");
        return;
    }
   ...
}
复制代码

注释1处用于启动Java虚拟机,注释2处startReg函数用于完成虚拟机的JNI注册,关于AndroidRuntime的start函数的具体分析见 Android系统启动流程(二)解析Zygote进程启动过程 这篇文章。 startReg函数如下所示。 frameworks/base/core/jni/AndroidRuntime.cpp

/*static*/ int AndroidRuntime::startReg(JNIEnv* env)
{
    ATRACE_NAME("RegisterAndroidNatives");
    androidSetCreateThreadFunc((android_create_thread_fn) javaCreateThreadEtc);

    ALOGV("--- registering native functions ---\n");
    env->PushLocalFrame(200);

    if (register_jni_procs(gRegJNI, NELEM(gRegJNI), env) < 0) {//1
        env->PopLocalFrame(NULL);
        return -1;
    }
    env->PopLocalFrame(NULL);
    return 0






请到「今天看啥」查看全文