Smali淺析及dex,java互轉(zhuǎn)

今天在看熱修復(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文件
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容