第4章 dex檔案格式 第三節
1、 環境配置
ubuntu 15.10 系統 ip:192.168.153.130
理解dex檔案整體結構
一、dex檔案整體結構
1、 dex檔案由7個部分組成。dex header為dex檔案頭,它指定了dex檔案的一些屬性,並記錄了其他6部分資料結構在dex檔案中的物理偏移。string_ids到class_def結構可以理解為「索引結構區」,真實的資料存放在data資料區,最後link_data為靜態鏈結資料區,對於目前生成dex檔案而言,它始終為空。
dex header
string_ids
type_ids
proto_ids
field_ids
methon_ids
class_ids
data
link_data
2、 dex檔案結構如下:
structdexfile ;
1)magic欄位標識了乙個有效的dex檔案,目前它的值固定為「64 65 78 0a 30 33 35 00」,轉換為字串為「dex.035」。
2)chencksum段為dex檔案的校驗和,通過它來判斷dex檔案是否被損壞或修改。
3)signature欄位用來識別最佳化之間的dex檔案,checksum欄位與signature欄位將dexopt驗證與優化。
4)filesize欄位記錄了包括dexheader在內的整個dex檔案的大小。
5)headersize欄位記錄了dexheader結構本身占用的位元組數,目前它的值為0x70。
6)endiantag欄位指定了dex執行環境cpu位元組序,預設值endian_constant等於0x12345678,表示預設採用little-endian位元組序。
7)linksize欄位與stringldsoff欄位指定鏈結段的大小與檔案偏移,大多數情況下它們的值為0。
8)mapoff欄位指定了dexmaplist結構的檔案偏移。
9)其他字段分別表示dexstringid、dextypeid、dexprotoid、dexfieldid、dexmethonid、dexclassdef以及資料段的大小與檔案偏移。
4、 dexheader結構下面的資料為「索引結構區」 與「資料區」,「索引結構區」中各資料結構的偏移位址都是從dexheader結構的stringidsoff~classdefsoff欄位的值指定的,它們並非真正的類資料,而是指向dex檔案的data資料區的偏移或資料結構索引。(dexdata欄位,實際上是ubyte位元組陣列,包含了程式所有使用到的資料)
二、dex檔案結構分析
1、 dalvik虛擬機器解析dex檔案的內容,最終將其對映成dexmaplist資料結構。dexheader結構的mapoff欄位指明了dexmaplist結構在dex檔案中的偏移,宣告如下。
struct dexmaplist;
2、size 字段表示接下來有多少個dexmapitem結構,dexmapitem的結構宣告如下。
struct dexmapitem ;
2、 type欄位為乙個列舉常量,如下所示名稱,通過型別很容易判斷它的具體型別。
enum;
dexmapitem中的size欄位指定了特定型別的個數,它們以特定的型別在dex檔案中連續存放。offset為該型別的檔案起始偏移位址。以hello.dex為例,dexheader結構的mapoff欄位為0x290,讀取0x290處的乙個雙字值為0x0d,表明接下來會有13個dexmapitem結構。使用
hexdump –c
命令開啟
hello.dex,如下圖:
注意:通過
dexmapitem
定義可以發現:這個定義的像類、字串、方法等資源和
dex檔案頭里定義的型別有很多是一樣的。其實這個
map的資料,就是頭里型別的重複,完全是為了檢驗作用而存在的。當
andriod
系統載入
dex檔案時,如果比較檔案頭型別個數與
map裡型別不一致時,就會停止使用這個
dex檔案。
APUE 第4章 檔案和目錄
函式列表 1。stat fstat和lstat函式 struct stat mode t st mode ino t st ino dev t st dev dev t st rdev nlink t st nlink uid t st uid gid t st gid off t st size ...
第4章 整合
4.1 尋找理想的整合技術的指導原則 避免服務方修改乙個欄位就引起消費方的修改 保證api的技術無關性 消費方應該能夠很簡單的使用服務方提供的服務,提供客戶端庫的做法會增加耦合。隱藏內部實現細節 4.2 musiccorp建立使用者介面 4.3 共享資料庫 資料庫整合 即消費者直接訪問資料庫 的缺點...
第4章 陣列
1 陣列儲存的是相同型別的一組元素 double arr 2 陣列的定義型別可以是任意型別,包含基本型別或引用型別 string arr person arr int arr person arr 3 陣列屬於引用型別,引用儲存在棧中,值儲存在堆中,又稱為物件。4 陣列的成員如果不賦值,有預設值。b...