2. Android系统启动流程
1.启动加载完内核
2.执行init进程 ----> 设备初始化工作
a1. 读取inic.rc
a2. 启动Zygote进程 ----> 该进程是所有进程的孵化器
b1. 初始化dalvik虚拟机
b2. 启动system_server进程
c1. 通过socket方式发送命令给Zygote进程
b3. 接到命令fork自身
c1. 创建dalvik虚拟机实例执行应用程序入口函数
Zygote提供了3种创建进程的方法
fork() 创建一个Zygote进程
forkAndSpecialize() 创建一个非Zygote进程
forkSystemServer() 创建一个系统服务进程
Dalvik虚拟机执行程序流程:
[虚拟机线程] -> [装载程序类] -> [验证字节码] -> [查找主类] -> [执行字节码流] -> [结束]
1. 首先通过loadClassFromDex()函数完成类的装载工作
每个类成功解析后都有一个ClassObject类型的数据结构存在与运行时环境
2. 使用gDvm.loadedClasses全局哈希表来存储查询所有的装载类
3.字节码验证器使用dvmVerifyCodeFlow()函数对装入的代码进行校验
4.调用FindClass()查找并装载main方法类
5.调用dvmInterpret()函数初始化解释器并执行字节码流
关于Dalvik虚拟机的JIT(just in time即时编译)
主流的JIT包含2种字节码编译方式
1. method方式: 以函数或方法为单位进行编译
2. trace方式:以trace为单位进行编译
经常执行的代码分支会缓存