美文网首页 移动 前端 Python Android Java
虚拟机 Dalvik 和 Art 理论笔记

虚拟机 Dalvik 和 Art 理论笔记

作者: zcwfeng | 来源:发表于2020-06-15 23:46 被阅读0次

    虚拟机分类:

    目前,JVM,Dalvik 和 Art,G1 等

    Davlvik 基于寄存器的虚拟机

    什么是基于栈的虚拟机,什么是基于寄存器的虚拟机?

    基于栈的虚拟机,栈是一块内存数据结构。

    寄存器:

    指令cpu存储单元。(操作数栈+局部变量表合并)不再和栈一样,弹出栈,压栈的操作。
    

    Android 是基于寄存器的虚拟机,目的是模拟物理寄存器的操作,是一个虚拟机虚拟的寄存器(Dalvik 和ART)都是

    Dalvik Android 2.2 引入 JIT(及时编译Just in Time)dex 是字节码,解释执行,支持JIT 将dex提取出来 odex

    Art Android 4.4 引入。5.0 + 默认 。AOT (预编译)执行的本地机器码。(和开发人员没关还是原来的操作)将 dex 通过 dex2oat编译

    Android 6.0 引入 7.0 进行混编 (Android N)JIT + AOT + Profile 。读取JIT 的配置文件Profile 记录的文件进行编译机器码过程。生成base.art 文件(Dalvik —>base.odex—>profile)程序判断是否有机器码 art文件,如果有就不需要在 dex 文件读取。直接加载art 机器码文件。

    补充相关知识点:Android 的加载路径

    ClassLoader
    BootClassLoader
    BaseDexClassLoader
    PathClassLoader
    DexClassLoader

    双亲委托机制,父类加载器,不是父类,是传入的父类成员的加载器 ,是一个责任链模式,这样做,安全和避免重复

    源代码执行:handleApplication ——》PathClassLoader

    热修复:动态类加载,反射。 需要在出现热修复代码加载之前的位置,进行修复。

    思路:

    1.获取当前应用的PathClassLoader
    2.DexPathList属性对象pathList
    3.反射修改pathList的dexElement[]

    把补丁包patch.dex 转化为dexElement (path)  可以插入到最前面
    获得pathList的dexElement 属性(old)
    patch+old 合并 并反射赋值给pathList的dexElement[]
    

    这只是一个环节,具体细节还很复杂,已经有很多成熟的框架
    美团,阿里和其他大厂都有分享。这里知识记录一个原理点

    相关文章

      网友评论

        本文标题:虚拟机 Dalvik 和 Art 理论笔记

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