今天在看热修复时,文中多次提到smali文件,想简单了解一下Smali是什么。
Smali文件是什么?
Android程序员用Java语言开发APP,编译工具会将Java源文件(.java)编译成Dalvik可执行文件(.dex)。Android系统中Dalvik Virtual Machine 会执行该文件。smali/baksmali则是Dalvik VM可执行文件的汇编器/反汇编器。反汇编Dalvik可执行文件(.dex)后,将会得到.smali后缀文件。smali代码拥有特定的语法。
相比于.dex文件,smali文件的语法更容易理解些。下面是.dex文件、.smali文件、.java文件三者之间的转化关系。
为什么要学会smali
当我们反编译之后得到jar或者smali文件,android采用java语言开发,但是android系统使用自己的dalvik虚拟机,代码编译最终不是采用java的class,而是使用smali。因此我们反编译得到的代码,jar的话很多地方无法正确的解释出来,如果我们反编译的是smali则可以正确的理解程序的意思,因此学会smali十分有必要
将.java文件转化成.dex文件,在Dalvik VM中来执行.dex文件
创建java文件
public class Foo{
public static void main(String [] args){
System.out.println("Hello, world!haha");
}
}
将.java转换成.class文件
javac Foo.java
将.class转换成.dex文件,由于需要安装到设备,直接转成.apk文件
这里需要用到sdk/build-tool/ 的dx工具
dx --dex --output=foo.apk Foo.class
安装到设备上
adb push foo.apk /sdcard/
调用Dalvik VM执行foo.apk
adb shell
dalvikvm -cp /sdcard/foo.apk Foo
显示如下结果:
.dex文件转换成.smali文件
这里我们要用到一个工具smali.jar,点此下载