Apktool 实战指南:解包、改包、重新打包一个 Android APK 的全流程

📅 2026/8/22 12:05:05
Apktool 实战指南:解包、改包、重新打包一个 Android APK 的全流程
Apktool 实战指南解包、改包、重新打包一个 Android APK 的全流程【免费下载链接】ApktoolA tool for reverse engineering Android apk files项目地址: https://gitcode.com/GitHub_Trending/ap/ApktoolApktool 是目前 Android 逆向圈使用最广的解包工具它能把 APK 里的二进制资源还原成可编辑的 XML把 DEX 字节码还原成可读的 Smali 汇编改完之后再打包回 APK。这篇文章带你从零搭好环境走通解包 → 修改 → 打包 → 签名的完整链路并附上高频报错排查表。1. 它能解决什么问题先对齐预期Apktool 做的事情可以概括为两条流水线。解包decode把resources.arsc、AndroidManifest.xml等二进制格式解码成文本把classes.dex反汇编成smali/目录下的汇编代码。打包build把改过的工程重新编译、合并回一个可安装的 APK未签名。适合用它的人场景你实际要做的事本地化 / 换文案改res/values/strings.xml里的字符串权限审计查看或调整AndroidManifest.xml中的uses-permission补丁开发在smali/里定位方法并修改指令安全研究通读反编译后的代码找敏感逻辑需要提前说明的两点局限它不负责签名。2.x 版本之后已移除内置签名参数网上流传的--key之类写法在新版会直接报Unrecognized command line option签名要交给apksigner单独完成后文会给出命令。它面向还原而非美化。官方目标是尽量保持产物贴近原始 APK见仓库根目录 README.md 中对工具定位的描述所以不要拿它当重构工具用。2. 环境准备与安装一键安装# macOSHomebrew brew install apktool # 验证安装 apktool vapktool v会打印版本号。仓库 gradle/libs.versions.toml 可以看出当前主线依赖 smali/baksmali、aapt2 等组件版本较老所以解包 Android 13/14 以上的新包时尽量用最新版 apktool老版本容易在资源解析阶段翻车。从源码构建想跟源码或者出二进制克隆仓库即可git clone https://gitcode.com/GitHub_Trending/ap/Apktool cd Apktool ./gradlew build shadowJar产物 jar 在brut.apktool/apktool-cli/build/libs/下重命名为apktool.jar后直接java -jar apktool.jar使用。注意构建要求JDK 17INTERNAL.md 中有明确标注运行时 64 位 JVM 也是硬要求——主入口 Main.java 里对 32 位平台只会给出警告行为不再保证。3. 解包 APK第一个输出目录长什么样基本解包命令apktool d -o out_dir target.apk-o指定输出目录不写的话默认是apk_name.out。只解资源、不碰代码时很常用这个组合apktool d -s -o out_res_only target.apk-s--no-src跳过 dex 反汇编解包速度会快很多适合只想改文案/图标的场景。反过来遇到多 dex 分包classes2.dex等没解出来的应用用-a--all-src把未知 dex 也一并解出来。输出目录结构速览解包完成后你会得到这样的结构out_dir/ ├── AndroidManifest.xml # 已解码的清单纯文本可编辑 ├── apktool.yml # 解包元信息版本号、包 ID、SDK 范围 ├── res/ # 全部资源文件按目录类型分 dpi/语言 ├── smali/ # classes.dex 反汇编结果 ├── assets/ # 原样保留的资源文件 └── unknown/ # 原包中未归类的内容apktool.yml里的sdkInfo记录了 minSdk/targetSdk是后续排查装不上问题的第一现场。4. 三个最常见的手改场景改文案编辑 strings.xml打开res/values/strings.xml直接像普通 XML 一样改。注意两点字符串里的特殊字符要加引号或转义如果某个文案实际是硬编码在代码里的不经过资源引用这里改了不会生效得去smali/里找。改权限编辑 AndroidManifest.xml在AndroidManifest.xml里增删uses-permission节点。一个实用的技巧给应用开网络权限调试时很多人会顺手改usesCleartextTraffic改完打包时加--debuggable更方便后续抓取。改逻辑编辑 smali 代码smali/下按包名组织目录每个.smali文件对应一个类。最小修改示例——把一处return改成返回值.method public isVip()Z .registers 2 const/4 v0, 0x1 # 1 替代 0 return v0 .end methodSmali 语法与 Dalvik 字节码一一对应改之前建议先用apktool d时保留默认调试信息行号、参数名定位方法会容易得多确认无误打包后如需去掉这些信息可以在解包阶段加--no-debug-info。5. 重新打包与签名对齐打包命令与常用参数apktool b out_dir -o rebuilt.apk不带-o时默认输出到dist/原包名.apk。打包时值得知道的开关参数作用-f跳过变更检测全量重建改了 smali 后推荐--debuggable自动把清单里的android:debuggable置为 true--no-crunch跳过资源 crunch 压缩出包更快但体积更大--net-sec-conf注入一个通用的网络安全配置-j并行任务数大工程可以拉高这些开关的定义都集中在 Main.java 的buildOptions里遇到文档没写全的参数可以直接翻这份源码。签名与对齐apktool 产出的是未签名APK直接安装会失败。用 Android Build Tools 里的两个工具收尾apksigner sign --ks debug.keystore --ks-key-alias androiddebugkey rebuilt.apk zipalign -p 4 rebuilt.apk rebuilt_aligned.apkapksigner负责 v1/v2/v3 签名zipalign按 4 字节对齐未压缩资源-p对齐 page 压缩文件。顺序上先签名后对齐对齐后签名会失效。6. 常见问题速查现象原因与处理OutDirExistsException/ 提示目录已存在输出目录非空。换个目录或确认目录确实是废产物后自行清理再解打包时报 Invalid resource config detected. Dropping resources手动改动破坏了资源配置。轻则撤销改动重则在解包时加--keep-broken-res强行保留坏资源打包前逐个手修FrameworkNotFoundException/ 系统应用解包失败系统类应用引用了框架资源。把1.apk系统框架用apktool if 1.apk -t myapp安装为框架再用-p指向框架目录重新解包解包/打包很慢加-j指定并行数纯看资源时加-s跳过 dex新参数报 Unrecognized command line option版本太旧。升级到最新版后重试别照搬老博客里的命令改完 strings 不生效文案是代码内硬编码需要去 smali 层修改7. 进阶把 apktool 当作库来用仓库本身是多模块 Gradle 工程模块划分见 settings.gradle.ktsbrut.apktool:apktool-lib是核心库apktool-cli只是它的命令行壳。如果你要在自己的工具链里自动化解包/打包流程可以直接依赖 Maven 上的 apktool-lib发布流程在 INTERNAL.md 中有说明核心入口就是ApkDecoder与ApkBuilder两个类位于 brut/androlib/ 下。理解它为什么这么稳也有助于排错资源解码由brut/androlib/res/下的解析器完成DEX 反汇编依赖 smali/baksmali打包阶段的资源编译则调用随发行版内置的aapt2项目还维护了自己的 aapt2 分支构建过程记录在 INTERNAL.md 中。资源相关的报错十有八九出在这条链路上。想验证自己是否真的掌握了解包—修改—打包闭环仓库自带大量现成样例工程例如brut.apktool/apktool-lib/src/test/java/brut/androlib/下的BuildAndDecodeApkTest等测试覆盖了 9 宫格、稀疏资源、动态 dex 等边界场景是很好的参照。【免费下载链接】ApktoolA tool for reverse engineering Android apk files项目地址: https://gitcode.com/GitHub_Trending/ap/Apktool创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考