from:http://www.cnblogs.com/autum/archive/2012/04/04/dalvik123.html


Dalvik虚拟机的入口有两个

1./Dalvikvm/Main.c

2.frameworks/base/cmds/app_process.cpp

这两个文件中都包含main函数  用于创建第一个虚拟机实例  虚拟机作为一种应用程序,运行它是需要main函数的  其中app_peocess.cpp继承了AndroidRuntime.cpp

/frameworks/base/core/jni/AndroidRuntime.cpp

第一个是用于开发用的,一般在x86上,开发调试时用。

第二个是手机等移动设备上用的。区别在于开发时要使用dx工具等,实际手机就是使用android操作系统,运行.apk文件,不需要再做编译等工作。(.apk文件中包含的是.dex文件)

下面分析第二个入口的源码:

手机开机的时候就创建一个虚拟机-->初始化这个虚拟机-->开始主线程-->一直运行下去  

调用的函数:startVm-->JNI_CreateJavaVM()-->start   start函数中调用findClass()和findMeth()进行执行 这个函数时不返回的 作为主线程

start函数中会进入Zygote类,并且执行其main函数,函数中加载了Framework的类或者资源用于共享。还使用socket用于监听,什么时候创建其他的虚拟机。Zygote就是一个孵化器,其他的虚拟机实例都是复制的他,同时共享了他的Framework的共享资源(这些资源都在同一个物理区域)。

Zygote进程复制的第一个虚拟机是Systemserver进程,此进程中有很多线程用于初始化系统服务。

2012040616440368.jpg

Zygote是第一个虚拟机实例,当用户运行其他应用程序的时候,系统会复制这个虚拟机,产生第二个虚拟机实例,可以很多个

大家知道一个虚拟机实例对应一个linux内核进程,系统启动的时候,linux会创建一个系统进程,在这个进程中创建其他的进程,dalvik基于linux多进程就是这个意思。

在一个虚拟机实例里面有一个主线程,就是上面提到的start函数,这个主线程用于执mian函数。其他线程可以由用户创建,也可以是系统自带的,比如垃圾回收线程。