一,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. 字符串優化