今天在看熱修復(fù)時(shí),文中多次提到smali文件,想簡(jiǎn)單了解一下Smali是什么。
Smali文件是什么?
Android程序員用Java語(yǔ)言開發(fā)APP,編譯工具會(huì)將Java源文件(.java)編譯成Dalvik可執(zhí)行文件(.dex)。Android系統(tǒng)中Dalvik Virtual Machine 會(huì)執(zhí)行該文件。smali/baksmali則是Dalvik VM可執(zhí)行文件的匯編器/反匯編器。反匯編Dalvik可執(zhí)行文件(.dex)后,將會(huì)得到.smali后綴文件。smali代碼擁有特定的語(yǔ)法。
相比于.dex文件,smali文件的語(yǔ)法更容易理解些。下面是.dex文件、.smali文件、.java文件三者之間的轉(zhuǎn)化關(guān)系。
image
為什么要學(xué)會(huì)smali
當(dāng)我們反編譯之后得到j(luò)ar或者smali文件,android采用java語(yǔ)言開發(fā),但是android系統(tǒng)使用自己的dalvik虛擬機(jī),代碼編譯最終不是采用java的class,而是使用smali。因此我們反編譯得到的代碼,jar的話很多地方無(wú)法正確的解釋出來(lái),如果我們反編譯的是smali則可以正確的理解程序的意思,因此學(xué)會(huì)smali十分有必要
將.java文件轉(zhuǎn)化成.dex文件,在Dalvik VM中來(lái)執(zhí)行.dex文件
創(chuàng)建java文件
public class Foo{
public static void main(String [] args){
System.out.println("Hello, world!haha");
}
}
將.java轉(zhuǎn)換成.class文件
javac Foo.java
將.class轉(zhuǎn)換成.dex文件,由于需要安裝到設(shè)備,直接轉(zhuǎn)成.apk文件
這里需要用到sdk/build-tool/ 的dx工具
dx --dex --output=foo.apk Foo.class
安裝到設(shè)備上
adb push foo.apk /sdcard/
調(diào)用Dalvik VM執(zhí)行foo.apk
adb shell
dalvikvm -cp /sdcard/foo.apk Foo
顯示如下結(jié)果:
執(zhí)行foo.apk
.dex文件轉(zhuǎn)換成.smali文件
這里我們要用到一個(gè)工具smali.jar,點(diǎn)此下載
轉(zhuǎn)換.smali文件
.smali文件轉(zhuǎn)換成.dex文件
轉(zhuǎn)換.smali文件