Android反编译需要以下两款工具
dex2jar—— 这个工具用于将 dex 文件转换成 jar 文件
jd-gui ——这个工具用于将 jar 文件转换成 java 代码
dex2jar.sh xxx.dex
如下图所示
资源反编译主要用到apktool工具
这个工具用于最大幅度地还原 APK 文件中的 9-patch 图片、布局、字符串等等一系列的资源。
步骤如下:
apktool.sh -d xxx.apk
如下图是apktool帮助功能打印出来的功能选项。
其中 d 是 decode 的意思,表示我们要对 xx.apk 这个文件进行解码。那除了这个基本用法之外,我们还可以再加上一些附加参数来控制 decode的更多行为:
-f 如果目标文件夹已存在,则强制删除现有文件夹(默认如果目标文件夹已存在,
则解码失败)。
-o 指定解码目标文件夹的名称(默认使用 APK 文件的名字来命名目标文件夹)。
-s 不反编译 dex 文件,也就是说 classes.dex 文件会被保留(默认会将 dex 文件解
码成 smali 文件)。
-r 不反编译资源文件,也就是说 resources.arsc 文件会被保留(默认会将resources.arsc 解码成具体的资源文件)。
original 文件夹下存放的是未经反编译过、原始的 AndroidManifest.xml 文件,res 文件夹下存放的是反编译出来的所有资源,smali 文件夹下存放的是反编译出来的所有代码, AndroidManifest.xml 则是经过反编译还原后的 manifest 文件。
这里值得一提的是smali文件夹,如果你进入到这个文件夹中你会发现它的目录结构和我们源码中 src 的目录结构是几乎一样的,主要的区别就是所有的
java 文件都变成了 smali文件。
smali文件其实也是真正的源代码,只不过它的语法和 java 完全不同,它有点类似于汇编的语法,是 Android 虚拟机所使用的寄存器语言如果懂 smali 的语法的话,就可以修改其中的代码,并且重新打包,生成一个盗版的 APP,不过这个APP需要重新签名,否则不能用。
apktool.sh -b Demo -o New_Demo.apk
这是一个开源工具,可以直接将apk反编译出java源码
github地址:
https://github.com/skylot/jadx.git
具体使用请参考工程下的ReadMe.md文件