Android启动的第一个虚拟机称为Zygote,这也是Android中最重要的一个虚拟机。在system\core\rootdir\init.rc脚本中,Zygote的启动配置如下: service zygote /system/bin/app_process -Xzygote /system/bin --zygote Zygote进程的启动过程位于frameworks\base\cmds\app_process\app_main.cpp文件中,app_main.cpp中描述了应用进程(app_process)的启动模式:zygote模式和非zygote模式。应用进程的命令行参数为: app_process [java-options] cmd-dir start-class-name [options] 由此可以明白,在启动Zygote进程时,app_process的java-options选项为-Xzygote;cmd-dir选项为/system/bin,即当前目录;start-class-name为zygote,即进程名。 Zygote虚拟机的具体启动过程如下: 代码1-1 app_process实现 int main(int argc, const char* const argv[]) 当进程的启动模式为zygote模式时,系统会调用com.android.internal.os.ZygoteInit启动系统服务器;当进程启动模式为非zygote模式时,系统会调用com.android.internal.os.RuntimeInit启动进程。关于com.android.internal.os.ZygoteInit的实现位于frameworks\base\core\java\com\android\internal\os\ZygoteInit.java文件中,更详细的内容将在2.3.4节实时进程中讨论。 无论进程以何种模式启动,最终将会执行Android Runtime::start(const char* className, const bool startSystem Server)函数,然后经过一系列的参数配置最终启动一个Dalvik虚拟机。相关的代码分布在app_main.cpp、Jni.c、init.c等文件中,启动Dalvik虚拟机的过程如图1-1所示。 图1-1 启动Dalvik虚拟机 在创建Dalvik虚拟机之前,系统会首先阻塞管道信号,接着检查Dalvik虚拟机的相关属性,如dalvik.vm.checkjni、dalvik.vm.execution-mode、dalvik.vm.stack-trace-file、dalvik. vm.enableassertions、dalvik.vm.jniopts、dalvik.vm.dexopt-flags、dalvik.vm.deadlock-predict等,然后调用JNI_CreateJavaVM()函数创建Dalvik虚拟机,最后为Dalvik虚拟机进行原生方法的注册。 |
|