阿里P7移動互聯網架構師進階視頻(每日更新中)免費學習請點擊:https://space.bilibili.com/474380680java
Class文件
Class文件是Java虛擬機定義並被其所識別的文件格式,通俗地講,每個接口或者類對應一個Class文件。數據結構
Class文件格式
- Class文件是一組以8位字節爲基礎單位的的二進制流。
- 各數據項目之間沒有任何分隔符
- Class文件格式採用的結構只有兩種數據結構:無符號數和表。
- 無符號數:以u1,u2等表示1,2個字節的無符號數,無符號數可用於描述數字、索引引用、數量值、字符串值。
- 表:以多個無符號數或者表組成,一般以_info結尾,整個Class文件就是一張表。
Class文件的組成:
![8149969-99fc4fbc30b44e29.png](http://static.javashuo.com/static/loading.gif)
- 魔數:Class文件開始四個字節是魔數,用於驗證該文件是否能被虛擬機執行
- 版本號:魔數後四個字節則是Class文件的主版本號和次版本號
- 常量池:版本號後面緊跟着的則是常量池部分。常量池不一樣與java中,它是由1開始計數的,常量癡表的數目是常量個數減一。第0項爲保留項目,用於指示當前Class文件不須要引用任何一個常量池。常量池中主要包含兩大類常量:
- 字面量:包括文本字符串,被聲明爲final的常量值等。
- 符號引用:包括類和接口的權限定名,字段的名稱和描述符,方法的名稱和描述符
- 訪問標誌:常量池部分結束後則是訪問標誌部分,該部分包括信息:是類仍是接口,是否認義爲public,是否final,是否abstract等信息。
- 訪問標誌以後則是類索引,父類索引,接口索引集合部分,該部分的主要信息爲:該類的信息的索引,父類的信息的索引,實現接口的個數和對應接口信息的索引。(經過指向一個類型爲CONSTANT_Class_info的類描述符常量,從而在對應的常量池找到相關信息)
- 字段表:接下來的部分則是用於描述類聲明的變量信息,包括變量的做用域,是否爲static,是否爲final等信息。
- 方法表:方法表則是用於描述類中方法的信息,與字段表相似。
- 屬性表:屬性表在字段表和方法表中都會出現,主要用於描述某些場景特有的信息。好比方法是否拋出異常,被final聲明的變量的值,內部類列表等信息。
Dex文件
Dex是Android平臺上(Dalvik虛擬機,art虛擬機)的可執行文件,每一個APK壓縮包中都包含一個(或者多個MultiDex)Dex文件,Dex文件中包含了app的全部源碼。架構
Dex文件的結構
header
文件頭記錄了dex文件的一些基本信息, 以及大體的數據分佈。其各字段及解釋以下:orm
![8149969-bb5d9f9412a298c6.png](http://static.javashuo.com/static/loading.gif)
![8149969-7080fa1a1fe60730.png](http://static.javashuo.com/static/loading.gif)
索引區
索引區中索引了整個dex中的字符串、類型、方法聲明、字段以及方法的信息, 其結構體的開始位置和個數均來自dex文件頭中的記錄視頻
- 字符串索引區:描述dex文件中全部的字符串信息
- 類型索引區:描述dex文件中全部的類型, 如類類型、基本類型、返回值類型等
- 方法聲明索引區:描述dex文件中全部的方法聲明
- 字段索引區:描述dex文件中全部的字段聲明, 這個結構中的數據所有都是索引值, 指明瞭字段所在的類、字段的類型以及字段名稱
- 方法索引區:描述Dex文件中全部的方法, 指明瞭方法所在的類、方法的聲明以及方法名字
數據區
索引區中的最終數據偏移以及文件頭中描述的偏移都指向數據區, 還包括了即將要解析的class_def_itemblog
- class_def_item:這個結構由dex文件頭中的classDefsSize和classDefsOff所指向, 描述Dex文件中全部類定義信息, 每個DexClassDef中包含一個DexClassData的結構(classDataOff),每個DexClassData中包含了一個Class的數據, Class數據中包含了全部的方法, 方法中包含了該方法中的全部指令
Class文件和Dex文件對比