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