baksmali 的源碼分析
在baksmali進(jìn)行源碼分析之前,需要讀者掌握一條主線,因?yàn)楸旧砉P者只是由于項(xiàng)目需要用到這套源碼,在工作之余的時間里面來進(jìn)行學(xué)習(xí)也沒有時間和精力熟讀源碼的每個文件每個方法,但是依據(jù)這條主線,至少能夠猜出并且猜對baksmali里面的源碼的文件大概的作用是什么,這樣在修改問題和移植的時候才能做到游刃有余。
這條主線是,baksmali其實(shí)只是利用了dexlib2提供的接口,將dex文件讀入到一塊內(nèi)存中,這塊內(nèi)存或者說數(shù)據(jù)結(jié)構(gòu)開辟的大小是跟輸入的dex文件相關(guān)的,而這塊內(nèi)存所映射的數(shù)據(jù)結(jié)構(gòu)是一個列表形式的數(shù)組,以類為單位,將dex文件全部解析出來,可以簡單理解為比如這個dex文件中有100個類,這個數(shù)組就有100個對象,每個對象數(shù)據(jù)結(jié)構(gòu)相同,但大小,內(nèi)容各異。
baksmali通過 dexlib2提供的接口獲取到這個對象中以后,自己定義了一種文件組織規(guī)則,當(dāng)然這種組織規(guī)則也絕非無中生有,而是在指令方面遵循 google的dalvik 指令規(guī)范,在文件組織方面遵循了 java jar包對于各個class的組織規(guī)范,自己在寄存器和函數(shù)組織方面有些自己的規(guī)則.
而這套規(guī)則也將來要跟smali這個生成dex文件的工具一一對應(yīng)。通過這樣的一種規(guī)則,baksmali 將獲取的對象生成了一個一個的smali文件,讓冰冷的二進(jìn)制的dex文件變得栩栩如生,方便大家的閱讀。
以這條主線,我們來看一下baksmali源碼的文件組織結(jié)構(gòu)
baksmali源碼有50多個文件,分別是由圖4 圖5 圖6 三副圖表示
圖4
其中圖4 下面直接的四個文件
baksmali.java
通過main函數(shù)得到dex文件的內(nèi)存布局,將其生成smali文件
baksmaliOptions.java
生成smali文件的一些選項(xiàng)配置文件
dump.java
類似與dexdump這個工具的作用,是在控制臺輸出dex文件中的各個段的信息的函數(shù),
本身和baksmali源碼無關(guān)
main.java
主程序入口文件,主要檢測參數(shù),通過調(diào)用
//Read in and parse the dex file
DexBackedDexFile dexFile = DexFileFactory.loadDexFile(dexFileFile, options.apiLevel);
將dex映射到內(nèi)存中去,然后再調(diào)用
baksmali.disassembleDexFile(dexFile, options);
這個函數(shù)來生成smali文件
圖5
圖5 中文件眾多
為了能夠比較好的理解這些文件的作用,這里需要補(bǔ)充一點(diǎn)smali文件生成的規(guī)則,smali文件的生成其實(shí)
只有三種定義,對于一個smali文件而言只有類,成員變量,和方法,對應(yīng)與文件來說就是
ClassDefinition.java
FieldDefinition.java
MethodDefinition.java
不管再復(fù)雜的類,baksmali源碼也認(rèn)為一個類中只有這三種基本元素,當(dāng)然生成一個類的時候是需要從
ClassDefinition.java 文件中的writeTo寫起的,而在這過程中肯定有成員變量,而寫成員變量的時候
就需要從 FieldDefinition.java文件中的 writeTo 寫起
當(dāng)寫成員函數(shù)的時候就需要從 MethodDefinition.java 文件中的 writeTo 寫起了
在理解了上面概念后,我用思維導(dǎo)圖畫了一下這個文件夾下的文件的組織形式,以供讀者整體理解
如圖7
圖7
看完圖5的文件夾了,再看圖6中的文件,就很好理解了
圖6
這個文件夾下的文件主要是實(shí)現(xiàn)生成smali文件的時候的一些基本數(shù)據(jù)類型的寫入,比如
boolean類型的true和false
char 類型的寫入等等
ok 理解完了整個源碼的目錄組織,以及大部分文件的作用,現(xiàn)在我們可以進(jìn)入baksmali源碼,開始進(jìn)行分析了
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點(diǎn)與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。
分享題目:baksmali和smali源碼分析(三)-創(chuàng)新互聯(lián)
文章出自:http://www.2m8n56k.cn/article14/dhiege.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供全網(wǎng)營銷推廣、網(wǎng)頁設(shè)計公司、小程序開發(fā)、做網(wǎng)站、品牌網(wǎng)站設(shè)計、自適應(yīng)網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:[email protected]。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容