apktool 反编译 参数

99ANYc3cd6
预计阅读时长 16 分钟
位置: 首页 参数 正文

apktool vs. jadx / apktool d

在开始之前,请务必理解 apktool 的主要作用:

apktool 反编译 参数
(图片来源网络,侵删)
  • apktool: 它是一个资源解码和回编译工具,它能将 APK 文件解包,解码其中的资源文件(如 AndroidManifest.xml, res/ 目录布局, resources.arsc 等),并将其还原为易于阅读和修改的格式(如 smali 代码, xml 文件),修改后,你可以用 apktool b 重新打包成 APK。
  • jadx / Ghidra / dex2jar + jd-gui: 这些是代码反编译工具,它们主要将 APK 中的 classes.dex 文件反编译成可读的 Java 代码(.java 文件)。

最佳实践通常是两者结合使用:

  1. apktool 解包,用于修改资源、布局、AndroidManifest.xml 或进行Smali 层级的代码修改
  2. jadx 打开 APK,用于阅读和理解 Java 层的业务逻辑

apktool 安装与环境准备

在运行命令前,请确保你已经安装了 Java JDK (JRE 不够) 并配置了环境变量。

下载 apktool

  • 访问 官方发布页面
  • 下载最新版本的 apktool.jar 和对应平台的 apktool.bat (Windows) 或 apktool (macOS/Linux)。
  • 将这两个文件放在同一个目录下,C:\apktool,并将该目录添加到系统的 PATH 环境变量中,方便全局调用。

验证安装 打开命令行(CMD 或 PowerShell),输入:

apktool 反编译 参数
(图片来源网络,侵删)
   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.xmlres/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,但已经被签名,可以重命名后安装

常见问题与解决方案

  1. apktool: error: Could not read file ...

    • 原因: APK 文件损坏或下载不完整。
    • 解决: 重新下载 APK 文件。
  2. apktool: error: framework files are not installed

    • 原因: apktool 无法找到或加载 Android 框架文件。
    • 解决: 确保你的电脑上安装了 Android SDK,ANDROID_HOME 环境变量配置正确。apktool 通常会自动从 SDK 中找到框架文件,如果不行,可以手动指定框架路径 (-p 参数)。
  3. apktool: error: bad magic number...

    • 原因: APK 文件使用了 Android App Bundle (.aab 格式) 或者是加密/加壳的 APK。
    • 解决: .aab 文件需要先用 bundletool 解包成 APK,加密/加壳的 APK 需要先进行脱壳处理。
  4. 回编译后安装失败,提示“签名不一致”

    • 原因: 你在 AndroidManifest.xml 中修改了 package (包名),但没有进行正确的签名。
    • 解决: 修改包名后,必须使用与原签名相同(或新的)签名来对 APK 进行签名,简单的 jarsigner 签名可能不够,特别是对于高版本的 Android 系统,推荐使用 apksigner

希望这份详细的指南能帮助你更好地使用 apktool 进行 APK 反编译和分析!

-- 展开阅读全文 --
头像
AMD 7750 CPU参数有哪些关键性能指标?
« 上一篇 今天
Z Watch智能手表,续航与功能哪个更亮眼?
下一篇 » 今天

相关文章

取消
微信二维码
支付宝二维码

最近发表

标签列表

目录[+]