MT官方博客
Always dream. Always explore.
MT官方博客

Dex编辑器++「查找调用处」功能说明

在Dex编辑器++的代码编辑器中,点击顶部工具栏的导航按钮,然后长按一个方法,即可看到「查找调用处」功能菜单。

https://blog.mt2.cn/wp-content/uploads/2020/09/Screenshot_2020-09-07-14-23-30-567_bin.mt_.plus_.ca_-1024x603.jpg

「查找调用处」功能正如它名字所说的那样,就是查找这个方法在哪里被调用了,但是有时候点击该功能菜单后,你可能会看到下面的提示:

https://blog.mt2.cn/wp-content/uploads/2020/09/Screenshot_2020-09-07-14-23-37-876_bin.mt_.plus_.ca_-1024x538.jpg

这里有些人可能就不太清楚为什么会有这个提示以及有什么区别,我们来看一段Java代码:

class A {
  public void print() {
    System.out.println("我来自A");
  }
}

class B {
  public void print() {
    System.out.println("我来自B");
  }
}

void invokeA(A a) {
  a.print();
}

void invokeB(B b) {
  b.print();
}

invokeA方法对应的smali代码为:

invoke-virtual {p0}, LA;->print()V

invokeB方法对应的smali代码为:

invoke-virtual {p0}, LB;->print()V

如果我们要查找A类的print方法的调用处,只需要在smali代码里搜索 LA;->print()V 就可以了。

但如果我把B类的代码改成下面这样呢?

class A {
  public void print() {
    System.out.println("我来自A");
  }
}

class B extends A {
}

void invokeA(A a) {
  a.print();
}

void invokeB(B b) {
  b.print();
}

改成这样子之后,invokeA方法和invokeB方法对应的smali代码是不变的,但我们知道invokeB方法最终会调用A类的print方法。

也就是说,在smali代码里,你看到的是调用了 LB;->print()V ,但实际上呢,它调用的是 LA;->print()V

所以,如果你要查找A类的print方法的调用,仅仅搜索 LA;->print()V 得到的结果很可能是不完整的,这时你还需要同时搜索 LB;->print()V

如果上面写的看不懂建议上网搜索有关Java继承、重写方法方面的知识,或者直接看最后面的结论。

那么回到开头的问题:

https://blog.mt2.cn/wp-content/uploads/2020/09/Screenshot_2020-09-07-14-23-37-876_bin.mt_.plus_.ca_-1024x538.jpg

引用上面例子来说明的话,如果你选择了否,那么仅仅会搜索 LA;->print()V,如果你选择了是,那么会同时搜索 LA;->print()VLB;->print()V,这样得到的搜索结果会更加准确。(反正没什么特殊需求都是建议选择是)

没有标签
首页      默认分类      Dex编辑器++「查找调用处」功能说明

MT官方博客

Dex编辑器++「查找调用处」功能说明
在Dex编辑器++的代码编辑器中,点击顶部工具栏的导航按钮,然后长按一个方法,即可看到「查找调用处」功能菜单。 「查找调用处」功能正如它名字所说的那样,就是查找这个方法在哪…
扫描二维码继续阅读
2020-09-07