copy : https://www.cnblogs.com/gordon0918/p/5466514.html
1、概述
Smali是Android系统中Dalvik虚拟机指令语言,在apk逆向过程中有许多工具可以把smali代码转化成java代码。但是在学习Smali语法的过程中,有时候需要进行java代码和smali代码的对照,如果可以把java代码转换成smali代码,学习起来岂不是很方便。于是网上搜了一把,很失望,都是各种转smali为java的工具。后来想了想,java变成smali不就是写android程序—>dex—>smali的过程嘛,然而java代码编译完是class文件,如何变成dex文件呢?后来在一本书中找到了答案,记录如下。
2、java代码转smali代码
把java代码转成smali代码共需要以下三个步骤
1、编译java代码为class文件
javac smaliTest.java
这个比较简单,会生成smaliTest.class文件
2、把class文件转成dex文件
我们知道apk包里java代码最后生成的是class.dex文件,把class转化成dex文件就需要用到android SDK提供的一个工具dx,该jar包位于android-sdk\build-tools\23.0.1\lib,找到该包后执行以下命令
java -jar dx.jar --dex --output=smaliTest.dex smaliTest.class
3、把dex转化成smali文件
这时候会使用到另外一个工具baksmali,该工具位于android-sdk\platform-tools\,找到该包后执行以下命令
java -jar baksmali.jar smaliTest.dex
OK,完成,此时会生成一个out目录,在out目录下的smaliTest.smali就是我们要看到的smali代码了
3、示例程序
java代码如下:
public class smaliTest { public static void main(String[] args){ System.out.println("hello smali"); } }
smali代码如下
.class LsmaliTest; .super Ljava/lang/Object; .source "smaliTest.java" # direct methods .method constructor <init>()V .registers 1 .prologue .line 3 invoke-direct {p0}, Ljava/lang/Object;-><init>()V return-void .end method .method public static main([Ljava/lang/String;)V .registers 3 .parameter .prologue .line 5 sget-object v0, Ljava/lang/System;->out:Ljava/io/PrintStream; const-string v1, "hello smali" invoke-virtual {v0, v1}, Ljava/io/PrintStream;->println(Ljava/lang/String;)V .line 6 return-void .end method