Jadx
Android开发(/学习)有时候需要用到反编译工具,Window上有很多工具,而Mac上则不多,这里稍微介绍一下Mac上可用的反编译工具Jadx.
准备
clone 仓库,编译
mkdir jadx
git clone https://github.com/skylot/jadx.git
cd jadx
./gradlew dist #这个需要稍微等待一下
开始反编译
等完毕后,可以开始了,我就介绍个最简单最常用的用法
- 把apk改成zip
- 解压zip获取class.dex文件
- 将class.dex文件放到jadx目录下
cd build/jadx/
bin/jadx -d out class.dex # 反编译后放入out文件夹下(如果out不存在它会自动创建)
#or
bin/jadx-gui class.dex # 会反编译,并且使用gui打开
![](https://i-blog.csdnimg.cn/blog_migrate/9e7258cca277a962c9576247d48af51f.webp?x-image-process=image/format,png)
OK,就这样,后续还可以配置环境变量,更加方便.
引子
承接我的上一篇文章Android ClassyShark vs ApkTool,感谢读者@weishu的提醒,jadx是我遗漏的一个非常好用的android反编译gui工具。下面就来介绍下jadx工具。
首先给出jadx的github地址
使用方式
其实github上已经给出了很详细的使用说明。但是作者这里形式性地解读下吧(- -|)。
1.安装
依次运行以下命令:
git clone https://github.com/skylot/jadx.git
cd jadx
./gradlew dist
主要是拉下来jadx的git主工程,然后跑对应的gradle task。之后会生成运行脚本,大概就是多出了这个目录
![](https://i-blog.csdnimg.cn/blog_migrate/0e5b73a747e8bab91b612ffc3bc4f7d3.webp?x-image-process=image/format,png)
1.运行
cd build/jadx/
bin/jadx -d out lib/jadx-core-*.jar
#or
bin/jadx-gui lib/jadx-core-*.jar
以上命令是git给出的运行示例,主要就是反编译jadx源码的一个jar包。
由于之前文章对比classyShark 和apktool时用的是淘宝apk,那么这里继续用淘宝apk,便于三者的横向比较。
bin/jadx-gui taobao.apk
当然如果你不喜欢使用命令行外加找文件路径,你可以直接双击下图脚本文件即可
![](https://i-blog.csdnimg.cn/blog_migrate/4591751da665f6174fa4b4264d65b7f0.webp?x-image-process=image/format,png)
会弹出以下界面,对应选中你想反编译的.dex, .apk, .jar or .class即可(可以看到支持的格式还是很丰富的,赞)。
![](https://i-blog.csdnimg.cn/blog_migrate/f4bd53f37c554950d79d0f99d5e17c9c.webp?x-image-process=image/format,png)
选中淘宝apk,并且反编译完成后,结果如下:
![](https://i-blog.csdnimg.cn/blog_migrate/db1c294f56807e5ca02c835a4a30f85e.webp?x-image-process=image/format,png)
可以看到结果中即反编译了资源文件和源码,这个效果对比,apktool+dex2jar+jd-gui这三个工具集来说操作简便了太多。
结果横向对比(classyshark,apktool+dex2jar+jd-gui)
主要就是来对比下反编译后源码的可读性。同样选用com.taobao.allspark包下的AllsparkLoader来进行对比,用jadx反编译后的结果为:
![](https://i-blog.csdnimg.cn/blog_migrate/a27ff8064d0548be2a27e9f533357f9b.webp?x-image-process=image/format,png)
我们可以看到可读性非常高,要是去掉混淆的影响,已经很接近源码了!!!(细心的读者可以发现该gui还包含了一部分编译器的功能,很实用)
另外几个很赞的功能介绍
1.支持全局class查询
![](https://i-blog.csdnimg.cn/blog_migrate/ca4cfc4c4d5f18a99ea9ee71b185bd0c.webp?x-image-process=image/format,png)
2.支持全局text查询
![](https://i-blog.csdnimg.cn/blog_migrate/6e43ee09592ff5e8bf40983d4abe78ba.webp?x-image-process=image/format,png)
3.支持导出gradle工程(你可以用as直接看反编译的工程了)
![](https://i-blog.csdnimg.cn/blog_migrate/cab151451da45f7d4752100b7607459f.webp?x-image-process=image/format,png)
那么我们最终看看在as中打开导出工程后的结果:
![](https://i-blog.csdnimg.cn/blog_migrate/bcdc148632364deb6e1cbd4050f232b8.webp?x-image-process=image/format,png)
很赞对不对
Android反编译工具jadx的简单操作使用
Android上面的反编译工具很多,我个人比较喜欢jadx,操作简单,界面简洁。
下载jadx并解压,点击“bin”目录下面的“jadx-gui.bat”文件,出现下图所示的界面
![](https://i-blog.csdnimg.cn/blog_migrate/3283f99b8b88acbfbc3eefd10e1104b8.webp?x-image-process=image/format,png)
选中要反编译的apk文件后,界面变成下图所示
![](https://i-blog.csdnimg.cn/blog_migrate/b1216df242c5ca161d683ffb205deb82.webp?x-image-process=image/format,png)
任意点开一个类,我们就可以看到该类的源代码了
![](https://i-blog.csdnimg.cn/blog_migrate/d3aec4b787b978f61a61a3bda0574a9f.webp?x-image-process=image/format,png)
有的类的变量和方法名都变成了a,b,c,d。。。,如下图所示
![](https://i-blog.csdnimg.cn/blog_migrate/db5ec37a8ab2c0ca05c41a5156db04b0.webp?x-image-process=image/format,png)
这是由于Android工程进行了代码混淆
总结
看了以上之后,我们就来说下jadx对比classyshark和(apktool+dex2jar+jd-gui工具集)的优劣势吧。
优点:
1.操作方便快捷,一步到位
2.有较为完善的gui界面,带有较多实用功能
3.反编译代码可读性高
缺点:
1.没有classyshark类似的方法总数统计以及图形化分布界面
2.对比apktool直接反编译出来的资源文件有相应的缺失(这个有心的童鞋可以自己尝试下,这里就不给截图了)
总体来说jadx还是你反编译工具的最佳选择,当然有些时候可能还是需要你去配合使用,毕竟现在看来三者还是各有优劣的。