为什么在smali代码中一个方法中多传了一个参数

Why one more parameter is passed in a method in smali code

在我通过 apktool 解码的一段 smali 代码中,我发现一个方法调用传递的参数比方法定义中声明的参数多一个。这个额外的论点绝对不会被使用。但是如果我删除它,当 运行 时会发生错误,从 "verifier" 说 "expected two, found three"。这是怎么回事?

# method definition
.method public setLatitude(D)V
    .locals 1
    #(snipped)
.end method

# method call
# v3 is not defined actually
invoke-virtual {v1, v2, v3}, LFoo;->setLongitude(D)V

所有非静态方法都接受调用该方法的对象作为第一个参数。

在您的示例中,该方法接受类型 D 的参数,这是一种采用 2 个寄存器的宽类型。在这种情况下,v1 是 LFoo;调用该方法的实例,[v2, v3] 是包含该方法的 64 位宽参数的寄存器对。

当你说 "v3 is not defined actually" 时,它会在设置 v2 时隐式设置,因为所有宽值都使用连续的寄存器对存储。