android虚拟机的典型启动流程-一

init–android系统中的第一个进程

	内核启动完成后,init进程通过解析脚本init.rc启动关键的守护进程和系统服务。如下可看到很多的init相关的配置文件,其中包括zygote(手机系统中的init.zygote64_32.rc、init.zygote32.rc文件)。

android虚拟机的典型启动流程-一
android虚拟机的典型启动流程-一
通过dmesg |grep zygote查看相关的启动信息:
android虚拟机的典型启动流程-一

zygote–是android应用程序的孵化器,大多数应用程序是从该程序fork出来的。

本身是java语言,因此运行则需要虚拟机环境。
进程app_process是zygote的载体,源码/AOSP/frameworks/base/cmds/app_process/app_main.cpp
该文件中的main函数会解析zygote启动命令参数--zygote --start-system-server ....,并最终调用AndroidRuntime的start函数,从下面代码可以看出,zygote的入口"com.android.internal.os.ZygoteInit",AndroidRuntime的start负责启动并管理android虚拟机。

android虚拟机的典型启动流程-一
android虚拟机的典型启动流程-一

AndroidRuntime::start–启动并管理android虚拟机

源码/AOSP/frameworks/base/core/jni/AndroidRuntime.cpp
函数AndroidRuntime::start是Andriod中使用和管理虚拟机的典型流程,无论是Dalvik还是Art,都必须遵循一致的管理方式。

android虚拟机的典型启动流程-一
android虚拟机的典型启动流程-一

下面将关键的5步进行详细讲解

	步骤1-初始化当前的运行环境:	
							JniInvocation jni_invocation;
							jni_invocation.Init(NULL);
							源码在 libnativehelper/JniInvocation.cpp

android虚拟机的典型启动流程-一

android虚拟机的典型启动流程-一

1)获取动态链接库libart.so
2)dlopen打开动态库
3)FindSymbol函数查找3个关键的接口:"JNI_GetDefaultJavaVMInitArgs","JNI_CreateJavaVM","JNI_GetCreatedJavaVMs"
并保存在对应的变量中。无论是Dalvik还是Art,这三个接口必须实现的接口。

步骤二:startVM:

		1)初始化虚拟机参数

android虚拟机的典型启动流程-一
2)调用JNI_CreateJavaVM
android虚拟机的典型启动流程-一
小结:
1 Android虚拟机无论是Dalvik还是Art,都是以动态链接库的形式libart.so提供功能。其中的3个必要接口函数::“JNI_GetDefaultJavaVMInitArgs”,“JNI_CreateJavaVM”,“JNI_GetCreatedJavaVMs”。
2 虚拟机分为java和native层。虚拟机的创建者和管理者位于native层,利用JNI与java进行通信。
3 在JNI_CreateJavaVM创建成功后,返回一个JNIEnv的指针变量,用于访问JVM。

步骤3:虚拟机创建成功后,执行回调函数告诉调用者。

目前该函数没有内容。

android虚拟机的典型启动流程-一
步骤4:注册native函数。都是一些预设的jni函数。
android虚拟机的典型启动流程-一

PushLocalFrame 和PopLocalFrame是管理局部引用的声明周期,必须成对存在。
register_jni_process注册一个RegJNIRec列表中包含的所有的Native method,将这些本地函数设置为ArtMethod的JNI入口。

android虚拟机的典型启动流程-一

步骤5:查找zygoteInit的main函数,并执行该main函数。

通过GetStaticMethodID找到ZygoteInit的main函数;
通过CallStaticVoidMethod 执行ZygoteInit的main函数。

到此为止,从整个调用过程来讲:android虚拟机的启动过程讲解完了,后续会继续更新对android虚拟机的启动过程深层的理解。