-
-
[分享]Art虚拟机JNIEnv相关分析(1)JavaVM &JNIEnv 的初始化流程
-
发表于: 2021-4-14 10:52 8536
-
1.前言
在安卓jni编程中,常常接触到JavaVM和JNIEnv。比如jni动态注册中的JNI_OnLoad方法是我们需要实现的。使用的时候需要通过JavaVM获取JNIEnv。参考如下:
除了动态注册的时候,在编写java层native方法在c层的实现时候,会使用到JNIEnv中提供的很多jni接口函数,比如FindClass、CallObjectMethod等。
以下将通过源码中追踪JavaVM&JNIEnv创建和初始化流程分析理解JNI层的一个大概实现机制。
2.JavaVM和JNIEnv创建流程分析
安卓中zygote是所有Java层进程的鼻祖。zygote启动的时候会创建art虚拟机。JavaVM和JNIEnv初始化的流程也会在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.cpp。app_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中的处理逻辑