太好了 — 我给你一份图文(含流程图/命令/示例)+ 实操脚本的完整教程:
从工具准备、反编译(资源 & 代码)、修改、重打包到签名与安装,常见问题与防护/逆向对策也一起讲清楚。下面都是可复制粘贴的命令(Windows / macOS / Linux 都给到)。文中重要工具我附上官方/源码页作为参考链接。
法律与伦理提醒(必须看):反编译 APK 可能触及版权、服务条款或隐私法律,仅可用于 学习、安全测试(取得授权)或自己拥有源码的应用。未经授权用于篡改/分发/破解他人付费/付费解锁功能是违法行为,我不会帮助做违法分发或攻击。
一、概览(先看流程图 — ASCII 版)
APK (app.apk)
├─▶ 资源反编译 (apktool) ─┐
│ ├─ 修改 AndroidManifest/res/drawable/layout
│ └─ 重打包 -> unsigned.apk
│
└─▶ 代码反编译 (jadx / dex2jar+jd-gui / smali) ─┐
↓
(修改 Java/Smali) ──▶ 重打包/assemble
↓
zipalign -> apksigner/sign -> final_signed.apk
↓
安装 / 调试
二、准备:必须安装的工具(说明 + 官方页)
- jadx(Dex → Java 反编译器,GUI + CLI)。适合快速查看 Java 源码、资源、Manifest。(GitHub)
- apktool(资源 & smali 反编译/重编译)——用于修改布局、资源、Manifest、Smali 层级并重打包。(Apktool)
- dex2jar(dex → jar,配合 JD-GUI / IntelliJ 查看 .class)——备用方法,用于生成可在 Java 反编译器中更好看的代码。(GitHub)
- apksigner / zipalign(签名 / 对齐工具,来自 Android SDK build-tools)。用于给重打包的 APK 签名,确保手机能安装。(Android Developers)
- (可选)smali/baksmali(直接查看/修改 Dalvik 字节码)——当不能得到干净 Java 源时用 smali 级别修改。(GitHub)
(上面链接为工具主页 / github / 官方文档 — 我已经把它们找好了以便你下载并校验最新版本。)(GitHub)
三、环境安装(常见平台命令)
1) macOS / Linux(通用)
# Java 11+(jadx 要求 Java 11+)
sudo apt update
sudo apt install -y openjdk-17-jdk unzip wget
# jadx (下载 release .zip 并解压)
wget https://github.com/skylot/jadx/releases/latest/download/jadx-zip.zip -O jadx.zip
unzip jadx.zip -d ~/tools/jadx
export PATH="$PATH:~/tools/jadx/bin"
# apktool (linux/mac)
wget https://raw.githubusercontent.com/iBotPeaches/Apktool/master/scripts/linux/apktool -O apktool
chmod +x apktool
sudo mv apktool /usr/local/bin/
wget https://bitbucket.org/iBotPeaches/apktool/downloads/apktool_2.8.2.jar -O /usr/local/bin/apktool.jar
# 之后可用: apktool d app.apk
# dex2jar (可选)
wget https://github.com/pxb1988/dex2jar/releases/latest/download/dex2jar.zip -O d2j.zip
unzip d2j.zip -d ~/tools/dex2jar
export PATH="$PATH:~/tools/dex2jar"
# Android SDK build-tools(包含 apksigner, zipalign)
# 推荐用 sdkmanager 安装 build-tools(需安装 Android SDK)
sdkmanager "build-tools;33.0.2"
# 或在 Android Studio 的 SDK Manager GUI 安装
2) Windows(PowerShell)
- 从各自官网/Release 页下载 jadx.zip、apktool.bat/jar、dex2jar,配置 PATH。
- Android SDK 的
apksigner.bat在sdk\build-tools\<version>\apksigner.bat。
四、实战:三种常见反编译流程(每步都有命令)
A. 快速查看(只读) — 用 jadx GUI(推荐初学者)
- 打开
jadx-gui(双击或./bin/jadx-gui) - 拖入
app.apk,左侧资源树显示AndroidManifest.xml、res/、smali、sources(Java)。
优点:速度快、易读、直接搜索方法与字符串。适合快速浏览逻辑与敏感点(如加密/URL/API KEY)。(GitHub)
B. 资源层修改(布局、字符串、Manifest) — apktool(可重打包)
# 反编译资源与 smali
apktool d app.apk -o app_decoded
# 进入目录,修改 AndroidManifest.xml / res/layout / res/values/strings.xml 等
# 编辑完成后重打包:
apktool b app_decoded -o unsigned.apk
注意:apktool 默认输出为未签名 APK(unsigned.apk)。某些 APK 使用了资源混淆或私有签名方案,重打包后可能需要额外处理。(GitHub)
C. 代码层深度阅读/修改(Java/Smali)
方法 1:dex → jar → Java(dex2jar + JD-GUI / IntelliJ)
# 解压 APK 拿到 classes.dex(apk 是 zip)
unzip -p app.apk classes.dex > classes.dex
# dex2jar
d2j-dex2jar.sh classes.dex # 生成 classes-dex2jar.jar
# 用 JD-GUI / IntelliJ 打开 jar,查看 Java 源码(反编译)
dex2jar 的输出在某些复杂或被混淆的 dex 上可能有语法问题,但通常可以用于辅助理解。(GitHub)
方法 2:smali 编辑(当需要修改并重建字节码)
- apktool 在
app_decoded/smali/下生成 smali 文件,直接修改 smali 后用apktool b重打包即可。 - smali 语法是 Dalvik 字节码的可读表示,修改门槛稍高但更可靠(尤其是在无法还原 Java 的情况下)。
五、修改后打包、对齐与签名(能安装到设备的最终步骤)
- 用 apktool 重建后会生成
unsigned.apk(或dist/*.apk) - 使用
zipalign对齐(提高运行效率并符合 Play 要求):
zipalign -v -p 4 unsigned.apk aligned.apk
- 使用
apksigner签名(推荐 apksigner 而非 jarsigner):
# 生成临时 keystore(若已有 keystore 可跳过)
keytool -genkey -v -keystore my-release-key.jks -keyalg RSA -keysize 2048 -validity 10000 -alias myalias
# 签名
apksigner sign --ks my-release-key.jks --out signed.apk aligned.apk
# 验证签名
apksigner verify signed.apk
apksigner 来自 Android SDK build-tools,能生成在 Android 各版本检验通过的签名。(Android Developers)
六、调试技巧(动态分析 & 调试)
- adb logcat:安装后观察崩溃或日志输出。
- frida / frida-server(动态注入,hook 方法)用于运行时观察行为(需 root 或调试签名支持)。
- Android Studio:若能还原 gradle 项目结构,可用 Studio 调试(较少遇到)。
七、常见坑 & 解决办法
- 混淆(ProGuard / R8):反编译出的类名/方法名会被重命名(a.b.c…),需要结合
mapping.txt才能还原;没有 mapping 时只能靠语义与字符串逆推。 - Native 库(.so):JNI 层逻辑在 native 库中,Java 里只有 native 壳函数。需用 IDA/Ghidra/Hopper 或者 Frida 动态分析 native 行为。
- 资源(AAPT2)/签名校验:有些应用在运行时会校验签名或资源完整性(Signature pinning、checksum),重打包会触发保护,需要绕过校验或 patch smali。
- 多 dex(classes2.dex/…):一定要处理全部 dex。jadx 能自动解析多 dex。(GitHub)
八、实用小脚本(自动化常用流程:反编译 -> 修改 -> 重建 -> 签名)(Linux/macOS)
把下面脚本保存为 apk_rebuild.sh 并可修改变量:
#!/bin/bash
set -e
APK="$1"
OUTDIR="work"
KEYSTORE="my-release-key.jks"
ALIAS="myalias"
if [ -z "$APK" ]; then
echo "Usage: $0 app.apk"
exit 1
fi
# 反编译资源 & smali
apktool d "$APK" -o "$OUTDIR"
echo "请在 $OUTDIR 目录修改资源或 smali,修改完后按回车继续"
read
# 重建
apktool b "$OUTDIR" -o unsigned.apk
# 对齐
zipalign -v -p 4 unsigned.apk aligned.apk
# 签名
apksigner sign --ks "$KEYSTORE" --out signed.apk aligned.apk
echo "完成: signed.apk"
注意:脚本假设你已经有
my-release-key.jks,若没有可先用keytool生成。
九、示例场景(实操示例1:移除启动广告)
- 用 jadx 搜索
ad、splash、广告、initAd等关键词,定位广告初始化类。 - 如果是 Java 层:在 smali 或 Java 中注释或返回空实现(smali 修改更稳定)。
- apktool 重建 -> 签名 -> 安装测试。
(具体文件/方法名每个 APP 不同,需按实际代码判断。)
十、逆向防护 & 如何写更难被反编译的 APK(如果你是开发者)
- 启用 R8/ProGuard 混淆(混淆类/方法名)。
- 在关键逻辑使用 native(C/C++)实现,使逆向难度上升。
- 使用 代码完整性校验、签名校验、反调试与反注入检测(frida 检测)。
- 将敏感算法放在后端服务,不把密钥或敏感逻辑写在客户端。
十一、补充资源(官方/源码页)
- jadx — Dex to Java decompiler(GitHub)。(GitHub)
- Apktool — 反编译/重编译资源(官方)。(Apktool)
- dex2jar — dex ↔ jar(GitHub / SourceForge)。(GitHub)
- apksigner — Android 官方签名工具(Android docs)。(Android Developers)
十二、附图说明(我已经在文本里用流程图 & 代码示例 “附图化” 表示)
我可以继续为你做 真正的 PNG/SVG 步骤图、流程图和示例截图(把命令的截图、jadx GUI 的示意图、apktool 文件树图做成图片)。你想要哪一种(把图片打包成 ZIP / 放到图床 / 生成 PDF)?我可以立即为你生成:
- ① 流程图 PNG + 命令执行截图(适合教程贴)
- ② PDF 教程(含图片)(可直接下载打印)
- ③ 一套可执行的演示项目(带示例 APK)(仅演示授权或开源样例)
(你直接回复 1 / 2 / 3 / 全部,我马上把对应内容准备好。)