###什麼是class檔案
class檔案是一種能夠被JVM識別,載入並且執行的檔案格式。
###class檔案的生成
很多語言都可以直接或者間接生成class檔案,如下圖所示:
######Tips:包括Kotlin、C++等等也能夠生成class檔案
下面舉例,我們有一個Hello.java:
public class Hello {
public static void main(String[] args) {
System.out.println("hello android");
}
}
複製程式碼
我們可以通過下面的命令去生成class檔案(IDE實際上幫我們封裝好了):
javac -target 1.6 -source 1.6 Hello.java
複製程式碼
通過下面的命令執行:
java Hello
複製程式碼
######Tips:通常為了相容低版本,例如Android系統,我們一般指定比較低版本的JDK,否則無法執行
###class檔案的作用
class檔案的作用是記錄一個類檔案的所有資訊。
例如記住了當前類的引用this、父類super等等。class檔案記錄的資訊往往比java檔案多。
###class檔案的結構
- 8位位元組的二進位制流檔案
- 各個資料緊密排列,無間隙,減少了檔案體積,加快載入速度
- 每個類或者介面單獨佔據一個class檔案,每個類單獨管理,沒有交叉
使用010Editor可以檢視class檔案的詳細資訊(注意需要安裝模板):
class檔案中的欄位如下所示:
magic 加密欄位,虛擬機器判斷當前的class檔案是否被篡改過
minor_version 支援最低版本的jdk
major_version 編譯使用的jdk版本
constant_pool_count 常量池的數量,一般為一個
cp_info constant_pool 常量池的結構體,數量不定(型別是cp_info結構體)
access_flags 訪問級別,例如public等
this_class 當前類
super_class 父類
interfaces_count 類實現介面的數量
fields_count 類成員變數的數量
methods_count 類方法的數量
method_info methods 類方法的結構體
attributes_count 類屬性的數量
attribute_info attributes 類屬性的結構體
複製程式碼
其中,access_flags如下:
constant_pool包括:
- CONSTANT_Integer_info、CONSTANT_Long_info、CONSTANT_String_info等等
- CONSTANT_Class_info:類的相關資訊,包括當前類、引用到的類的資訊
- CONSTANT_Fieldref_info:類的域資訊
- CONSTANT_Methodref_info:類的方法資訊
###class檔案的弊端
- 記憶體佔用大,不適合於移動端
- 堆疊的載入模式導致載入速度慢
- 檔案IO操作多,類查詢慢
###什麼是dex檔案
能夠被DVM或者Art虛擬機器執行並且載入的檔案格式。
###dex檔案的生成
先生成class檔案(注意執行低版本的JDK版本,否則手機無法執行),然後執行:
dx --dex --output Hello.dex Hello.class
複製程式碼
然後把生成的dex檔案拷貝到手機:
adb push C:\Users\nan\Hello.dex /sdcard/
複製程式碼
然後進入shell,執行:
dalvikvm -cp /sdcard/Hello.dex Hello
複製程式碼
###dex檔案的作用
dex檔案的作用是記錄整個工程(通常是一個Android工程)的所有類檔案的資訊。
###dex檔案的結構
- 8位位元組的二進位制流檔案
- 各個資料緊密排列,無間隙,減少了檔案體積,加快載入速度
- 整個工程的類資訊都存放在一個dex檔案中(不考慮dex分包的情況下)
同樣地,可以通過010Editor來檢視dex檔案資訊:
dex檔案的結構如下圖所示:
需要注意的是:
- 檔案頭包含了dex檔案的資訊,所有資料的大致分佈情況
- 連結資料區:主要是指so庫
dex檔案頭資訊的詳細資訊如下:
###class檔案與dex檔案的比較
- 本質上都是一樣的,都是二進位制流檔案格式,dex檔案是從class檔案演變而來的
- class檔案存在冗餘資訊,dex檔案則去掉了冗餘,並且整合了整個工程的類資訊。
結構對比圖如下:
###相關參考文章
如果覺得我的文字對你有所幫助的話,歡迎關注我的公眾號:
我的群歡迎大家進來探討各種技術與非技術的話題,有興趣的朋友們加我私人微信huannan88,我拉你進群交(♂)流(♀)。