class與dex檔案

小楠總發表於2017-12-21

###什麼是class檔案

class檔案是一種能夠被JVM識別,載入並且執行的檔案格式。

###class檔案的生成

很多語言都可以直接或者間接生成class檔案,如下圖所示:

class檔案生成.png

######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檔案.png

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如下:

訪問級別.png

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檔案資訊.png

dex檔案的結構如下圖所示:

dex檔案結構.png

需要注意的是:

  • 檔案頭包含了dex檔案的資訊,所有資料的大致分佈情況
  • 連結資料區:主要是指so庫

dex檔案頭資訊的詳細資訊如下:

dex檔案頭.png

###class檔案與dex檔案的比較

  • 本質上都是一樣的,都是二進位制流檔案格式,dex檔案是從class檔案演變而來的
  • class檔案存在冗餘資訊,dex檔案則去掉了冗餘,並且整合了整個工程的類資訊。

結構對比圖如下:

對比.png

###相關參考文章

blog.csdn.net/zhangjg_blo…

如果覺得我的文字對你有所幫助的話,歡迎關注我的公眾號:

公眾號:Android開發進階

我的群歡迎大家進來探討各種技術與非技術的話題,有興趣的朋友們加我私人微信huannan88,我拉你進群交(♂)流(♀)

相關文章