Java 代码转为Smali代码
由Java到Smali本来是不需要这么麻烦的,但是为了能对比研究Smali语法,所以,采取Java源代码一步一步编译成Smali代码,对比学习Smali的语法。
一、所需文件
JDK
下载地址: https://www.oracle.com/technetwork/java/javase/downloads/index.html
dx.jar,或者dx脚本
dx.jar 位于 SDK_HOME/build-tools/26.0.2/lib/dx.jar
dx脚本 位于 SDK_HOME/build-tools/26.0.2/dx
baksmali.jar
二、转换步骤
第一步:编写Java代码
以简单的Hello.jar为例
//Hello.java
public class Hello {
public int foo(int a, int b) {
return (a + b) * (a - b);
}
public static void main(String[] args) {
Hello hello = new Hello();
System.out.println("result is " + hello.foo(10, 20));
}
}
第二步:由 javac命令编译为 我们都熟知的.class文件
javac Hello.java
可以在当前目录下看到,已经Hello.class已经存在:
另外也可以添加-d参数,来指定class文件的存放路径
第三步:使用 dx.jar 生成dex文件
java -jar /Volumes/Dev/environment/Android/sdk/build-tools/26.0.2/lib/dx.jar --dex --output=Hello.dex Hello.class
有几点需要注意的地方:
–output=XX可以指定生成文件的名称和路径
java -jar SDK_HOME_/build-tools/26.0.2/lib/dx.jar
可以由SDK_HOME_/build-tools/26.0.2/dx
代替
然后来看下成果:
第四步:使用baksmali.jar 将dex转为我们最终的目标文件 smali文件
java -jar /Volumes/Dev/Develop/反编译/tool/baksmali-2.2.5.jar dis Hello.dex
也许是baksmali的作者更新了使用方法,我浏览过的文章所说的 basksmali -o XX
已经不能正常使用了,如果本文的参数也不能继续使用可以尝试使用
java -jar /Volumes/Dev/Develop/反编译/tool/baksmali-2.2.5.jar -h
查看最新的commond参数。
这样我们想要的Smali文件就生成了
三、Smali文件查看
smali文件查看我是使用的VsCode,包括Java代码的编写,命令行的操作均在VsCode 上操作完成。
VsCode下载地址:https://code.visualstudio.com/Download
Smali文件查看需要下载一插件,很简单,在VsCode插件中心搜索smali就可以了。 同时,右侧便是打开的smali文件。
四、结语
首先看一下最终的效果:左右两侧,可以对比查看两者的不同。
最后还是有带补充可提高的地方,记录一下:
本次一步一步记录了Java代码转换为Smali文件的过程,过程还是比较复杂的,但是为了方便了解转换过程,也是学习的过程。考虑后续可以写成脚本的形式。当然,脚本本人也是需要学习的…
另外VsCode配置Java的开发环境,也会单独出一篇文章,记录一下。