首页
社区
课程
招聘
[分享]Art虚拟机JNIEnv相关分析(1)JavaVM &JNIEnv 的初始化流程
发表于: 2021-4-14 10:52 8536

[分享]Art虚拟机JNIEnv相关分析(1)JavaVM &JNIEnv 的初始化流程

2021-4-14 10:52
8536

1.前言

     在安卓jni编程中,常常接触到JavaVMJNIEnv。比如jni动态注册中的JNI_OnLoad方法是我们需要实现的。使用的时候需要通过JavaVM获取JNIEnv。参考如下:

     除了动态注册的时候,在编写javanative方法在c层的实现时候,会使用到JNIEnv中提供的很多jni接口函数,比如FindClassCallObjectMethod等。

     以下将通过源码中追踪JavaVM&JNIEnv创建和初始化流程分析理解JNI层的一个大概实现机制。


2.JavaVMJNIEnv创建流程分析

    安卓中zygote是所有Java层进程的鼻祖。zygote启动的时候会创建art虚拟机。JavaVMJNIEnv初始化的流程也会在zygote启动的时候完成。


2.1  zygote启动流程


       (1).init进程解析init.rc

       安卓系统用户空间第一个进程init进程启动的时候会解析init.rc文件来确认使用那个一个init.zygotexx.rc文件来启动zygote进程。init.rc中相关内容如下:



     由以上内容可知需要根据ro.zygote属性来确认加载具体的zygote启动配置的rc 文件来启动32位还是64位的zygote进程。在文件路径"system\core\rootdir"存在多个zygote启动的配置文件,如下所示:

      

图片


   ro.zygote属性会有四种不同的取值:

zygote32:代表32位模式运行zygote进程

zygote32_64:代表32为主,64位为辅的方式启动zygote进程

zygote64:代表64位方式启动zygote进程

zygote64_32:代表64位为主,32位为辅的方式启动zygote进程

   

以下是一加3手机在安卓10系统中的ro.zygote属性的值。如下所示:



 根据以上ro.zygote值为zygote64_32,当前手机将会加载init.zygote64_32.rc文件。init.zygote64_32.rc内容如下:



      该配置文件中配置启动了两个zygote进程,一个是执行app_process64,一个是执行app_process32。接下来分析app_process进程的相应逻辑代码。


  (2).app_process启动过程


     在安卓系统源码中,app_process64和app_process32使用的是同一份源代码。源码路径位于目录:



     安卓系统在编译的时候根据Android.mk文件配置编译成了两个平台并重命名。如下是相应的Android.mk文件中配置情况。



      app_process模块中只有一个源文件app_main.cppapp_main.cpp文件中和zygote启动相关的逻辑代码如下:



   以上代码中关键逻辑变成了AndroidRuntime->start,接下来分析一下AndroidRuntime中的相关逻辑。

 

 2.2  AndroidRuntime中的处理流程分析


     AndroidRuntime类文件路径如下:



    在该类中的start方法如下



      以上方法中调用了startVm方法创建JavaVM和JNIEnv。startVm中的关键逻辑如下:



     以上方法中执行JNI_CreateJavaVM方法来创建虚拟机。接下来分析JNI_CreateJavaVM中的处理逻辑。


2.3 JNI_CreateJavaVM中的处理流程分析


     JNI_CreateJavaVM方法定义在"jni.h"文件中。具体实现在文件"libnativehelper\JniInvocation.cpp"中。该文件中JNI_CreateJavaVM实现如下:



以上方法中使用了JniInvocationImpl类的JNI_CreateJavaVM方法。该类位于路径"libnativehelper\JniInvocation.cpp"中,他的JNI_CreateJavaVM方法实现如下:



      在以上实现中调用了JNI_CreateJavaVM_方法,该方法是一个函数指针,定义为如下:



    在JniInvocationImpl类中函数指针JNI_CreateJavaVM_赋值相关逻辑实现如下:



    以上分析可知最终调用的是libart.so中的JNI_CreateJavaVM方法来实现创建虚拟机。接下来分析art中的JNI_CreateJavaVM方法逻辑。


2.4 art中虚拟机创建分析

   在art源码中,JNI_CreateJavaVM方法实现源文件路径为:



   在该文件中JNI_CreateJavaVM的实现代码逻辑如下:



     以上代码分析核心流程变成了Runtime::Create。接下来分析art中的Runtime类中的处理逻辑。


2.5 Runtime中的处理逻辑

    


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 1
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//