您的位置:首页 > 其它

Dalvik 如何启动应用程序

2016-03-15 22:38 363 查看
Android启动加载完内核后,第一个执行的是
init
进程。

init
进程首先要做的是设备初始化工作,然后读取
init.rc
文件并启动系统中重要的外部程序
Zygote


Zygote
是 Android 所有进程的孵化器进程,它启动后会首先初始化 Dalvik 虚拟机,然后启动
system_server
并进入
Zygote
模式,通过
socket
等候命令。

当执行一个 Android 应用程序时,
system_server
进程通过
Binder IPC
方式发送命令给
Zygote


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虚拟机线程装载程序类验证字节码查找主类执行字节码流结束
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: