baksmali和smali源碼分析(三)

來源:互聯網
上載者:User

標籤:baksmali   apktool   

baksmali 的源碼分析

在baksmali進行源碼分析之前,需要讀者掌握一條主線,因為本身筆者只是由於項目需要用到這套源碼,在工作之餘的時間裡面來進行學習也沒有時間和精力熟讀源碼的每個檔案每個方法,但是依據這條主線,至少能夠猜出並且猜對baksmali裡面的源碼的檔案大概的作用是什麼,這樣在修改問題和移植的時候才能做到遊刃有餘。


這條主線是,baksmali其實只是利用了dexlib2提供的介面,將dex檔案讀入到一塊記憶體中,這塊記憶體或者說資料結構開闢的大小是跟輸入的dex檔案相關的,而這塊記憶體所映射的資料結構是一個列表形式的數組,以類為單位,將dex檔案全部解析出來,可以簡單理解為比如這個dex檔案中有100個類,這個數組就有100個對象,每個對象資料結構相同,但大小,內容各異。


baksmali通過 dexlib2提供的介面擷取到這個對象中以後,自己定義了一種檔案組織規則,當然這種組織規則也絕非無中生有,而是在指令方面遵循 google的dalvik 指令規範,在檔案組織方面遵循了 java jar包對於各個class的組織規範,自己在寄存器和函數組織方面有些自己的規則.


而這套規則也將來要跟smali這個產生dex檔案的工具一一對應。通過這樣的一種規則,baksmali 將擷取的對象產生了一個一個的smali檔案,讓冰冷的二進位的dex檔案變得栩栩如生,方便大家的閱讀。


以這條主線,我們來看一下baksmali源碼的檔案組織圖

baksmali源碼有50多個檔案,分別是由圖4 圖5 圖6 三副圖表示


650) this.width=650;" src="http://s3.51cto.com/wyfs02/M02/45/DD/wKioL1PslLOBZiDVAAJBGibopXM042.jpg" title="圖4.png" alt="wKioL1PslLOBZiDVAAJBGibopXM042.jpg" />

                                                               圖4


其中圖4 下面直接的四個檔案

baksmali.java
通過main函數得到dex檔案的記憶體布局,將其產生smali檔案

baksmaliOptions.java
產生smali檔案的一些選項設定檔


dump.java
類似與dexdump這個工具的作用,是在控制台輸出dex檔案中的各個段的資訊的函數,
本身和baksmali源碼無關


main.java  
主程式入口檔案,主要檢測參數,通過調用
//Read in and parse the dex file
DexBackedDexFile dexFile = DexFileFactory.loadDexFile(dexFileFile, options.apiLevel);
將dex映射到記憶體中去,然後再調用
baksmali.disassembleDexFile(dexFile, options);
這個函數來產生smali檔案



                     650) this.width=650;" src="http://s3.51cto.com/wyfs02/M01/45/DD/wKioL1PslO6wrw_6AAM0r4EWmfk102.jpg" title="圖5.png" alt="wKioL1PslO6wrw_6AAM0r4EWmfk102.jpg" />

                                                         圖5


圖5 中檔案眾多

為了能夠比較好的理解這些檔案的作用,這裡需要補充一點smali檔案產生的規則,smali檔案的產生其實
只有三種定義,對於一個smali檔案而言只有類,成員變數,和方法,對應與檔案來說就是

ClassDefinition.java
FieldDefinition.java
MethodDefinition.java

不管再複雜的類,baksmali源碼也認為一個類中只有這三種基本元素,當然產生一個類的時候是需要從

ClassDefinition.java 檔案中的writeTo寫起的,而在這過程中肯定有成員變數,而寫成員變數的時候
就需要從 FieldDefinition.java檔案中的 writeTo 寫起

當寫成員函數的時候就需要從 MethodDefinition.java 檔案中的 writeTo 寫起了

在理解了上面概念後,我用思維導圖畫了一下這個檔案夾下的檔案的組織形式,以供讀者整體理解
7


650) this.width=650;" src="http://s3.51cto.com/wyfs02/M00/45/DC/wKiom1PslFvBrJAFAAJrxp8o2QI512.jpg" title="圖7.png" alt="wKiom1PslFvBrJAFAAJrxp8o2QI512.jpg" />

                                                                 圖7



看完圖5的檔案夾了,再看圖6中的檔案,就很好理解了

650) this.width=650;" src="http://s3.51cto.com/wyfs02/M01/45/DD/wKioL1PslcCCsXViAAJZct85hWI375.jpg" title="圖6.png" alt="wKioL1PslcCCsXViAAJZct85hWI375.jpg" />

                                                           圖6



這個檔案夾下的檔案主要是實現產生smali檔案的時候的一些基礎資料型別 (Elementary Data Type)的寫入,比如

boolean類型的true和false

char 類型的寫入等等


ok 理解完了整個源碼的目錄組織,以及大部分檔案的作用,現在我們可以進入baksmali源碼,開始進行分析了





聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.