Android動態加載技術基礎之Class文件與Dex文件的結構

Class文件

Class文件是Java虛擬機定義并被其所識別的文件格式,通俗地講,每一個接口或者類對應一個Class文件。

Class文件格式

  • Class文件是一組以8位字節為基礎單位的的二進制流。
  • 各數據項目之間沒有任何分隔符
  • Class文件格式采用的結構只有兩種數據結構:無符號數和表。
    • 無符號數:以u1,u2等表示1,2個字節的無符號數,無符號數可用于描述數字、索引引用、數量值、字符串值。
    • 表:以多個無符號數或者表組成,通常以_info結尾,整個Class文件就是一張表。

Class文件的組成:

Class文件結構
  • 魔數: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文件的結構

  • Dex文件是一組以8位字節為基礎單位的的二進制流。
  • Dex文件的各數據項目之間也沒有任何分隔符
  • Dex文件由文件頭,索引區,數據區三個部分組成


    Dex文件結構
  • 其各個元素的解釋如下:
    • header:dex文件頭部,記錄整個dex文件的相關屬性
    • string_ids:字符串數據索引,記錄了每個字符串在數據區的偏移量
    • type_ids:類型數據索引,記錄了每個類型的字符串索引
    • proto_ids:原型數據索引,記錄了方法聲明的字符串,返回類型字符串,參數列表
    • field_ids:字段數據索引,記錄了所屬類,類型以及方法名
    • method_ids:類方法索引,記錄方法所屬類名,方法聲明以及方法名等信息
    • class_defs:類定義數據索引,記錄指定類各類信息,包括接口,超類,類數據偏移量
    • data:數據區,保存了各個類的真實數據
    • link_data:連接數據區

header

文件頭記錄了dex文件的一些基本信息, 以及大致的數據分布。其各字段及解釋如下:



索引區

索引區中索引了整個dex中的字符串、類型、方法聲明、字段以及方法的信息, 其結構體的開始位置和個數均來自dex文件頭中的記錄

  • 字符串索引區:描述dex文件中所有的字符串信息
  • 類型索引區:描述dex文件中所有的類型, 如類類型、基本類型、返回值類型等
  • 方法聲明索引區:描述dex文件中所有的方法聲明
  • 字段索引區:描述dex文件中所有的字段聲明, 這個結構中的數據全部都是索引值, 指明了字段所在的類、字段的類型以及字段名稱
  • 方法索引區:描述Dex文件中所有的方法, 指明了方法所在的類、方法的聲明以及方法名字

數據區

索引區中的最終數據偏移以及文件頭中描述的偏移都指向數據區, 還包括了即將要解析的class_def_item

  • class_def_item:這個結構由dex文件頭中的classDefsSize和classDefsOff所指向, 描述Dex文件中所有類定義信息, 每一個DexClassDef中包含一個DexClassData的結構(classDataOff),每一個DexClassData中包含了一個Class的數據, Class數據中包含了所有的方法, 方法中包含了該方法中的所有指令

Class文件和Dex文件對比

  • Class文件是JVM的執行文件,而Dex文件是安卓虛擬機(Dalvik,art)的執行文件
  • Class文件對應Java中每一個類,而Dex文件則包含整個APK文件中的JAVA代碼,故Dex文件可以大大縮小體積,減少Class文件的數據冗余,有利于在移動端中運行。(可以通過SDK中的dx命令將若干個Class文件轉化為Dex文件)
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,748評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,165評論 3 414
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,595評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,633評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,435評論 6 405
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,943評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,035評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,175評論 0 287
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,713評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,599評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,788評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,303評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,034評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,412評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,664評論 1 280
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,408評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,747評論 2 370

推薦閱讀更多精彩內容

  • (本文涉及的人物、場景、故事情節純屬虛構,請勿對號入座) 巧子家的農莊有一個雅致的名字——云廬。 正是秋高氣爽的時...
    壇壇香閱讀 743評論 0 5
  • 能和你越來越熟而幸福??
    2e692ccbd4d6閱讀 225評論 0 0
  • (一) 43歲的奚家齊遇到了愛情,不是33歲,也不是23歲。 當一個男人43歲的時候,他是不敢相信自己過了人生的大...
    噔噔嗨初一閱讀 518評論 0 0
  • 休假在家,和小孩一起玩耍,覺得特別有趣,可是臨近晚飯時間,寶貝越來越不乖。總是愛鬧情緒在地上亂踢。特別易怒。 自己...
    阿霜閱讀 119評論 0 1