【问题标题】:.smali invoke-virtual & invoke-super.smali 调用虚拟和调用超级
【发布时间】:2014-05-08 03:13:48
【问题描述】:

我正在尝试基于 .smali 文件生成调用图。但是,我遇到了一个令人困惑的情况如下:

.super Landroid/graphics/drawable/Drawable;
.source "SBarExp.java"

.method public final setBounds(Landroid/graphics/Rect;)V
  .line 514
  iget-object v2, p0, Lcom/sds/android/ttpod/app/modules/skin/view/SeekBarExpansion$a;->b:Landroid/graphics/drawable/Drawable;
  invoke-virtual {v2, p1, v0, p3, v1}, Landroid/graphics/drawable/Drawable;->setBounds(IIII)V
  .line 515
  invoke-super {p0, p1, v0, p3, v1}, Landroid/graphics/drawable/Drawable;->setBounds(IIII)V
.end method

根据我的理解,“invoke-super”只是意味着它将调用一个父方法,所以“invoke-super {p0, p1, v0, p3, v1}, Landroid/graphics/drawable/Drawable;- >setBounds(IIII)V" 可以解释为 “Landroid/graphics/drawable/Drawable;->setBounds(IIII)V”?

如果是,我想知道“invoke-virtual {v2, p1, v0, p3, v1}, Landroid/graphics/drawable/Drawable;->setBounds(IIII)V”是否与“invoke -super {p0, p1, v0, p3, v1}, Landroid/graphics/drawable/Drawable;->setBounds(IIII)V"?

如果不是,有什么区别?如果是,为什么两次调用相同的方法(使用不同的方式)?

请帮忙,非常感谢!

【问题讨论】:

  • 您正在查看面向对象设计模式的底层实现,其中第一个参数通常指定主题对象,因此除其他外,我相信第一个参数的不同意味着第一个调用作用于不同的对象(可能保存在实例字段中),而第二个调用作用于自身。
  • 嗨,克里斯,感谢您的及时回复。那么,我可以这样理解吗:两个“调用”都在调用相同的方法(相同的类),只要它们传递不同的对象作为参数?

标签: java android smali


【解决方案1】:

invoke-virtual 使用与目标对象的类(即第一个参数的实际运行时类型)关联的 vtable 执行虚拟表查找。

但是,invoke-super 略有不同。它使用包含正在执行的方法的类的超类执行 vtable 查找。特别要注意,vtable 查找不使用也不依赖于目标对象的运行时类型。

在您的示例中,调用虚拟指令的结果是

iget-object v2, p0, Lcom/sds/android/ttpod/app/modules/skin/view/SeekBarExpansion$a;->b:Landroid/graphics/drawable/Drawable;

此时,实际调用的方法取决于 v2 的实际类型,可以是 Drawable 的任何子类。

invoke-super 指令在 p0 寄存器上被调用,它可能包含当前对象的“this”引用。但是, p0 的运行时类型实际上并不重要。无论 p0 的运行时类型如何,invoke-super 指令都会调用 Drawable 的 setBounds 实现。

【讨论】:

  • 您好,谢谢您的回复。因此,对于这种情况,invoke-super 将始终调用“Landroid/graphics/drawable/Drawable;->setBounds(IIII)V”,因为它不会考虑 p0 的运行时类型。但是 invoke-virtual 将调用不同的方法(取决于 v2 的类型)。就我而言,我的主要考虑是绘制调用图。所以,我还有一个疑问,我怎么知道调用虚拟程序最终调用了哪个确切的方法?感谢您的帮助!
  • 您必须使用静态分析来尝试确定此时 v2 可能的具体类型,并在每种可能的类型中为该方法添加一个边。
猜你喜欢
  • 1970-01-01
  • 2020-07-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-10
  • 2018-10-12
相关资源
最近更新 更多