溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

baksmali和smali源碼分析(三)

發(fā)布時(shí)間:2020-08-04 07:38:37 來(lái)源:網(wǎng)絡(luò) 閱讀:1244 作者:sunzeduo 欄目:開(kāi)發(fā)技術(shù)

baksmali 的源碼分析

在baksmali進(jìn)行源碼分析之前,需要讀者掌握一條主線(xiàn),因?yàn)楸旧砉P者只是由于項(xiàng)目需要用到這套源碼,在工作之余的時(shí)間里面來(lái)進(jìn)行學(xué)習(xí)也沒(méi)有時(shí)間和精力熟讀源碼的每個(gè)文件每個(gè)方法,但是依據(jù)這條主線(xiàn),至少能夠猜出并且猜對(duì)baksmali里面的源碼的文件大概的作用是什么,這樣在修改問(wèn)題和移植的時(shí)候才能做到游刃有余。


這條主線(xiàn)是,baksmali其實(shí)只是利用了dexlib2提供的接口,將dex文件讀入到一塊內(nèi)存中,這塊內(nèi)存或者說(shuō)數(shù)據(jù)結(jié)構(gòu)開(kāi)辟的大小是跟輸入的dex文件相關(guān)的,而這塊內(nèi)存所映射的數(shù)據(jù)結(jié)構(gòu)是一個(gè)列表形式的數(shù)組,以類(lèi)為單位,將dex文件全部解析出來(lái),可以簡(jiǎn)單理解為比如這個(gè)dex文件中有100個(gè)類(lèi),這個(gè)數(shù)組就有100個(gè)對(duì)象,每個(gè)對(duì)象數(shù)據(jù)結(jié)構(gòu)相同,但大小,內(nèi)容各異。


baksmali通過(guò) dexlib2提供的接口獲取到這個(gè)對(duì)象中以后,自己定義了一種文件組織規(guī)則,當(dāng)然這種組織規(guī)則也絕非無(wú)中生有,而是在指令方面遵循 google的dalvik 指令規(guī)范,在文件組織方面遵循了 java jar包對(duì)于各個(gè)class的組織規(guī)范,自己在寄存器和函數(shù)組織方面有些自己的規(guī)則.


而這套規(guī)則也將來(lái)要跟smali這個(gè)生成dex文件的工具一一對(duì)應(yīng)。通過(guò)這樣的一種規(guī)則,baksmali 將獲取的對(duì)象生成了一個(gè)一個(gè)的smali文件,讓冰冷的二進(jìn)制的dex文件變得栩栩如生,方便大家的閱讀。


以這條主線(xiàn),我們來(lái)看一下baksmali源碼的文件組織結(jié)構(gòu)

baksmali源碼有50多個(gè)文件,分別是由圖4 圖5 圖6 三副圖表示


baksmali和smali源碼分析(三)

                                                               圖4


其中圖4 下面直接的四個(gè)文件

baksmali.java
通過(guò)main函數(shù)得到dex文件的內(nèi)存布局,將其生成smali文件

baksmaliOptions.java
生成smali文件的一些選項(xiàng)配置文件


dump.java
類(lèi)似與dexdump這個(gè)工具的作用,是在控制臺(tái)輸出dex文件中的各個(gè)段的信息的函數(shù),
本身和baksmali源碼無(wú)關(guān)


main.java  
主程序入口文件,主要檢測(cè)參數(shù),通過(guò)調(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);
這個(gè)函數(shù)來(lái)生成smali文件



                     baksmali和smali源碼分析(三)

                                                         圖5


圖5 中文件眾多

為了能夠比較好的理解這些文件的作用,這里需要補(bǔ)充一點(diǎn)smali文件生成的規(guī)則,smali文件的生成其實(shí)
只有三種定義,對(duì)于一個(gè)smali文件而言只有類(lèi),成員變量,和方法,對(duì)應(yīng)與文件來(lái)說(shuō)就是

ClassDefinition.java
FieldDefinition.java
MethodDefinition.java

不管再?gòu)?fù)雜的類(lèi),baksmali源碼也認(rèn)為一個(gè)類(lèi)中只有這三種基本元素,當(dāng)然生成一個(gè)類(lèi)的時(shí)候是需要從

ClassDefinition.java 文件中的writeTo寫(xiě)起的,而在這過(guò)程中肯定有成員變量,而寫(xiě)成員變量的時(shí)候
就需要從 FieldDefinition.java文件中的 writeTo 寫(xiě)起

當(dāng)寫(xiě)成員函數(shù)的時(shí)候就需要從 MethodDefinition.java 文件中的 writeTo 寫(xiě)起了

在理解了上面概念后,我用思維導(dǎo)圖畫(huà)了一下這個(gè)文件夾下的文件的組織形式,以供讀者整體理解
如圖7


baksmali和smali源碼分析(三)

                                                                 圖7



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

baksmali和smali源碼分析(三)

                                                           圖6



這個(gè)文件夾下的文件主要是實(shí)現(xiàn)生成smali文件的時(shí)候的一些基本數(shù)據(jù)類(lèi)型的寫(xiě)入,比如

boolean類(lèi)型的true和false

char 類(lèi)型的寫(xiě)入等等


ok 理解完了整個(gè)源碼的目錄組織,以及大部分文件的作用,現(xiàn)在我們可以進(jìn)入baksmali源碼,開(kāi)始進(jìn)行分析了





向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI