smali语法之方法与字段

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 ()V
    .registers 1

    .prologue
    .line 1
    invoke-direct {p0}, Ljava/lang/Object;->()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;->()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语法格式中的寄存器以及其他内容!



你可能感兴趣的:(Android反编译与逆向,android开发,methods,string)