[轉]Smali淺析及dex,java互轉


今天在看熱修復時,文中多次提到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
來源:簡書
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM