虚拟机分类:
目前,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[]
这只是一个环节,具体细节还很复杂,已经有很多成熟的框架
美团,阿里和其他大厂都有分享。这里知识记录一个原理点
网友评论