dex2jar源码解析之总体介绍(一)
dex2jar這個源碼包,聽名字是用來將dex文件轉換為java文件,在githup上面的地址是https://github.com/pxb1988/dex2jar
本地使用源碼:http://download.csdn.net/detail/new_abc/9718937
但我們分析這個源碼可以看到,里面的功能不只是將dex轉換為jar包,也可以轉換dex為smail文件等,這個后面在分析
dex2jar就是將dex文件轉換為class文件,然后class文件打成jar包
dex轉換為class文件過程中會先轉換為一種IR的中間指令格式
大概的轉換流程是上面這樣子的
中間主要 調用的函數(shù)接口如下
上面的是相應的Visitor訪問者,具體的處理都是調用里面的visitor相關的函數(shù)進行處理
然后看看主要的類圖
DexFileReader開始從dex文件中讀取內容,并調用里面的相應的函數(shù)處理讀取到的數(shù)據(jù),如acceptClass會解析一個類等
這里的話主要是一個Visitor相關的類關系圖
Dalvik指令格式
一段Dalvik匯編代碼由一系列Dalvik指令組成,指令語法由指令的位描述與指令格式標識來決定。位描述約定如下
 Dalvik指令對語法做了一些說明,它約定如下:
 ● 每條指令從操作碼開始,后面緊跟參數(shù),參數(shù)個數(shù)不定,每個參數(shù)之間采用逗號分開。
 ● 每條指令的參數(shù)從指令第一部分開始,op位于低8位,高8位可以是一個8位的參數(shù),也可以是兩個4位的參數(shù),還可以為空,如果指令超過16位,則后面部分一次作為參數(shù)
 ● 如果參數(shù)采用 “vX” 的方式表示,表示它是一個寄存器,如v0、v1等。這里采用v而不用r是為了避免與基于該虛擬機架構本身的寄存器名字產生沖突,如ARM架構寄存器命名采用r開頭。
 ● 如果參數(shù)采用 “#+X” 的方式表示,表明它是一個常量數(shù)字。
 ● 如果參數(shù)采用 “+X” 的方式表示,表明它是一個相對指令的地址偏移。
 ● 如果參數(shù)采用 “kind@X” 的方式表示,表明它是一個常量池的索引值。其中kind表示常量池類型,它可以是 “string” 字符串常量池索引)、“type”(類型常量池索引)、“field”(字段常量池索引)或者 “meth”(方法常量池索引)。● 每16位的字采用空格分隔開來。
 ● 每個字母表示4位,每個字母按順序從高字節(jié)開始,排列到低字節(jié)。每4位之間可能使用豎線 “|” 來表示不同的內容。
 ● 順序采用 A ~ Z 的單個大寫字幕作為一個4位的操作碼,op表示一個8位的操作碼。
 ● “Φ” 來表示這字段所有位為0值。
以指令格式 “A|G|op BBBB F|E|D|C” 為例
指令中間有兩個空格,每個分開的部分大小為16位,所以這條指令由三個16位的字組成。
第一個16位是 “A|G|op”,高8位由A與G組成,低字節(jié)由操作碼op組成。
第二個16位由 BBBB 組成,它表示一個16位的偏移值。
第三個16位分別由F、E、D、C 共4個4字節(jié)組成,在這里他們表示寄存器參數(shù)。
單獨使用位表示還無法確定一條指令,必須通過指令格式標識來指定格式的格式編碼。它的約定如下:
 ● 指令格式標識大多由三個字符組成,前兩個是數(shù)字,最后一個是字母。
 ● 第一個數(shù)字是表示指令有多少個16位的字組成。
 ● 第二個數(shù)字是表示指令最多使用寄存器的個數(shù)。特殊標記 “r” 標識使用一定范圍內的寄存器。
 ● 第三個字母為類型碼,表示指令用到的額外數(shù)據(jù)的類型。取值見如下表。
助記符 位大小 說 明
b 8 8位有符號立即數(shù)
c 16,32 常量池索引
f 16 接口常量(僅對靜態(tài)鏈接格式有效)
h 16 有符號立即數(shù)(32位或64位數(shù)的高值位,低值位為0)
i 32 立即數(shù),有符號整數(shù)或32位浮點數(shù)
l 64 立即數(shù),有符號整數(shù)或64位雙精度浮點數(shù)
m 16 方法常量(僅對靜態(tài)鏈接格式有效)
n 4 4位的立即數(shù)
s 16 短整型立即數(shù)
t 8, 16, 32 跳轉,分支
x 0 無額外數(shù)據(jù)
以指令格式標識22x 為例:
第一個數(shù)字2表示有2個16位字組成,第二個數(shù)字2表示指令使用到2個寄存器,第三個字母x表示沒有使用到額外的數(shù)據(jù)。
這里是dex轉ir用到的相關的一個類
這是轉換的指令,解析dex文件中的相應指令 轉換為這里的一個中間指令
這里是中間指令 轉為jvm中的指令,里面都有accept方法
這里用來把解析的dex轉換,用到Asm
這里是dex文件解析之后轉換為中間指令IR文件用到的visitor,前面的visitor是訪問dex文件的。
大概的類就上面這么多,畫這個圖主要是了解各個類之間的關系,要不然后面會有點糊涂。
作者:new_abc 來源:CSDN 原文:https://blog.csdn.net/new_abc/article/details/53736240總結
以上是生活随笔為你收集整理的dex2jar源码解析之总体介绍(一)的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 最大和 -- 最大子矩阵
- 下一篇: phpStudy中Xdebug设置 ph
