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 上下限、版本号、哪些文件不许压缩。重打包时这些值会被原样传给 aapt2resources.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 里的 versionInfoversionCode 和 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),仅供参考