简介:面向Android逆向工程初学者与安全审计人员的APK反编译工具合集,围绕查看、修改与分析APK内部结构这一核心需求,整合了dex2jar、JD-GUI与Apktool三款经典组件,可用于应用调试、代码阅读与资源定制等场景。压缩包共109个文件,以28个jar核心程序、32个bat与30个sh跨平台启动脚本为主,辅以少量txt说明与cfg配置,整体约9.69MB,解压后即可按需调用。已有153人学习下载,适合希望动手实践反编译流程的开发者参考。资源覆盖从DEX转JAR、字节码还原为Java源码,到APK解包、资源修改与重新打包签名的完整链路,脚本化启动方式降低了环境配置门槛,便于读者快速理解Android应用的内部构成与运行逻辑,同时提醒使用者注意版权与合法授权边界。
1. 从一次装完打不开的翻车说起:apk 反编译环境到底要装什么
上周帮一个做安全审计的朋友配环境,他下载了号称“最新版”的 apk 反编译软件,双击安装一路下一步,结果打开就闪退,命令行敲apktool直接提示找不到 Java。折腾一晚上才发现,问题根本不在软件本身,而是 JDK 版本和 PATH 没配对。apk 反编译这套环境看着简单,实际上对 JDK 版本、工具链顺序、路径配置都挺挑,装不好就是各种玄学报错。这篇笔记记录我完整走一遍 apk 反编译环境搭建的过程,从 JDK 选型到 apktool、jadx、dex2jar 的安装配置,再到装坏了怎么救。适合刚接触 apk 逆向的新手照着走,也适合熟手对照版本差异和参数取舍。下面按我实际部署的顺序来,每一步都带命令和说明。
2. 装前先把 JDK 和工具链版本定死:apk 反编译的依赖清单
apk 反编译不是单个软件的事,它是一套工具链。核心成员有四个:apktool 负责资源解码和重打包,jadx 负责把 dex 转成可读的 Java 源码,dex2jar 配合 JD-GUI 做另一条反编译路线,再加上 JDK 本身。这四个东西的版本互相牵制,尤其是 JDK,装错了后面全白搭。
2.1 JDK 版本怎么选:8 还是 11 还是 17
我一般推荐 JDK 11 作为 apk 反编译环境的主力版本。原因很直接:apktool 2.7 以后的版本要求 Java 8 以上,jadx 1.4.x 在 JDK 11 上跑得最稳,而 JDK 17 虽然也能跑,但部分老版本 dex2jar 脚本里的反射调用会报InaccessibleObjectException,得手动加--add-opens参数才能过。新手别一上来就追最新 JDK 21,踩坑概率高。
如果你机器上已经有 JDK 8,也能用,但 jadx 新版本会提示版本过低。我的做法是装 JDK 11 并单独配一个JAVA_HOME,不覆盖系统默认的 JDK 8,用的时候切环境变量。Linux 下用 update-alternatives 管理多版本最省心:
# 安装 OpenJDK 11(以 Debian/Ubuntu 为例) sudo apt update sudo apt install -y openjdk-11-jdk # 查看已安装的 Java 版本 update-alternatives --list java # 手动切换默认 JDK 到 11 sudo update-alternatives --config java sudo update-alternatives --config javac这段命令的逻辑是先装 JDK 11,再用update-alternatives在多个 JDK 之间切换。--config java会列出所有已注册的 Java 路径,输入对应编号即可切换。装完必须验证java -version输出是 11.x,否则后面 apktool 调用的还是旧 JDK。Windows 用户对应做法是装完 JDK 后在系统环境变量里把JAVA_HOME指向 JDK 11 目录,并把%JAVA_HOME%\bin放到 PATH 最前面。
提示:
JAVA_HOME不要带结尾斜杠,Windows 下路径里有空格时不要加引号,这两点是最常见的配置错误。
2.2 工具链版本对照表
版本这块我给一张表,是我目前这套环境实际在用的组合,能跑通绝大多数 apk:
| 工具 | 推荐版本 | 作用 | 依赖 |
|---|---|---|---|
| JDK | 11.0.x | 运行时 | 无 |
| apktool | 2.9.x | 资源解码/重打包 | Java 8+ |
| jadx | 1.4.7 | dex 转 Java 源码 | Java 11+ |
| dex2jar | 2.4 | dex 转 jar | Java 8+ |
| JD-GUI | 1.6.6 | 查看 jar 源码 | Java 8+ |
apktool 和 jadx 是两条独立路线,不是必须都装。只做资源替换和重打包,apktool 一个就够;要看 Java 层逻辑,jadx 更顺手。dex2jar 加 JD-GUI 是备选方案,jadx 反编译失败时用它兜底。我一般三个都装,反正不冲突。
2.3 目录规划:别把工具散落一地
装之前先定目录,这是血泪经验。工具散落在下载目录里,过两个月自己都找不到。我习惯在用户目录下建统一工具目录:
# 建立统一工具目录 mkdir -p ~/tools/apk-reverse/{apktool,jadx,dex2jar,jd-gui} # 把工具目录加入 PATH(写入 ~/.bashrc) echo 'export PATH=$PATH:~/tools/apk-reverse/apktool:~/tools/apk-reverse/jadx/bin:~/tools/apk-reverse/dex2jar' >> ~/.bashrc source ~/.bashrc这里mkdir -p一次性建好四个子目录,echo ... >> ~/.bashrc把工具路径追加进环境变量,source让当前终端立即生效。注意 PATH 里写的是各工具的可执行文件所在目录,不是工具根目录,apktool 的 jar 和脚本放同一层,jadx 的可执行文件在bin子目录下,dex2jar 解压后脚本直接在根目录。路径写错是“命令找不到”的头号原因。
3. 逐个装到位:apktool、jadx、dex2jar 的安装与配置
环境定好之后进入实际安装。这一章按工具逐个来,每个都给下载、解压、配置、验证四步。装的时候注意顺序,先 apktool 再 jadx,因为 apktool 的 wrapper 脚本会依赖JAVA_HOME,先把它跑通,后面 jadx 出问题就好判断是 JDK 还是工具本身。
3.1 apktool 安装:wrapper 脚本和 jar 要配套
apktool 官方发布两个文件:apktool_x.x.x.jar和对应平台的 wrapper 脚本(Linux/macOS 是apktool,Windows 是apktool.bat)。很多人只下了 jar,直接java -jar apktool.jar也能用,但每次敲一长串很烦,wrapper 脚本就是帮你省这个事的。
# 进入 apktool 目录 cd ~/tools/apk-reverse/apktool # 下载 apktool jar 和 Linux wrapper 脚本(版本号按实际替换) curl -LO https://raw.githubusercontent.com/iBotPeaches/Apktool/master/scripts/linux/apktool curl -LO https://bitbucket.org/iBotPeaches/apktool/downloads/apktool_2.9.3.jar # 重命名 jar 为 apktool.jar,wrapper 脚本默认找这个名字 mv apktool_2.9.3.jar apktool.jar # 给脚本加执行权限 chmod +x apktool # 验证 apktool --versioncurl -LO里-L是跟随重定向,-O是用远程文件名保存。mv重命名这步不能省,wrapper 脚本里写死了找apktool.jar,名字不对就报Unable to access jarfile。chmod +x给脚本执行权限,漏了会提示 Permission denied。最后apktool --version输出2.9.3就算装好。
Windows 下把apktool.bat和apktool.jar放同一目录,把该目录加进 PATH,命令行敲apktool即可。注意 Windows 的 bat 脚本对路径里的空格敏感,工具目录别放“Program Files”这种带空格的地方。
注意:apktool 2.9.x 要求 Java 8 以上,但如果你系统默认是 JDK 17,wrapper 脚本里没有额外参数,跑老 apk 时可能报模块访问错误。稳妥做法是确保
JAVA_HOME指向 JDK 11。
3.2 jadx 安装:解压即用,重点在启动参数
jadx 是绿色版,下载 zip 解压就能用,不需要安装。它的可执行文件在bin目录下,有jadx(命令行)和jadx-gui(图形界面)两个。
# 进入 jadx 目录并下载 cd ~/tools/apk-reverse/jadx curl -LO https://github.com/skylot/jadx/releases/download/v1.4.7/jadx-1.4.7.zip # 解压 unzip jadx-1.4.7.zip -d . # 给可执行文件加权限 chmod +x bin/jadx bin/jadx-gui # 验证 jadx --versionunzip -d .表示解压到当前目录,jadx 的 zip 里直接是bin、lib结构,解压后bin/jadx就是入口。chmod +x两个文件都要加,只加jadx不加jadx-gui的话图形界面起不来。验证输出1.4.7即可。
jadx 启动时如果内存不够,大 apk 会卡死或 OOM。我一般改bin/jadx脚本里的DEFAULT_JVM_OPTS,把-Xmx调到 4G:
# 编辑 jadx 启动脚本,找到 DEFAULT_JVM_OPTS 行 # 将 -Xmx 默认值改为 4g DEFAULT_JVM_OPTS="-Xmx4g -XX:+UseG1GC"-Xmx4g是最大堆内存,-XX:+UseG1GC用 G1 垃圾回收器,处理几十 MB 的 dex 时比默认回收器稳。机器内存小于 8G 的话调到 2g 就够,别硬上 4g 导致系统 swap。
3.3 dex2jar 与 JD-GUI:备选路线的装法
dex2jar 同样是解压即用,下载 zip 解压后给d2j-dex2jar.sh加执行权限。JD-GUI 是图形化 jar 查看器,下载对应平台压缩包解压后直接运行。
# dex2jar cd ~/tools/apk-reverse/dex2jar curl -LO https://github.com/pxb1988/dex2jar/releases/download/v2.4/dex-tools-v2.4.zip unzip dex-tools-v2.4.zip -d . chmod +x d2j-dex2jar.sh # JD-GUI(Linux 版) cd ~/tools/apk-reverse/jd-gui curl -LO https://github.com/java-decompiler/jd-gui/releases/download/v1.6.6/jd-gui-1.6.6.jardex2jar 的d2j-dex2jar.sh是主脚本,chmod +x后可直接调用。JD-GUI 这里下的是 jar 版,用java -jar jd-gui-1.6.6.jar启动,也可以下带运行时的压缩包免装 Java。dex2jar 2.4 在 JDK 11 上跑没问题,JDK 17 下如果报反射错误,加--add-opens java.base/java.lang=ALL-UNNAMED到启动参数里。
3.4 环境变量收尾:PATH 和 JAVA_HOME 的最终检查
四个工具装完,最后统一检查环境变量。这一步最容易漏,装完当时能用,重开终端就失效,多半是只改了当前会话没写进配置文件。
# 检查 JAVA_HOME echo $JAVA_HOME # 检查 PATH 里是否包含各工具目录 echo $PATH | tr ':' '\n' | grep apk-reverse # 检查各命令是否可调用 which apktool jadx d2j-dex2jar.shecho $JAVA_HOME应输出 JDK 11 路径,为空说明没配。tr ':' '\n'把 PATH 按冒号拆行再 grep,能清楚看到工具目录在不在。which三个命令都有输出才算齐活。如果which找不到但目录确实在 PATH 里,多半是~/.bashrc改了没source,或者用的是 zsh 却改了 bashrc,检查~/.zshrc。
4. 避坑与排查:apk 反编译环境装坏后的救火记录
装这套环境我翻过的车不少,挑五条最典型的记下来,每条按现象、原因、解决写,照着对号入座能省不少时间。
4.1 现象:apktool 报 “java: command not found”
原因:wrapper 脚本靠系统 PATH 找 java,JDK 没装或 PATH 没配。解决:先java -version确认,没有就装 JDK 11,再把$JAVA_HOME/bin加进 PATH。如果 java 有但 apktool 还报这个,检查 wrapper 脚本第一行 shebang 是否被改坏。
4.2 现象:jadx 打开大 apk 直接卡死或 OutOfMemoryError
原因:默认堆内存太小,大 dex 撑爆。解决:改bin/jadx里DEFAULT_JVM_OPTS的-Xmx到 4g,同时确认系统物理内存够。还不行就用命令行jadx --no-res -d out app.apk跳过资源解码,只反编译代码,内存占用会降不少。
4.3 现象:dex2jar 在 JDK 17 下报 InaccessibleObjectException
原因:JDK 17 模块系统限制反射访问。解决:要么切回 JDK 11,要么在d2j-dex2jar.sh的 java 调用里加--add-opens java.base/java.lang=ALL-UNNAMED。我一般直接切 JDK 11,省得每个脚本都改。
4.4 现象:apktool 重打包后安装失败,提示签名不一致
原因:apktool 解包再打包会丢失原签名,直接装必然失败。解决:用keytool生成调试签名,apksigner重新签名后再装。这不是环境装坏,是流程没走完,新手常误以为是工具问题。
4.5 现象:命令当时能用,重开终端就 command not found
原因:PATH 只改了当前会话,没写进 shell 配置文件,或者写进了 bashrc 但当前用的是 zsh。解决:确认echo $SHELL,把 export 语句写进对应配置文件(bash 是~/.bashrc,zsh 是~/.zshrc),再source一次。这是最高频的“装好了又好像没装”问题。
5. 装完怎么验证跑通:拿一个 apk 走完整条链路
环境装完不能只看--version,得拿真实 apk 跑一遍才算数。我一般用自己写的一个小 demo apk 做验证,流程是 apktool 解包、jadx 反编译、dex2jar 兜底,三步都出结果才算环境真正可用。
5.1 三步验证命令
# 第一步:apktool 解包,验证资源解码链路 apktool d -f -o ./out_apktool demo.apk # 第二步:jadx 反编译,验证 dex 转 Java 链路 jadx -d ./out_jadx --no-res demo.apk # 第三步:dex2jar 兜底,验证备选链路 unzip -o demo.apk classes.dex -d ./tmp_dex d2j-dex2jar.sh ./tmp_dex/classes.dex -o ./out_dex2jar/classes.jarapktool d的-f是强制覆盖输出目录,-o指定输出路径,跑完out_apktool里应有AndroidManifest.xml、res、smali三个关键产物。jadx -d指定输出目录,--no-res跳过资源只反编译代码,跑完out_jadx/sources下应有按包名组织的.java文件。dex2jar 这步先用unzip从 apk 里抽出classes.dex,再转 jar,-o指定输出 jar 路径,产物能用 JD-GUI 打开看到类结构。
5.2 验证结果对照表
| 验证项 | 预期产物 | 异常表现 | 排查方向 |
|---|---|---|---|
| apktool 解包 | AndroidManifest.xml、res、smali | 报错或无 smali | JDK 版本、apktool.jar 是否配套 |
| jadx 反编译 | sources 下 .java 文件 | 空目录或 OOM | 堆内存、apk 是否加固 |
| dex2jar 转换 | classes.jar | 报 dex 格式错误 | dex 是否被抽取或加密 |
三步都出产物,说明工具链完整可用。如果 apktool 正常但 jadx 空目录,大概率是 apk 做了加固,dex 被抽到别处,这时候 jadx 反编译不出东西是正常的,得先脱壳,不是环境问题。这个区分很重要,别把加固 apk 的反编译失败算到环境头上。
5.3 我踩过的验证坑
有一次验证时 apktool 解包成功,jadx 也出了 java 文件,我以为环境完美,结果实际用的时候发现 jadx 反编译出来的代码里全是// decompilation error。后来才明白,验证不能只看“有没有产物”,得打开产物看内容质量。现在我每次装完环境,都会随机打开一个 java 文件确认里面有正常的方法体,而不是满屏错误注释。从那以后我每次配完 apk 反编译环境,都强制走一遍“解包看 smali、反编译看方法体、dex2jar 看类结构”三件套,缺一步都不算装完。希望这套流程能帮到你,少走我当年那些弯路。
本文还有配套的精品资源,点击获取