【Android】谈谈DexClassLoader
一,Dex和Jar
DEX 文件(Dalvik Executable)相较于普通的 JAR(Java 字节码 .class 文件)进行了多方面的优化,主要是为了适应 Android 设备的性能和资源限制(例如内存、存储空间和处理能力)。以下是 DEX 文件的一些具体优化点:
1. 内存占用优化
-
合并类文件:
-
DEX 文件将多个
.class
文件,即代码中多个java文件,合并到一个文件中,而不是像 JAR 文件那样每个java文件编译后生成多个独立的.class
文件。这减少了文件头和元数据的冗余,节省了空间。
-
-
共享常量池:
-
DEX 文件的常量池(constant pool)是全局共享的,而 JAR 文件中每个
.class
文件都有一个独立的常量池。在.class文件合并中,会提取常量,全局使用。 -
这种全局共享的机制可以消除重复的常量(如字符串、方法引用等),从而显著减少内存占用。
-
2. 指令集优化
-
基于寄存器的指令集:
-
DEX 使用的是基于寄存器的指令集,而 Java 字节码使用的是基于栈的指令集。
-
基于寄存器的指令集可以减少对栈的操作,指令数量更少,执行效率更高。
-
例如,在 Dalvik 虚拟机中,一个寄存器操作通常只需一条指令,而在 JVM 的栈模型中可能需要多条指令来完成同样的操作。
-
-
紧凑的指令编码:
-
DEX 文件的指令编码更加紧凑,指令长度通常为 16 位或 32 位,节省了可执行代码的体积。
-
3. 方法和字段的去重
-
方法引用去重:
-
DEX 文件将相同的函数签名(方法名、参数类型等)合并到一个引用表中,而不是在每个类中都重复存储。
-
-
字段引用去重:
-
类似于方法引用,字段(变量)也会被集中管理,避免重复存储。
-
4. 字符串优化