apktool vs. jadx / apktool d
在开始之前,请务必理解 apktool 的主要作用:

apktool: 它是一个资源解码和回编译工具,它能将 APK 文件解包,解码其中的资源文件(如AndroidManifest.xml,res/目录布局,resources.arsc等),并将其还原为易于阅读和修改的格式(如smali代码,xml文件),修改后,你可以用apktool b重新打包成 APK。jadx/Ghidra/dex2jar+jd-gui: 这些是代码反编译工具,它们主要将 APK 中的classes.dex文件反编译成可读的 Java 代码(.java文件)。
最佳实践通常是两者结合使用:
- 用
apktool解包,用于修改资源、布局、AndroidManifest.xml 或进行Smali 层级的代码修改。 - 用
jadx打开 APK,用于阅读和理解 Java 层的业务逻辑。
apktool 安装与环境准备
在运行命令前,请确保你已经安装了 Java JDK (JRE 不够) 并配置了环境变量。
下载 apktool
- 访问 官方发布页面。
- 下载最新版本的
apktool.jar和对应平台的apktool.bat(Windows) 或apktool(macOS/Linux)。 - 将这两个文件放在同一个目录下,
C:\apktool,并将该目录添加到系统的PATH环境变量中,方便全局调用。
验证安装 打开命令行(CMD 或 PowerShell),输入:

apktool -version
如果显示版本号,说明安装成功。
apktool d (Decompile / 解包) 命令详解
这是反编译的核心命令,基本格式为:
apktool d <输入文件.apk> [选项]
常用参数详解
| 参数 | 全称 | 描述 | 示例 |
|---|---|---|---|
-f |
force | 强制覆盖,如果目标输出目录已存在,apktool 默认会拒绝操作,使用此参数可以强制删除并重建目录。 |
apktool d myapp.apk -f |
-o |
output | 指定输出目录,默认情况下,apktool 会在当前目录下创建一个与 APK 文件名同名的文件夹,使用此参数可以自定义文件夹名。 |
apktool d myapp.apk -o myapp_decoded |
-p |
framework-dir | 指定框架路径,用于处理使用了特殊 SDK 或框架的 APK(如 Google Play Services, 微信等),你需要提供一个包含相应 framework-res.apk 的目录。 |
apktool d myapp.apk -p /path/to/frameworks |
-s |
sources | 不反编译 classes.dex,默认情况下,apktool 会将 classes.dex 反编译成 smali 代码,使用此参数可以跳过这一步,速度更快,但无法直接修改代码。 |
apktool d myapp.apk -s |
-r |
res | 不解码资源文件,这会跳过对 res/ 和 assets/ 目录的解码,保留原始二进制格式,主要用于快速检查 AndroidManifest.xml。 |
apktool d myapp.apk -r |
-t |
tag | 指定框架标签,当你有多个版本的 framework-res.apk 时,可以用此参数来指定使用哪个版本。 |
apktool d myapp.apk -t android-30 |
--only-main-classes |
只反编译主要的 classes.dex,忽略 classes2.dex, classes3.dex 等,可以加快速度,但会丢失多 DEX 文件中的代码。 |
apktool d myapp.apk --only-main-classes |
|
--no-res |
与 -r 作用相同,不解码资源。 |
apktool d myapp.apk --no-res |
|
--no-src |
与 -s 作用相同,不反编译 classes.dex。 |
apktool d myapp.apk --no-src |
实战示例
示例 1:基本解包
将 my_app.apk 解包到当前目录下的 my_app 文件夹中。
apktool d my_app.apk
执行后,会生成一个名为 my_app 的文件夹,里面包含 AndroidManifest.xml、res/、smali/ 等目录。
示例 2:强制解包到指定目录
decoded_app 文件夹已存在,强制覆盖它。
apktool d my_app.apk -f -o decoded_app
这会将 APK 内容解包到 decoded_app 文件夹,无论该文件夹是否存在。
示例 3:只修改资源,不关心代码
如果你只想修改应用的图标或布局,而不想碰 Smali 代码,可以跳过代码反编译以节省时间。
apktool d my_app.apk -s -o app_resources_only
这样解包后的 app_resources_only 文件夹中会没有 smali/ 目录,但 res/ 和 AndroidManifest.xml 都是可以直接修改的。
示例 4:处理需要特殊框架的 APK (如微信)
某些应用使用了非标准的 Android 框架,直接解包会失败,你需要先获取其 framework-res.apk。
# 1. 假设你已经下载了微信的 framework-res.apk 并放在 /path/to/wechat_framework 目录下 # 2. 使用 -p 参数指定框架路径 apktool d WeChat.apk -p /path/to/wechat_framework -o wechat_decoded
解包后做什么?—— 修改与回编译
解包只是第一步,apktool 的真正威力在于修改和回编译。
修改
解包后,你可以自由修改:
AndroidManifest.xml: 修改包名、应用名、权限、组件声明等。res/目录: 修改布局 (layout/)、字符串 (values/strings.xml)、图标 (mipmap/)、颜色 (values/colors.xml) 等。smali/目录: 修改 Smili 代码(难度较高,需要了解 Smali 语法)。
回编译
修改完成后,使用 apktool b (build) 命令将其重新打包成 APK。
# 进入解包后的目录 cd my_app_decoded # 执行回编译 apktool b # 回编译成功后,会在 dist/ 目录下生成 unsigned.apk 文件
签名
回编译生成的 unsigned.apk 是未签名的,无法安装,你需要使用 jarsigner (来自 JDK) 或 apksigner (来自 Android SDK Build-Tools) 对其进行签名。
使用 jarsigner 签名 (简单测试用):
# 1. 生成一个 debug 密钥库 (如果还没有) keytool -genkey -v -keystore debug.keystore -alias androiddebugkey -keyalg RSA -keysize 2048 -validity 10000 -storepass android -keypass android # 2. 签名 APK jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore debug.keystore -storepass android -keypass android my_app_decoded/dist/unsigned.apk androiddebugkey # 签名后的文件仍然是 unsigned.apk,但已经被签名,可以重命名后安装
常见问题与解决方案
-
apktool: error: Could not read file ...- 原因: APK 文件损坏或下载不完整。
- 解决: 重新下载 APK 文件。
-
apktool: error: framework files are not installed- 原因:
apktool无法找到或加载 Android 框架文件。 - 解决: 确保你的电脑上安装了 Android SDK,
ANDROID_HOME环境变量配置正确。apktool通常会自动从 SDK 中找到框架文件,如果不行,可以手动指定框架路径 (-p参数)。
- 原因:
-
apktool: error: bad magic number...- 原因: APK 文件使用了
Android App Bundle(.aab格式) 或者是加密/加壳的 APK。 - 解决:
.aab文件需要先用bundletool解包成 APK,加密/加壳的 APK 需要先进行脱壳处理。
- 原因: APK 文件使用了
-
回编译后安装失败,提示“签名不一致”
- 原因: 你在
AndroidManifest.xml中修改了package(包名),但没有进行正确的签名。 - 解决: 修改包名后,必须使用与原签名相同(或新的)签名来对 APK 进行签名,简单的
jarsigner签名可能不够,特别是对于高版本的 Android 系统,推荐使用apksigner。
- 原因: 你在
希望这份详细的指南能帮助你更好地使用 apktool 进行 APK 反编译和分析!
