1. 程式人生 > >class檔案和dex檔案

class檔案和dex檔案

Class檔案

1、什麼是class檔案

能夠被JVM識別,載入並執行的檔案格式。

2、class檔案的生成

這裡寫圖片描述

3、如何生成一個class檔案(必須配置好java環境變數)

    通過IDE自定幫我們build
    手動通過javac去生成class檔案
    通過java命令去生成class檔案

這裡寫圖片描述

4、class檔案作用

    記錄一個類檔案的所有資訊,記住所有。例如記住了當前類的引用this、父類super等等。class檔案記錄的資訊往往比java檔案多。

5、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:類的方法資訊

6、class檔案的弊端

    記憶體佔用大,不適合移動端
    堆疊的加棧模式,載入速度慢。
    檔案IO操作多,類載入慢。

dex檔案

1、什麼是dex檔案

能夠被DVM或者Art虛擬機器執行並且載入的檔案格式。

2、dex檔案的生成(需要配置android的adb環境變數)

先生成class檔案(注意執行低版本的JDK版本,否則手機無法執行),然後執行:
dx --dex --output Test.dex Test.class
然後把生成的dex檔案拷貝到手機:
adb push C:\Users\Administrator\Desktop\Test.dex /storage/emulated/0
adb shell
dalvikvm -cp /sdcard/Test.dex Test

3、dex檔案的作用

 dex檔案的作用是記錄整個工程(通常是一個Android工程)的所有類檔案的資訊。

4、dex檔案的結構

    8位位元組的二進位制流檔案
    各個資料緊密排列,無間隙,減少了檔案體積,加快載入速度
    整個工程的類資訊都存放在一個dex檔案中(不考慮dex分包的情況下)

同樣的,可以通過010Editor來檢視dex檔案資訊:
這裡寫圖片描述
dex檔案的結構如下圖所示:
這裡寫圖片描述

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

dex檔案頭資訊的詳細資訊如下:
這裡寫圖片描述

class檔案與dex檔案的比較

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

結構對比圖如下:
這裡寫圖片描述