移动 前端 Python Android Java

虚拟机 Dalvik 和 Art 理论笔记

2020-06-15  本文已影响0人  zcwfeng

虚拟机分类:

目前,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[]

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

上一篇下一篇

猜你喜欢

热点阅读