博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
smali语法积累记录
阅读量:4982 次
发布时间:2019-06-12

本文共 1157 字,大约阅读时间需要 3 分钟。

1.constructor

我们知道运行一个类的时候会先调用static方法中的内容,比如:

static  {    System.loadLibrary("qihooTest");  }

为什么呢?

上面这段代码用smali语言写出来是这样的:

.method static constructor 
()V  #不带参数的构造方法 .locals 1 .prologue .line 64 const-string v0, "qihooTest" invoke-static {v0}, Ljava/lang/System;->loadLibrary(Ljava/lang/String;)V .line 65 return-void.end method

可以看到这个方法是作为构造方法出现的,而Java的构造方法在类运行时是要自动运行的。至于<cliinit>和<init>,。

 2.invoke-virtual和invoke-direct

 在做的时候,这个函数:

public void onClick(View paramView)      {        MainActivity.this.packageNameCheck();      }

原文件反编译出来后是:

invoke-direct {p0}, Lcom/qihoo/crack/MainActivity;->packageNameCheck()V

而看雪上人家修改后的这个函数反编译出来后,是:

invoke-virtual {p0}, Lcom/qihoo/crack/MainActivity;->packageNameCheck()V

一开始很疑惑,后来一想他们之间的不同,发现:

原来的类调用的packageNameCheck方法就在这个类中;而修改后的类继承了另外一个类,且packageNameCheck在父类中。

另外,书上写的:

invoke-virtual 或 invoke-virtual/range 调用实例的虚方法

invoke-super 或 invoke-super/range 调用实例的父类方法
invoke-direct 或 invoke-direct/range 调用实例的直接方法

由此猜想,invoke-virtual代表引用非本类中的方法(那invoke-super行不行呢?)。

 9月25日补充,在调用so的过程中通过另一个so作媒介也是需要把direct改成virtual的,详见上面的题目链接。

转载于:https://www.cnblogs.com/larrylawrence/p/3985464.html

你可能感兴趣的文章
字典dict
查看>>
iostat命令
查看>>
认清世界,认清自我,超凡脱俗
查看>>
在yii框架中如何连接数据库mongodb
查看>>
只 能处理少于 32766 个字符的字符串
查看>>
表达式语言之EL表达式
查看>>
需求分析
查看>>
解决Win7下网络应用只有进程没有界面的问题
查看>>
半监督学习(一)
查看>>
[置顶] SPL讲解(6)--Condition篇
查看>>
在MyEclipse中配置Weblogic10服务器
查看>>
浙江大学PAT上机题解析之2-11. 两个有序链表序列的合并
查看>>
java中equals和==的区别详解
查看>>
数据类型(字符串)
查看>>
Something about Swing
查看>>
设计模式看了又忘,忘了又看?
查看>>
hdu4465 2012 Asia Chengdu Regional Contest 概率期望计算+对数放大/缩小幂指数+对数还原...
查看>>
安装magento主题模板
查看>>
JZOJ.4732 函数
查看>>
Linux:重命名
查看>>