-
代码热修复
查看全部 -
这个图片很棒呀.
查看全部 -
Android4.4以下版本采用Dalvik虚拟机,4.4及以上采用ART虚拟机。
1,在java.vm.version < 2.0.0(Dalvik虚拟机),在App运行过程中,Dex文件字节码经过JIT即时编译器动态的来编译成可执行的本地机器码,之后再执行,而且每次重新启动App都要经过一次这样的动态编译。这会导致应用启动慢,运行慢。
2,在java.vm.version >= 2.0.0(ART虚拟机),使用AOT提前编译,在App安装时就将Dex字节码预编译转为本地机器码(原生指令),生成一个可以在本地运行的oat文件并存储在本地。优点:启动快,运行快,好点少。其在系统层面已经支持了多dex文件的处理,在预编译时合并为oat文件。
查看全部 -
Dex里的Method ID采用ushort类型(两个字节)做标记,范围为0~65536,故方法数超限的数量为65536。
查看全部 -
代码热修复原理:
将补丁dex插入到pathList.dexElements中的首位,优先加载热修复补丁dex。
查看全部 -
编译期:
运行期:
- 判断java.vm.version是否需要dex文件处理
- davilk虚拟机:apk中二级dex文件解压到应用特定目录 -- 得到二级文件列表:SecondaryDexes -- 二级文件列表出入ClassLoader中
- 二级文件注入ClassLoader:首先反射获取PathClassLoader的pathList字段 -- pathList再次反射 -- 获取内部的dexElements字段 -- 为前期解压获取的二级dex文件:classes2.dex、classesN.dex文件生成对应的Elements数组 -- 最后将Elements元素追加到pathList.dexElements的尾部
- 后续需要加载某个类:遍历dexElements数组,挨个查找是否有要找的类。
查看全部 -
Dex安装
查看全部 -
Java类加载机制:
.class 文件 --> ClassLoader --> 类加载到虚拟机中,运行
Android类加载机制:
PathClassLoader加载.dex文件,找出在dex中要运行的类
查看全部 -
IS_VM_MULTIDEX_CAPABLE = isVMMultidexCapable(System.getProperty("java.vm.version"))
判断虚拟机是否支持multidex,根据java.vm.version判断,4.4及以上已经支持aot,安装时将字节码直接翻译成机器码,无需像jit即时编译每次重新打开app都要一遍将字节码翻译成机器码,再运行。
查看全部 -
MultiDex.install(this);
主要步骤:
判断虚拟机是否支持MultiDex
解压获取待安装的Dex文件列表
把Dex安装到ClassLoader中
查看全部 -
5.0以下开启multidex:
app build.gradle中添加MultiDexEnabled:true
添加implement com.android.support:multidex:1.0.3
Appcation的attachBaseContext中添加MultiDex.install(this)
查看全部 -
dex方法超限65535原因:因为多个class类文件中每个方法都对应一个id,而dex中定义方法的区域Constant Pool,存储着所有class类文件的定义集合,Constant Pool允许运行定义范围是0-65535共65536个,超出就会提示报错。
查看全部 -
dex是.class文件的集合,由很多个class文件压缩而来,去除很多class文件的冗余信息,便于移动设备执行。
查看全部 -
dex文件和dvm或art关系 --> .exe文件和windows系统的关系
5.0及以上开始支持多dex,5.0以下还是单dex
java文件 经javac ---> .class文件 经dx.jar---> .dex文件
查看全部 -
啦啦查看全部
举报