软件测试 | Dalvik 虚拟机是如何执行程序的
获取更多学习资料
Android 系统的架构采用分层思想,这样的好处是拥有减少各层之间的依赖性、便于独立分发、容易收敛问题和错误等优点。Android 系统由 Linux 内核、函数库、Android 运行时、应用程序框架以及应用程序组成。如图 3-4 的 Android 系统架构所示,Dalvik 虚拟机属于 Android 运行时环境,它与一些核心库共同承担 Android 应用程序的运行工作。
Android 系统启动加载完内核后,第一个执行的是 init 进程,init 进程首先要做的是设备的初始化工作,然后读取 inic.rc 文件并启动系统中的重要外部程序 Zygote.Zygote 进程是 Android 所有进程的孵化器进程,它启动后会首先初始化 Dalvik 虚拟机,然后启动 system_server 并进入 Zygote 模式,通过 socket 等候命令。当执行一个 Android 应用程序时,system_server 进程通过 socket 方式发送命令给 Zygote,Zygote 收到命令后通过 fork 自身创建一个 Dalvik 虚拟机的实例来执行应用程序的入口函数,这样一个程序就启动完成了。整个流程如图 3-5 所示。
Zygote 提供了三种创建进程的方法:
fork(),创建一个 Zygote 进程;
forkAndSpecialize(),创建一个非 Zygote 进程;
forkSystemServer(),创建一个系统服务进程。
其中,Zygote 进程可以再 fork()出其他进程,非 Zygote 进程则不能 fork 其他进程,而系统服务进程在终止后它的子进程也必须终止。
当进程 fork 成功后,执行的工作就交给了 Dalvik 虚拟机。Dalvik 虚拟机首先通过 loadClassFromDex()函数完成类的装载工作,每个类被成功解析后都会拥有一个 ClassObject 类型的数据结构存储在运行时环境中,虚拟机使用 gDvm.loadedClass 全局哈希表来存储与查询所有装在进来的类,随后,字节码验证器使用 dvmVerifyCodeFlow()函数对装入的代码进行校验,接着虚拟机调用 FindClass()函数查找并装载 main 方法类,随后调用 dvmInterpret()函数初始化解释器并执行字节码流。整个过程如图 3-6 所示。
评论