如何 5 分钟玩转 Apktool:APK 反编译与重打包实战指南
【免费下载链接】ApktoolA tool for reverse engineering Android apk files项目地址: https://gitcode.com/GitHub_Trending/ap/Apktool
拿到一个 APK,想知道里面的资源、清单和逻辑长什么样?或者想改几行文案、几个资源引用,再重打包出一个能装回去的版本?Apktool就是干这件事的:它把 APK 反编译成可读的 XML、资源文件和 smali 代码,等你改完后又能重新编译回 APK。下面带你从"手里只有一个 jar 文件"走到"产出可安装的成品包"。
🧩 什么情况下你会用到它
- 想搞清楚某 App 申请了哪些权限、内置了哪些图标、文案和资源引用;
- 想改掉字符串、资源或 smali 代码,产出"魔改"版本并重新打包;
- 需要批量查看或分析资源表与反汇编后的代码结构。
🚀 Apktool 的安装与启动命令
结论:只需一个apktool.jar和一套 JDK,两条路二选一。
路线一:用官方发布的 jar。下载对应平台的apktool_x.x.x.jar,放进任意目录即可,无需安装任何东西。
路线二:自己从源码构建。需要先装 JDK(建议 17+):
git clone https://gitcode.com/GitHub_Trending/ap/Apktool cd Apktool && ./gradlew build构建完成后,在brut.apktool/apktool-cli模块的build/libs目录里找到 apktool 的 jar 包,之后所有操作都围绕它展开。
最小可运行命令——把任意 APK 反编译一遍:
java -jar apktool.jar d sample.apk几个启动提示:
- 程序仅支持 64 位系统,32 位环境下启动会直接告警;
- 嫌
java -jar太长?仓库scripts/目录下有 Linux/macOS/Windows 三种包装脚本,本质就是帮你拼好这条 java 命令; - 随时执行
java -jar apktool.jar v查版本,h查看帮助。
⚙️ 从反编译到重新打包的完整流程
按这四步走,你就完成了一条完整的"拆解—修改—重打包"链路。
d:反编译。运行上面那条命令后,默认在apk.out/目录(可用-o指定)得到一棵项目式的目录:AndroidManifest.xml、res/里的明文资源、smali/里的反汇编代码,外加一个记录元信息的apktool.yml。只想看资源、跳过 dex 解码可以加-s。if:安装框架(按需)。如果反编译或后续打包时报FrameworkNotFoundException,说明缺少系统框架资源,先把对应框架装进来(例如framework-res.apk),这一步告诉 Apktool"系统资源长什么样"。- 改文件。动手前记住边界:
res/、smali/、AndroidManifest.xml随意改;original/目录下的文件(签名、原始清单等)动了就白搭,重打包时会按原样合回。 b:重新打包。回到反编译目录执行:
java -jar apktool.jar if framework-res.apk java -jar apktool.jar b sample.apk/产物默认落在dist/下的sample.apk(可用-o改名);想跳过变更检测、强制全量编译时加--force。
三个最常见的坑:
| 现象 | 原因与解法 |
|---|---|
OutDirExistsException或输出目录已存在 | 加-f强制覆盖,或换个输出目录 |
FrameworkNotFoundException | 先执行if把框架资源装好再反编译/打包 |
| 打包时 smali 报错 | 你手改的 smali 语法有问题,按报错定位到具体.smali文件回滚 |
📄 修改 apktool.yml 的常用项
反编译时生成的apktool.yml记录了这次拆解的全部元信息,重打包时 Apktool 会照着它来。绝大多数时候不用动它,需要时只改下面几项即可(其余如resourcesInfo、featureFlags属于只读记录,改了对打包无意义):
| 字段 | 作用 | 什么时候改 |
|---|---|---|
apkFileName | 记录源 APK 文件名,决定b的默认产物名 | 想让产物叫别的名字时 |
sdkInfo | 原包的 min/target/max SDK 版本 | 一般只读,用于确认兼容范围 |
usesFramework | 依赖的系统框架 id 与 tag | 反编译系统应用时,配合if确认框架已安装 |
usesLibrary | 声明的共享库列表 | 处理依赖 shared library 的 App 时 |
doNotCompress | 不参与压缩的文件类型列表 | 需要让某些文件在包里保持原样存储时 |
⚠️ 一个安全细节:apkFileName的值如果包含路径分隔符,Apktool 会直接抛SecurityException拒绝加载——这是它防目录穿越攻击的自检,别绕过。
📚 延伸阅读
- 项目结构一句话版:多模块 Gradle 工程,核心反编译/打包逻辑在
brut.apktool/apktool-lib/(ApkDecoder、ApkBuilder),命令行入口在brut.apktool/apktool-cli/,其余brut.j.*是目录、YAML、IO 等辅助工具模块; - 内部设计思路可看 INTERNAL.md,路线图见 ROADMAP.md,项目说明在 README.md。
一句话收尾:d拆开、if补框架、b装回去,配一份基本不用动的apktool.yml——这就是 Apktool 的日常用法。
【免费下载链接】ApktoolA tool for reverse engineering Android apk files项目地址: https://gitcode.com/GitHub_Trending/ap/Apktool
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考