今天在看熱修復時,文中多次提到smali文件,想簡單了解一下Smali是什么。
Smali文件是什么?
Android程序員用Java語言開發APP,編譯工具會將Java源文件(.java)編譯成Dalvik可執行文件(.dex)。Android系統中Dalvik Virtual Machine 會執行該文件。smali/baksmali則是Dalvik VM可執行文件的匯編器/反匯編器。反匯編Dalvik可執行文件(.dex)后,將會得到.smali后綴文件。smali代碼擁有特定的語法。
相比於.dex文件,smali文件的語法更容易理解些。下面是.dex文件、.smali文件、.java文件三者之間的轉化關系。
image
為什么要學會smali
當我們反編譯之后得到jar或者smali文件,android采用java語言開發,但是android系統使用自己的dalvik虛擬機,代碼編譯最終不是采用java的class,而是使用smali。因此我們反編譯得到的代碼,jar的話很多地方無法正確的解釋出來,如果我們反編譯的是smali則可以正確的理解程序的意思,因此學會smali十分有必要
將.java文件轉化成.dex文件,在Dalvik VM中來執行.dex文件
創建java文件
public class Foo{
public static void main(String [] args){
System.out.println("Hello, world!haha");
}
}
將.java轉換成.class文件
javac Foo.java
將.class轉換成.dex文件,由於需要安裝到設備,直接轉成.apk文件
這里需要用到sdk/build-tool/ 的dx工具
dx --dex --output=foo.apk Foo.class
安裝到設備上
adb push foo.apk /sdcard/
調用Dalvik VM執行foo.apk
adb shell
dalvikvm -cp /sdcard/foo.apk Foo
顯示如下結果:
執行foo.apk
.dex文件轉換成.smali文件
這里我們要用到一個工具smali.jar,點此下載
轉換.smali文件
.smali文件轉換成.dex文件
轉換.smali文件
作者:羅拙囈
鏈接:https://www.jianshu.com/p/fb9aec070c0a
來源:簡書
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。