解决jadx的反编译卡顿和inconsistent code

jadx介绍

jadx 的功能非常的强大,它可以处理大部分反编译的需求。
jadx 优点:

  • 图形化的界面。
  • 拖拽式的操作。
  • 反编译输出 Java 代码。
  • 导出 Gradle 工程。
  • 反混淆

安装 jadx

Jadx Github :
https://github.com/skylot/jadx
直接下载最新版就可以了,现在的最新版是 jadx-0.6.1 。下载好解压之后,你会获得这样的目录结构:

inconsistent code

有时候有代码,反编译的不完整,你会看到 JADX WARNING : inconsistent code 标志的错误。

这一段代码,就已经不是 Java 的代码了,不利于我们的阅读。而 jadx 为了应对这样的情况,可以尝试开启 Show inconsistent code 开关。你可以在 File -> Preferences 中找到它。

开启 inconsistent code 之后,我们再来看看这段代码,就感觉亲切了。

这样处理的代码,大部分为伪代码,可能会有错误的地方,具体问题具体分析吧。

反编译错误或者卡顿

jadx 反编译一些小的 Apk,一点压力都没有,但是对于一些比较重的 Apk,一般 Apk 大于 50MB 的,你都可能遇到使用 jadx 反编译的时候卡死的问题。
如果你看了 terminal 中 Log 输出,你应该可以发现,实际上它是因为 OOM 引起的。

官方对于这样因为内存不足引发的问题,也提供了一些解决方案。

1、减少处理的线程数。

jadx 为了加快编译的效率,所以是使用多线程处理的,而多个线程会耗费跟多的内存。所以减小反编译时候的线程数,是一个有效的方法。

如果使用命令行的话,可以使用 -j 1 参数,配置线程数为 1,不配置的话,默认线程数为 4。

而使用 jadx-gui 的话,可以在 Preferences 中,通过配置 Processing threads count 来配置线程数。

2、修改 jadx 脚本

直接编辑 ./bin 目录下的 jadx 脚本,配置找到 DEFAULT_JVM_OPTS ,将它设置为 DEFAULT_JVM_OPTS=”-Xmx2500M” ,就可以配置当前使用的内存大小。(例如微信,我设置为5个G才跑完,不过貌似跑出来的结果不完整,不过总算是不会崩溃了)

3、使用命令行命令

如果以上方式都不好用,在没有更好的办法的情况下,你可以直接使用命令行,通过 jadx 的命令进行放编译。并将线程数配置为 1 ,这样虽然慢一些,但是多数情况下,是可以正常输出反编译后的代码的。

举个例子:

jadx -d out -j 1 classes.dex
jadx -e -j 1 input.apk
更多命令,可以通过 jadx -h 命令进行查看。