今天介绍一个很是好用的反编译的工具 jadx 。jadx 的功能很是的强大,对我而言,基本上知足平常反编译需求。java
jadx 优势:git
这些优势都让 jadx 成为我反编译的第一选择,它能够处理大部分反编译的需求,基本上是我反编译工具的首选。github
接下来咱们就来看看,jadx 如何使用吧。算法
jadx 自己就是一个开源项目,源代码已经在 Github 上开源了。c#
Jadx Github :设计模式
有兴趣能够直接 clone 源代码,而后本地本身编译。可是多数状况下,咱们是须要一个编译好的版本。编译好的版本,能够在 sourceforge 上下载到。多线程
sourceforge 下载 jadx。编辑器
直接下载最新版就能够了,如今的最新版是 jadx-0.6.1 。下载好解压以后,你会得到这样的目录结构:
对于 Mac 或者 Linux,使用 jadx-gui ,Windows 下就须要使用 jadx-gui.bat 了,双击能够直接运行,若是有安全警告,忽略它就能够了。(后文主要以 Mac 环境为讲解,Windows 下的大部分操做都是相似的)
前面提到,直接双击 jadx-gui 就能够直接运行。运行以后,会启动一个 terminal ,在这里你能够看到你全部操做的输出,错误日志也会输出在这里。
打开以后,你能够选择一个 apk、dex、jar、zip、class、aar 文件,能够看到 jadx 支持的格式仍是挺多的,基本上编译成 Java 虚拟机能识别的字节码,它均可以进行反编译。除了选择一个文件,还能够直接将 apk 文件,拖拽进去,这一点很是好用。
我随便找了一个手边的 Apk ,丢进去,看看反编译后的效果。
这里面就是反编译后的代码了,对于 apk 而言,一些 xml 的资源,也一并被反编译还原回来了,很是的方便。
jadx 使用起来很是的方便,而提供的 gui 程序,也很好用。下面开始介绍 jadx-gui 程序的一些好用的技巧。
jadx 提供的搜索功能,很是强大,并且搜索速度也不慢。
你能够点击 Navigation -> Text Search 或者 Navigation -> Class Search 激活它,更方便的仍是快捷键,我本机的快捷键是 control + shift + f
,这个就因人而异了。
jadx 的搜索,支持四种维度,Class、Method、Field、Code,咱们能够根据咱们搜索的内容进行勾选,范围最大的就是 Code ,基本上就是文本匹配搜索。这里反编译的 Apk 集成了支付宝支付,因此能搜到 alipay 的内容。
有时候找到关键代码了,还想看看在哪些地方调用或者引用了它。
jadx 也提供了这方面的支持,找到咱们须要查看的类或者方法,选中点击右键,选择 Find Usage。
以后,它就会帮你搜索出,在这个项目中,哪些地方引用了它。
点击就能够直接跳转过去,很是的方便。
通常 Apk 在发布出去以前,都是会被混淆的,这基本上国内 App 的标配。这样一个类,最终会被混淆成 a.b.c ,方法也会变成 a.b.c.a() ,这样其实很是不利于咱们阅读。咱们很难看到一个 a.java 的文件,就肯定它是哪个,还须要根据包名来区分。
而 deobfusation 功能,能够为它们其一个特殊的名字,这样它在这个项目中,名字就惟一了,方便咱们识别和搜索。
这个功能能够在 Tools -> deobfusation 中激活。
接下来来看看它的效果。
开启 deobfusation 以后的效果以下:
能够看到,a 变成了 p003a。不知道这样看你以为有方便一些吗?
虽然,jadx-gui 能够直接阅读代码,仍是很方便的。可是毕竟没有咱们常见的编辑器来的方便。而正好 jadx 还支持将反编译后的项目,直接导出成一个 Gradle 编译的工程。
能够经过 File -> Save as gradle project 来激活这个功能。
最终输出的目录,是能够直接经过 Android Studio 打开的。
不过虽然 AS 能够直接打开它,可是大多数状况下你是编译不起来的。可是这样的功能,主要是为了借助 AS 强大的 IDE 功能,例如方法跳转、引用搜索等等,让咱们阅读起来更方便。
jadx 在使用过程当中,也会有一些错误状况,这里总结一些比较常见的错误。
有时候有代码,反编译的不完整,你会看到 JADX WARNING : inconsistent code 标志的错误。
这一段代码,就已经不是 Java 的代码了,不利于咱们的阅读。而 jadx 为了应对这样的状况,能够尝试开启 Show inconsistent code 开关。你能够在 File -> Preferences 中找到它。
开启 inconsistent code 以后,咱们再来看看这段代码,就感受亲切了。
这样处理的代码,大部分为伪代码,可能会有错误的地方,具体问题具体分析吧。
Preferences 中,还有不少开关,有兴趣的能够自行摸索一下。
jadx 反编译一些小的 Apk,一点压力都没有,可是对于一些比较重的 Apk,通常 Apk 大于 50MB 的,你均可能遇到使用 jadx 反编译的时候卡死的问题。
若是你看了 terminal 中 Log 输出,你应该能够发现,实际上它是由于 OOM 引发的。
官方对于这样由于内存不足引起的问题,也提供了一些解决方案。
一、减小处理的线程数。
jadx 为了加快编译的效率,因此是使用多线程处理的,而多个线程会耗费跟多的内存。因此减少反编译时候的线程数,是一个有效的方法。
若是使用命令行的话,可使用 -j 1
参数,配置线程数为 1,不配置的话,默认线程数为 4。
而使用 jadx-gui 的话,能够在 Preferences 中,经过配置 Processing threads count 来配置线程数。
二、修改 jadx 脚本
直接编辑 ./bin 目录下的 jadx 脚本,配置找到 DEFAULT_JVM_OPTS ,将它设置为 DEFAULT_JVM_OPTS="-Xmx2500M"
,就能够配置当前使用的内存大小。
若是是 Windows 系统,你须要编辑 jadx.bat 文件。
三、使用命令行命令
若是以上方式都很差用,在没有更好的办法的状况下,你能够直接使用命令行,经过 jadx 的命令进行放编译。并将线程数配置为 1 ,这样虽然慢一些,可是多数状况下,是能够正常输出反编译后的代码的。
举个例子:
jadx -d out -j 1 classes.dex
更过命令,能够经过 jadx -h
命令进行查看。
仔细看看 jadx 命令配置的参数,基本上均可以在 Preferences 中,找到对应的配置项,相互对照理解一下,应该不难发现它的使用方式。
jadx 确实很是的好用,到这里基本上已经把它的使用,都讲解清楚了。
你在反编译的过程当中,使用 jadx 有没有碰到什么问题?还有什么更好的工具推荐,能够在留言区给我留言,咱们一块儿讨论一下。
今天在承香墨影公众号的后台,回复『成长』。我会送你一些我整理的学习资料,包含:Android反编译、算法、设计模式、kotlin、虚拟机、Linux、Web项目源码。
推荐阅读: