美文网首页
dv虚拟机,art虚拟机

dv虚拟机,art虚拟机

作者: miky_zheng | 来源:发表于2019-02-05 07:58 被阅读0次

    虽然,dv虚拟机4.4以后已经过时,但安卓系统的架构和联系,大部分还是没有变动,通过本文的几个问题出发,探索虚拟机和进程之前的联系。

    zygote进程和虚拟机的联系

    答:所有运行的应用程序的虚拟机进程都是由zygote创建的。
    zygote进程,fork应用进程,接着在进程中运行各自的虚拟机。

    dv虚拟机包括哪些功能模块。

    答:
    1.进程管理:进程隔离,每一个Android应用在底层都对应独立的虚拟机,依赖zygote机制。
    2.线程管理:Android应用的所有线程都对应一个Linux线程。
    3.类加载器:解析dex文件并加载dv字节码
    4.解释器:根据自身指令集解释字节码
    5.内层管理:分配系统启动初始化和应用程序运行时需要的内存资源。
    6.JIT(just-in-time):即时编译.在解释器解释字节码时动态的编译程序,以缓解解释器的低效工作。
    7.JNI:本地方法调用。
    8.反射机制实现模块。
    9.调试支持模块。

    zygote任务

    zygote启动后主要负责:
    1)启动系统服务 SystemServer进程。
    2)创建子进程运行Android应用程序。

    zygote机制是如何实现的

    zygote进程是由init进程根据system/core/rootdir/init.rc文件中的配置项创建的,init进程是系统启动后运行在用户空间的首个进程。init进程启动完系统运行所需的各种Daemon线程,即守护线程,然后启动zygote进程。

    zygote是一个虚拟机进程,也是虚拟机实例的孵化器。他在系统启动时产生,完成虚拟机的初始化,库的加载,预制类库和初始化等操作。
    每当系统要求执行一个andorid应用程序,zygote就会fork出一个子进程。
    zygote首先会fork出system_server进程(它是绝大多数系统服务的守护进程,监听socket等待请求命令),当系统需要一个新的虚拟机实例时,zygote会迅速复制自身,以最快的速度提供给系统。对于只读的系统库,所有虚拟机实例都和zygote共享一块内存区域,有效的节省开销。

    zygote复制自身创建虚拟机进程的好处

    zygote进程通过复制本身快速提供虚拟机实例来执行Android应用程序,能有效的减少系统负担,提高设备利用率。

    1.应用程序每次运行都要重新初始化和启动虚拟机,这过程比价耗时。
    zygote通过复制,共享已运行的虚拟机代码与内存信息,缩短应用运行所耗时间。
    2.zygote启动时,先将应用程序要使用的Androidframework中的类和资源加载到内存中,并组织形成所用资源的链接信息。新运行的应用程序不需要重新形成资源的链接信息。

    zygote创建进程的三种方式

    1.fork 子进程
    2.forSystemServer 系统进程会一直存在系统中,一旦子进程退出,父zygote进程也会退出。系统init 进程通过重启zygote 进程,进而重启系统进程。
    3.forkAndSpecialize

    dv虚拟机启动流程

    1.启动init进程
    2.创建并启动zygote进程
    3.创建虚拟机,初始化虚拟机
    4.装载运行时核心类并校验字节码 (apk解压dex文件并对dex解析,类加载)
    5.加载main 方法,分配内存
    6.执行程序字节码(本地方法调用,解释器,即时编译,反射机制等)

    apk文件生成

    1.将java文件编译成字节码(.class)文件,
    2.dx工具将字节码转成dex文件(classes.dex)
    3.aapt工具将dex、资源(Resource)AndroidMainfest.XML组合成一个应用程序包。

    为什么第一次打开apk,会较慢?
    答:为了提高性能,android系统会对dex文件进行优化。优化后的文件以odex
    结尾,之后启动会直接使用优化后的文件。

    附上Android系统结构图:


    image

    art虚拟机

    art虚拟机启动流程和dv虚拟机类似。
    art好比JIT 技术的升级版:(运行时动态加载),直接转成本地机器码。

    1.启动:
    都实现了Java虚拟机的接口,只不过加载库文件不一样。虚拟机接口如下:
    a) JNI_GetDefaultJavaVMInitArgs -- 获取虚拟机的默认初始化参数
    b)JNI_CreateJavaVM -- 在进程中创建虚拟机实例
    c)JNI_GetCreatedJavaVMs -- 获取进程中创建的虚拟机实例

    在Android系统中,Davik虚拟机实现在libdvm.so中,ART虚拟机实现在libart.so中。也就是说,libdvm.so和libart.so导出了JNI_GetDefaultJavaVMInitArgs、JNI_CreateJavaVM和JNI_GetCreatedJavaVMs这三个接口,供外界调用。

    2.apk安装:
    a)解析:
    都是需要解析dex 字节码
    b)加载:
    一个需要加载dex字节码,需要解释器的帮忙。
    一个直接加载本地机器码。
    c)安装时优化。
    一个翻译成odex文件, (优化的dex文件)
    一个直接翻译成oat文件,(elf文件,包含机器指令)

    都是fork新的进程,创建新的虚拟机,只是一个是dv,一个是art。

    相关文章

      网友评论

          本文标题:dv虚拟机,art虚拟机

          本文链接:https://www.haomeiwen.com/subject/yjnmsqtx.html