smali 方法

方法

调用方法的格式如下:

invoke-xxx {} , Lpackage/name/ObjectName;->methodName(I)Z

xxx 表示对不同类型的方法使用的不同的关键字。

{} 用于列出调用者(可能没有)和方法的参数

逗号后面的部分是方法的签名,分三部分:

第一部分表示类的签名。

第二部分是固定的:->

第三部分是方法签名:方法名(参数名)返回值

参数

调用时,存储于 {} 中的部分。

对于非静态方法 ,{} 中的第一个值表示调用者:即调用该方法的对象。后面的才是传入到方法中的各个参数

对于静态方法,{} 中的是传入到方法中的所有参数,不存在调用者 —— 因为静态方法没有调用者。


调用

实例方法

  1. invoke-virtual : 调用当前实例中被 public , protected 或没有修饰符的方法

  2. invoke-direct : 调用实例中被 private 修饰的方法

如:

    private void test() {
        testPrivate();  //  被 private 所修饰。以下三个方法类同。
        testDefault();   // 该方法没有任何修改符
        testProtected(); 
        testPublic();
    }

其对应的 smali 为:

.method private test()V
    .registers 1  # 只使用一个寄存器,用于存储 this

    .prologue
    .line 33
    invoke-direct {p0}, Lcom/demo/adapter/MainActivity;->testPrivate()V

    .line 34
    invoke-virtual {p0}, Lcom/demo/adapter/MainActivity;->testDefault()V

    .line 35
    invoke-virtual {p0}, Lcom/demo/adapter/MainActivity;->testProtected()V

    .line 36
    invoke-virtual {p0}, Lcom/demo/adapter/MainActivity;->testPublic()V

    .line 37
    return-void
.end method

静态方法

无论方法被何修饰词修饰,都只能通过 invoke-static 调用

父类方法

通过 invoke-super 调用父类方法

接口方法

通过 invoke-interface 调用接口中的方法


返回值

关键字 含义
return-void 没有返回值或者返回 void
return-object 返回一个对象的引用
return-wide 返回一个 64 位的非对象的值
return 返回一个 32 位的非对象的值

你可能感兴趣的:(smali 方法)