[转]Smali浅析及dex,java互转


今天在看热修复时,文中多次提到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文件三者之间的转化关系。

image

为什么要学会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

显示如下结果:

执行foo.apk

.dex文件转换成.smali文件

这里我们要用到一个工具smali.jar,点此下载

转换.smali文件

.smali文件转换成.dex文件

转换.smali文件

作者:罗拙呓
链接:https://www.jianshu.com/p/fb9aec070c0a
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。