1、寫一個JAVA檔案
如果要分析smali檔案的文法格式,寄存器等内容,我們先應該拿一個簡單的案例來分析一下。在程式員的世界裡,一般最開始接觸到的是“Hello World!”,但這一次我們例外,因為是為了比較全面的了解smali檔案與java檔案之間的關聯,我們盡可能在一個簡單的類中,涉及更多的知識點。
下面,我們給出一個名為Hello的檔案,實作在main函數中調用一個fun()函數,如下:
public class Hello{
public int fun(int a,int b){
return (a+b)*(a-b);
}
public static void main(String[] args){
Hello hello = new Hello();
System.out.println(hello.fun(5,3));
}
}
2、編譯過程
2.1 java檔案到class檔案
相信學過JAVA的同學,對java檔案便以為class檔案,一定不會陌生如下的指令行:
經過編譯之後,我們會在同目錄下得到一個class檔案,如下:
2.2 class檔案到dex檔案
這裡我們使用如下指令:dx --dex --output=Hello.dex Hello.class,截圖如下:
2.3 dex檔案到smali檔案
3、得到Smali檔案
反編譯之後得到的smali檔案如下所示:
.class public LHello;
.super Ljava/lang/Object;
.source "Hello.java"
# direct methods
.method public constructor <init>()V
.registers 1
.prologue
.line 1
invoke-direct {p0}, Ljava/lang/Object;-><init>()V
return-void
.end method
.method public static main([Ljava/lang/String;)V
.registers 5
.prologue
.line 7
new-instance v0, LHello;
invoke-direct {v0}, LHello;-><init>()V
.line 8
sget-object v1, Ljava/lang/System;->out:Ljava/io/PrintStream;
const/4 v2, 0x5
const/4 v3, 0x3
invoke-virtual {v0, v2, v3}, LHello;->fun(II)I
move-result v0
invoke-virtual {v1, v0}, Ljava/io/PrintStream;->println(I)V
.line 9
return-void
.end method
# virtual methods
.method public fun(II)I
.registers 5
.prologue
.line 3
add-int v0, p1, p2
sub-int v1, p1, p2
mul-int/2addr v0, v1
return v0
.end method