- invoke-static 是类静态方法的调用,编译时,静态确定的;
- invoke-virtual 虚方法调用,调用的方法运行时确认实际调用,和实例引用的实际对象有关,动态确认的,一般是带有修饰符protected或public的方法;
- invoke-direct 没有被覆盖方法的调用,即不用动态根据实例所引用的调用,编译时,静态确认的,一般是private或<init>方法;
- invoke-super 直接调用父类的虚方法,编译时,静态确认的。
- invokeinterface 调用接口方法,调用的方法运行时确认实际调用,即会在运行时才确定一个实现此接口的对象。
一.函数调用
- smali中的函数和成员变量也分为两种,分别为 direct 和 virtual
两者的区别
1.direct method 是指private函数
2.virtual method 是指 protected和 public 函数
3.所以在调用函数时,有invoke-direct,invoke-virtual,另外还有invoke-static、invoke-super以及invoke-interface等几种不同的指令。
4.当然其实还有invoke-XXX/range 指令的,这是参数多于4个的时候调用的指令,比较少见
1.invoke-static
- 用于调用static函数
例如:
invoke-static {}, Lcom/aaa;->CheckSignature()Z
注意:invoke-static后面有一对大括号“{}”,其实是调用该方法的实例+参数列表,由于这个方法既不需参数也是static的,所以{}内为空
例如:
const-string v0, "NDKLIB"
invoke-static {v0}, Ljava/lang/System;->loadLibrary(Ljava/lang/String;)V
这个是调用static void System.loadLibrary(String)来加载NDK编译的so库用的方法
2.invoke-super
- 调用父类方法用的指令,一般用于调用onCreate、onDestroy等方法。
3.invoke-direct
-
调用private函数:
例如:
invoke-direct {p0}, Landroid/app/TabActivity;-><init>()V
这里init()就是定义在TabActivity中的一个private函数
4.invoke-virtual
- 用于调用protected或public函数,同样注意修改smali时不要错用invoke-direct或invoke-static
5.invoke-xxxxx/range
- 当方法的参数多于5个时(含5个),不能直接使用以上的指令,而是在后面加上“/range”,range表示范围,使用方法也有所不同