用 Apktool 逆向和重打包 APK:两条命令从单文件变成可改的工程
【免费下载链接】ApktoolA tool for reverse engineering Android apk files项目地址: https://gitcode.com/GitHub_Trending/ap/Apktool
你可能有过这种体验:把一个 APK 直接解压开,看到的是二进制格式的resources.arsc、打不开成文本的AndroidManifest.xml,以及一段谁都读不懂的classes.dex——到此为止,没有工具的路基本走不通了。Apktool 就是为这一步准备的:它是个用 Java 写的 Android APK 逆向工具,能把 APK 里的资源和代码还原成接近原始源码的样子,等你改完后,再重新打包回一个能安装的 APK。下面这篇按"没它卡在哪 → 它怎么打通 → 能做什么、不能做什么 → 失败时查哪里"来讲。
没有 Apktool 的时候,卡在哪一步
直接解压只能做到"把文件取出来",做不到"把内容读明白",典型卡点是三个:
- 资源是黑盒:
resources.arsc是一张二进制的资源表,文案、颜色、图片全塞在里面,解压不会帮你拆成一个一个的文件; - 清单看不懂:APK 里的
AndroidManifest.xml是二进制 XML,直接打开全是乱码; - 改完没法打包:不少反编译工具只给你"只读"结果,逻辑能看,但你想改两行再装回手机,没有回头路。
你真正需要的,是一个"能当工程读、还能写回成 APK"的工具,这正是 Apktool 的定位。
它怎么打通:当工程读,写回成 APK
整个过程围绕decode(解码)和build(构建)两个子命令展开,短形式是d和b。
第一步,解包:
java -jar apktool.jar d sample.apk -o sample_out这条命令把sample.apk完整解码进sample_out目录:资源按类型和限定词拆进res/,清单还原成普通 XML,代码则按类拆成 smali 文件(smali 是 Android 平台的寄存器级汇编,比 Java 难看,但每一行都能读、能改)。真正负责解包的是 ApkDecoder.java,其中 smali 部分的解码在 SmaliDecoder.java。
中间一步,修改:改res/values/里的文案、换图片、调整清单,都是明文和图片文件的正常编辑,所见即所得。
最后一步,打包:
java -jar apktool.jar b sample_out这条命令把改过的sample_out重新编译资源、把 smali 拼回字节码、打包成新的 APK,全程由 ApkBuilder.java 完成,你不用自己拼构建细节。另外,如果目标应用依赖某个系统框架的资源,它还提供install-framework等子命令来管理框架版本。
适合做什么,不适合做什么
先说适合:本地化翻译、研究应用逻辑、给应用补充新平台适配——这几件事它做得顺手,也是项目官方推荐的方向,成本很低:改文件、跑命令,完事。
再说不适合,这些都能在项目路线图 ROADMAP.md 里查到:
- Split APK:工具的基本假设是"一个 APK",按 ABI 或语言拆分的多包应用暂时不在能力范围内;
- 框架版本错位:它随发布版本附带当时的最新框架文件,如果应用是针对很老的 API 构建的,可能需要自己补对应版本的框架;
- 无引用资源:塞在
res目录里但没被资源表引用的文件,会被漏掉。
用途上就一句带过:它面向上面的正当用途,不是拿来干盗版的事。
逐行调试 smali:资源改不动的时候
有些问题不在资源里,而在代码里:文案没变,是因为字符串硬编码在逻辑中。这时候可以在反编译出的 smali 上单步执行,逐行观察寄存器和变量的变化,定位到具体哪条指令出了问题,不用再靠猜。顺带一提,v2.9.3 也优化了这套调试的稳定性,逐步排查时中断和报错更少。
重建的 APK 装不上,先查哪里
- 框架问题排第一:安装时报资源相关的错,先确认应用依赖的框架版本装没装(对应
install-framework那组命令); - 改动位置:手改 smali 有没有笔误、资源值里有没有留下未解析的引用;
- 工具版本:v2.9.3 强化了资源解码与重建链路,重建结果更容易被设备正常识别,重打包环节也提速了,反复试改的节奏不会被构建拖慢;此版本修复的已知漏洞同样降低了处理来路不明 APK 的风险。排查问题时先确认自己用的不是老版本。
从装工具到读源码,怎么上手
只想用:拿到官方发布的 jar,用 Java 直接运行即可,项目文档入口在 README.md。
想自己编译:先git clone https://gitcode.com/GitHub_Trending/ap/Apktool,然后用仓库自带的gradlew(Gradle Wrapper,免去本地装 Gradle)构建,注意需要 JDK 17 及以上。所有第三方依赖的版本清单集中在 gradle/libs.versions.toml,看到 smali、baksmali 这些名字就能对上前面讲的反编译环节。
最后给个读代码的顺序建议:先 ApkDecoder.java 看它怎么把 APK 拆成目录,再 ApkBuilder.java 看怎么装回去,两个互为逆过程,读完主线就通了;至于"为什么有些资源现在还解不出来",答案基本都写在 ROADMAP.md 里。
【免费下载链接】ApktoolA tool for reverse engineering Android apk files项目地址: https://gitcode.com/GitHub_Trending/ap/Apktool
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考