apktool.yml 避坑指南:这一份文件决定你重打包会不会崩
【免费下载链接】ApktoolA tool for reverse engineering Android apk files项目地址: https://gitcode.com/GitHub_Trending/ap/Apktool
跑完apktool d,输出目录里会多出一个叫 apktool.yml 的文件,很容易被当成副产品。但重打包时,Apktool 会把它逐行读回来驱动 aapt2,改错一行,轻则装不上包,重则资源全加载不出来。这篇带你从一分钟看懂到动手改,再到这份元数据配置的坑点一次摸清。
一分钟速览
apktool.yml 是 Apktool 解码 APK 时自动落盘的"重打包说明书"。它记着原始包名、SDK 上下限、版本号、哪些文件不许压缩。重打包时,这些值会被原样传给 aapt2,resources.arsc 的内容和 zip 压缩方式都由它决定。坏了的表现通常是:构建直接报错、装不上包,或者装上了但资源加载不出来。apktool.yml 与 AndroidManifest.xml 的区别:前者是业务声明,后者才是重打包工具的过程参数单。
apkFileName: myapp.apk sdkInfo: minSdkVersion: 24 targetSdkVersion: 34 versionInfo: versionCode: 3 versionName: 1.2.0它是怎么干活的:apktool.yml 在解码和重打包之间往返
时间线分两段,中间隔着一个你。
解码段:ApkDecoder 从 manifest 取出 SDK 和版本号,再逐个文件扫描 zip 里哪些是未压缩的,汇总进 ApkInfo 对象后存成 apktool.yml。此时它只是一份快照。
// 解码:存盘 mApkInfo.save(new File(outDir, "apktool.yml")); // 重打包:先读回,再构建 ApkInfo apkInfo = ApkInfo.load(new File(mApkDir, "apktool.yml"));读写两个入口都在 ApkInfo.java 里,解码调 save,重打包调 load。重打包时由 AaptInvoker.java 把 sdkInfo、versionInfo 这些字段逐个拼成 aapt2 参数,压缩环节也按 doNotCompress 清单决定每个文件压不压。
跟着改:从0到跑通
三条命令走完一个往返:
apktool d sample.apk -o sample apktool b sample -o sample-v2.apk aapt dump badging sample-v2.apk第一步:【做什么】用第一条命令解码任意一个 APK,想从源码跑就先克隆仓库再用 gradlew 构建。【为什么】手里要有真实的 apktool.yml,后面的改法才谈得上验证。【怎么验证】sample/ 目录下出现 apktool.yml。
第二步:【做什么】打开 sample/apktool.yml,把 sdkInfo、versionInfo、doNotCompress 三处值和原包核对一遍。【为什么】这三组值在重打包时一一映射成 aapt2 参数。【怎么验证】和原包的 badging 输出对照,没有缺失或多出。
第三步:【做什么】把 targetSdkVersion 改小一档,保存,再跑第二条命令重建。【为什么】验证"改 yml 就影响重打包"这条链路。【怎么验证】第三条命令输出的新包 targetSdkVersion 变成了你改的值。
第四步:【做什么】把值改回去,再重建一次。【为什么】确认包能还原,才敢把改法用到正式流程。【怎么验证】构建成功,安装启动正常。
解码出来的样本里还包含下面这类图片资源,压不压缩由 doNotCompress 清单说了算。
最容易炸的4个点 ⚠️:改错就废的重打包操作
下面四个错误,全部按报错现象反推。
1. apkFileName 写成路径
重打包报 "Malicious value for apkFileName",构建直接拒绝。根因是读取时的安全校验:值里带 / 或 \ 会被当成目录穿越处理。这个字段只是记录原包名,保持 myapp.apk 这种纯文件名就行。
2. SDK 版本写成文字
minSdkVersion 写成 "Android 12" 这种,重打包两头都坏:aapt2 收到原文本直接拒绝,内部整数解析还会落到兜底值 10000。这个字段只认纯数字,或者 O、S 这类内置代号。改成 24 这种值最稳。
3. 删掉 usesFramework.ids
依赖自定义框架的包重打包后报资源缺失,或 aapt2 链接失败。根因是 ids 有值时框架 apk 才会以 -I 参数带进构建,删掉它,框架资源就找不到了。这类包的 usesFramework 下 ids 一个都别动。
4. doNotCompress 删掉 arsc
构建能过,新包却装不上或一启动就闪退。打 zip 时这份清单决定哪些文件保持不压缩,arsc 一旦压了,系统就按原方式读不了 resources.arsc。原始条目只增不删。
动手前过一遍清单
- yml 丢了,用原包重新解码恢复,别凭记忆手写。
- 要改版本号,只动 yml 里的 versionInfo,versionCode 和 versionName 解码后已不在 manifest 中。
- 拿不准的值,重新解码一次原 APK,以输出为准。
- 新增必须不压缩的文件类型,扩展名补进 doNotCompress 再重建验证。
- yml 和代码一起提交,提交前 diff 新旧版本,字段漂移就停下查。
- 重建完先在真机安装启动冒烟,再放行。
重打包前,先 diff 一次 yml 🚀
【免费下载链接】ApktoolA tool for reverse engineering Android apk files项目地址: https://gitcode.com/GitHub_Trending/ap/Apktool
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考