Apktool 反编译 APK 实战指南:解码、修改与重新打包
【免费下载链接】ApktoolA tool for reverse engineering Android apk files项目地址: https://gitcode.com/GitHub_Trending/ap/Apktool
拿到一个别人打包的 APK,想看看里面到底写了什么资源、smali 代码长什么样,甚至改个文案重新装回去?Apktool 就是为此设计的——它把二进制 APK 解码成接近源码的项目结构,改完再重新编译,还能管理系统框架。
从下载到看到第一条输出
Apktool 只依赖一个 Java 环境,JDK 11 以上即可。拿到可运行的apktool.jar后,先验证能不能跑起来:
java -jar apktool.jar v输出一行版本号就说明环境没问题。想省事就用官方预编译的 jar;要改源码,就从 GitCode 拉一份自己构建:
git clone https://gitcode.com/GitHub_Trending/ap/Apktool源码主要分两块:命令行入口 负责解析参数,核心库 负责真正的解码与打包。
反编译、修改、重新打包三步走
第一步:解码。把 APK 展开成资源加 smali 的目录:
java -jar apktool.jar d app.apk默认在同名目录下生成AndroidManifest.xml、res/、smali*/。
第二步:修改。文本类的都能直接动——res/values/strings.xml里的文案、AndroidManifest.xml的权限声明,甚至smali里的字节码指令。
第三步:打包。回到解码目录,一条命令重建:
java -jar apktool.jar b app产物默认落在dist/app.apk。
有些 App 依赖私有系统框架,解码时会报“framework 缺失”。先把那个框架 APK 装进框架库,再解码:
java -jar apktool.jar if framework-res.apk打包前必查的 apktool.yml 字段
解码时 Apktool 会在根目录写一个apktool.yml,打包时它照着这份清单还原结构。几个关键字段值得留意:
| 字段 | 含义 |
|---|---|
apkFileName | 原始 APK 文件名,决定最终产物命名 |
usesFramework | 引用的框架(ids/tag),跨框架的 App 依赖它 |
usesLibrary | 额外引入的共享库列表 |
sdkInfo | minSdkVersion/targetSdkVersion/maxSdkVersion三个边界 |
versionInfo | versionCode与versionName |
doNotCompress | 不能压缩的文件清单,保证这些文件打包时保持原样 |
其中targetSdkVersion最容易踩坑:App 在低版本系统上行为异常,往往就是它和minSdkVersion的取值没对上。想调整目标 SDK,改sdkInfo下对应的那一行就够了。
常用参数与典型坑 🛠️
解码时按需裁剪,能省不少时间:
| 参数 | 作用 |
|---|---|
-s/--no-src | 只解资源、跳过 smali,大 App 上明显更快 |
-r/--no-res | 只看代码逻辑时,不解资源 |
-f/--force | 目标目录已存在时强制覆盖 |
-o/--output | 自定义输出目录 |
-a/--all-src | 连非标准的classes*.dex一起解码 |
两个高频坑:一是改了res里的资源却没重新解码,直接b会报资源缺失,此时用--keep-broken-res或重新d一次;二是产物装不上,多半是usesFramework里那个框架没在目标机器上安装。
速查表
| 命令 | 用途 |
|---|---|
d/decode | 反编译 APK |
b/build | 重新打包 |
if/install-framework | 安装框架文件 |
lf/list-frameworks | 列出已安装框架 |
cf/clean-frameworks | 清理框架库 |
v/version | 查看版本 |
h/help | 查看完整帮助 |
想深入的话,可以顺着 参数解析逻辑 看每个选项如何落到Config,或研究 ApkDecoder 的解码主流程。
【免费下载链接】ApktoolA tool for reverse engineering Android apk files项目地址: https://gitcode.com/GitHub_Trending/ap/Apktool
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考