Dalvik 如何启动应用程序

  1. Android启动加载完内核后,第一个执行的是init进程。
  2. init进程首先要做的是设备初始化工作,然后读取init.rc文件并启动系统中重要的外部程序Zygote
  3. Zygote是 Android 所有进程的孵化器进程,它启动后会首先初始化 Dalvik 虚拟机,然后启动system_server并进入 Zygote模式,通过socket等候命令。
  4. 当执行一个 Android 应用程序时,system_server进程通过 Binder IPC方式发送命令给Zygote
  5. Zygote收到命令后通过fork自身创建一个 Dalvik虚拟机的实例来执行应用程序的入口函数。

Zygote提供了三种创建进程的方法:
fork(),创建一个Zygote进程
forkAndSpecialize(),创建一个非Zygote进程
forkSystemServer(),创建一个系统服务进程

其中Zygote进程可以继续fork其他进程,非Zygote进程无法fork其他进程。而系统服务进程终止后,它的子进程也必须终止。

当进程 fork完成后,执行的工作就交给了 Dalvik虚拟机。

Dalvik 虚拟机首先通过loadClassFromDex()函数完成类的装载工作,每个类被成功解析后都会拥有一个 ClassObject类型的数据结构存储在运行时的环境中,虚拟机使用 gDvm.loadedClasses全局哈希表来存储与查询所有装载进来的类。
随后,字节码验证器使用 dvmVerifyCodeFlow()函数对装入的代码进行校验。
接着虚拟机调用FindClass()函数查找并装载 main 方法类。
随后调用 dvmInterpret()函数初始化解释器并执行字节码流。

整个过程如下:

Created with Raphaël 2.1.0 虚拟机线程 装载程序类 验证字节码 查找主类 执行字节码流 结束

你可能感兴趣的:(Dalvik 如何启动应用程序)