太好了 — 我给你一份图文(含流程图/命令/示例)+ 实操脚本的完整教程:
从工具准备、反编译(资源 & 代码)、修改、重打包到签名与安装,常见问题与防护/逆向对策也一起讲清楚。下面都是可复制粘贴的命令(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.batsdk\build-tools\<version>\apksigner.bat

四、实战:三种常见反编译流程(每步都有命令)

A. 快速查看(只读) — 用 jadx GUI(推荐初学者)

  1. 打开 jadx-gui(双击或 ./bin/jadx-gui
  2. 拖入 app.apk,左侧资源树显示 AndroidManifest.xmlres/smalisources(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 的情况下)。

五、修改后打包、对齐与签名(能安装到设备的最终步骤)

  1. 用 apktool 重建后会生成 unsigned.apk(或 dist/*.apk
  2. 使用 zipalign 对齐(提高运行效率并符合 Play 要求):
zipalign -v -p 4 unsigned.apk aligned.apk

  1. 使用 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

# 反编译资源 &amp; 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:移除启动广告)

  1. jadx 搜索 adsplash广告initAd 等关键词,定位广告初始化类。
  2. 如果是 Java 层:在 smali 或 Java 中注释或返回空实现(smali 修改更稳定)。
  3. 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 / 全部,我马上把对应内容准备好。)