1、Smile语法入门
Smali是Java虚拟机中的一种.dex格式文件汇编器,它采用一种宽松式的Jasmin/dedexer的语法,表达了.dex格式所有功能和信息,如果了解Smali语言基础,在我们反编译程序时就可以看出程序的大致代码,这对于分析竞品可能有所帮助,下面一起学习下Smali基础知识
- 原始类型映射关系:这里的映射关系和JNI中一致
- v :void ()
- Z:boolean
- B:byte
- S:short
- C:char
- I:int
- J:long
- F:float
- D:double
- 类的表示:smile中采用全路径的方式进行展示,如:Ljava/lang/String;
- L:表明此处表示类
- java/lang/String:类的全路径名称
- ;:类声明结束符号
- 数组表示:数组采用[+元素类型的方式,如[I 、[Ljava/lang/String
- [:表示声明数组
- I:表示数组的类型
- [[I:表示二维数组
- 对象的表示:对象的表示分为两部分,一部分是持有此对象类型的表示,第二部分是变量展示即变量名+变量类型,如: Ljava/lang/String; ——> FieldName : Ljava/lang/String;
- Ljava/lang/String;:类的全路径
- FieldName:对象名称
- Ljava/lang/String;:对象类型
- 方法表示:使用方法的所在类、方法名、方法签名表示,如 Ljava/lang/String; ——> method(III)V
- Ljava/lang/String;:类的全路径
- method:方法名称
- III:方法的传参类型,传入3个Int类型数据
- V :方法返回类型
- 方法参数:.param p1, “savedInstanceState” # Landroid/os/Bundle;
- .param:表示参数
- p1:寄存器
- “savedInstanceState":参数名称
- # Landroid/os/Bundle;:参数类型
- 寄存器:表示此方法在执行中需要的存储空间个位置
- 方法中声明使用寄存器个数
.registers 指令指定了方法中寄存器的总数
.locals 指令表明了方法中非参寄存器的总数,出现在方法中的第一行 - 方法的参数被放在最后几个寄存器中
1.1、Smile实战示例
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView textView = findViewById(R.id.textView);
}
@Subscribe
public void action(TypeEvent event) {