一、ART虚拟机的启动过程
Android系统通过将ART运行时抽象成一个Java虚拟机,以及通过系统属性persist.sys.dalvik.vm.lib和一个适配层JniInvocation,就可以无缝地将Dalvik虚拟机替换为ART运行时。这个替换过程设计非常巧妙,因为涉及到的代码修改是非常少的。
frameworks/base/core/jni/AndroidRuntime.cpp
JniInvocation类的成员函数init实际上就是根据系统属性persist.sys.dalvik.vm.lib来初始化Dalvik虚拟机或者ART虚拟机环境。
JniInvocation
persist.sys.dalvik.vm.lib //libdvm.so libart.so
抽象Java虚拟机的三个接口
JniInvocation:
JNI_GetDefaultJavaVMInitArgs_: JNI_GetDefaultJavaVMInitArgs
JNI_CreateJavaVM_: JNI_CreateJavaVM
JNI_GetCreatedJavaVMs_: JNI_GetCreatedJavaVMs
JavaVM
JNIEnv
startVm --> JNI_CreateJavaVM_
创建一个JavaVM接口及其对应的JNIEnv接口
二、应用程序在安装过程中将dex字节码翻译为本地机器码的过程
frameworks/base/services/core/java/com/android/server/pm/Installer.java
frameworks/base/core/java/com/android/internal/os/InstallerConnection.java
通过socket向守护进程installd