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为单位进行编译
    经常执行的代码分支会缓存























posted @ 2016-08-13 23:50  Bingghost  阅读(251)  评论(0编辑  收藏  举报