1、基本介绍
之前我们介绍过smali语法格式中的数据类型,包括基本数据类型,与引用数据类型(对象与数组),今天我们再介绍一下语法中的方法与字段。
2、方法
方法的表现形式为:
Lpackage/name/ObjectName;——>methodName(III)Z
解释说明:
Lpackage/name/ObjectName 表示类型
methodName 表示方法名
III 表示参数(这里表示为3个整型参数)
举例说明:
这里以Android开发中常见的onDestory()方法为例,这里是该方法的smali形式:
.method protected onDestroy()V
.locals 0
.prologue
.line 277
invoke-super {p0}, Lcom/disney/common/BaseActivity;->onDestroy()V
.line 279
return-void
.end method
注意:方法的参数是一个接一个的,中间没有隔开;
3、字段
字段的表示形式:
Lpackage/name/ObjectName;——>FieldName:Ljava/lang/String;
解释说明:
Lpackage/name/ObjectName;包名
FieldName:字段名
Ljava/lang/String;字段类型
举例说明:
java形式:public String url;
smali形式:.field public url:Ljava/lang/String;
4、完整示例
这里提供一个简单的带有方法的Hello类,通过反编译为smali类型,对比说明上面的解释:
Hello.java的源码如下所示:
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));
}
}
Hello.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
5、总结分析
Hello.smali中除了我们提到的数据类型,方法和字段之外,还涉及到了一些寄存器等方面的知识,但是这不是我们本次博文所讨论的重点,一次只要知晓一个知识点便可。在下一篇博文中,笔者将重点向读者介绍smali语法格式中的寄存器以及其他内容!