ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

Apktool 重打包为什么全靠这个不起眼的 yml:4 个改错就崩的 apktool.yml 字段

Apktool 重打包为什么全靠这个不起眼的 yml:4 个改错就崩的 apktool.yml 字段 Apktool 重打包为什么全靠这个不起眼的 yml4 个改错就崩的 apktool.yml 字段【免费下载链接】ApktoolA tool for reverse engineering Android apk files项目地址: https://gitcode.com/GitHub_Trending/ap/Apktool解包一个 Android APK输出目录里除了 res/、smali/ 还多出一个 apktool.yml。多数人扫一眼就划走把它当成临时文件甚至顺手删掉——但重打包时 Apktool 靠它找回原始 APK 的 SDK 上下限、资源包 ID、未压缩文件清单。这份档案看不懂、改错一处轻则资源白屏重则 aapt2 直接编译失败。这篇文章按「解包 → 改 → 回包」的真实链路把 apktool.yml 的来龙去脉和 4 个高危字段一次讲透。这个 yml 是谁在什么时候生成的apktool.yml 不是手建的是解包过程的现场产物。apktool d demo.apk运行时解包器会把原始 APK 当成 zip 逐条扫描哪个文件是「存储型」未压缩比如 resources.arsc、png扩展名归一类、散件归一类全部记进 doNotCompressmanifest 里的 SDK 版本、resources.arsc 的包 ID 和编码结构则汇进其他字段。扫完后这些元数据被打包成一个 ApkInfo 对象序列化落盘到输出目录。关键在「记」而不是「造」它忠实抄录原包。你之后回包时没给的、靠默认值猜的东西全由这份文件补位——它的可信度直接决定回包质量。解包负责写回包负责读同一个对象解包时负责「写」回包时负责「读」。写这一端见 ApkDecoder.java// ApkDecoder扫描原包未压缩文件记入清单 doNotCompress.addAll(uncompressedExtsList); ... mApkInfo.save(new File(outDir, apktool.yml));读这一端见 ApkBuilder.java 的 build 入口mApkInfo ApkInfo.load(new File(mApkDir, apktool.yml)); mSmaliBuilder new SmaliBuilder(mApkInfo.getSdkInfo().getMinSdkVersionInt()); mAaptInvoker new AaptInvoker(mApkInfo, mConfig); ... SetString doNotCompress new HashSet(mApkInfo.getDoNotCompress());四行代码就是整条链路加载 ymlminSdkVersion 定 smali 处理策略AaptInvoker 拿走 resourcesInfo 和 sdkInfodoNotCompress 在最终打 zip 时逐文件判断存不存储压缩。你在中间改 yml 改 manifest对象纹丝不动一切以回包时刻重新 load 到的值为准。yml 是回包时唯一的元数据依据丢了或改了后面全是盲打。4 个字段如何变成 aapt2 的参数yaml 字段和 aapt2 开关之间的对应关系写得明明白白packageId 非 0 转成--package-id小于 128 还会追加--allow-reserved-package-idminSdkVersion / targetSdkVersion 转成--min-sdk-version/--target-sdk-versionsparseEntries 为 true 则追加--enable-sparse-encoding。也就是说 yml 里每个字段都不是「存档」而是回包时实打实下发生效的编译参数——改 yml 等价于改编译命令这是理解全部风险的起点。重打包前必查的 4 个字段逐个拆每个都按「改错会炸在哪 → 正确姿势」讲。packageId资源引用0xNNxx...的高 8 位编码的是包 ID。改错一位回包后所有资源引用对不上界面空白、图标丢失甚至启动闪退aapt2 还会对保留段 128追加特殊开关乱填 127 以下的数字会直接触发 aapt2 拒绝。正确姿势原样保留 127只有明确在做系统框架级合并才动它。minSdkVersion它决定 aapt2 按哪个 API 档位处理资源行为。调低可能悄悄改变资源处理结果调高则新装包直接装不上。正确姿势默认跟原包一致确要改先确认目标设备支持对应 API 级别。doNotCompress漏掉 arsc 或 png 这类原始未压缩项回包时它们会被 deflate而 Android 资源框架对 zip 内压缩项无法原位读取运行时资源加载失败。反过来把原包本就压缩的项加进去包体白白膨胀。正确姿势保留原始项只增不删。sparseEntries它切的是 resources.arsc 的二进制存储结构稀疏编码 vs 稠密。原包没用你硬开、或原包用了你关掉arsc 结构就和原始数据错位轻则体积异常重则解析失败。正确姿势拿不准就别碰。把 yml 变成 CI 里的数据源apktool.yml 是纯文本天然适合脚本消费。批量维护多个 APK 时可以用脚本逐包提取 minSdkVersion 做合规扫描低于阈值就告警更实用的做法是每次回包前先 diff 新旧 ymlpackageId、sparseEntries、doNotCompress 任一字段漂移就阻断提交——比肉眼核对可靠得多。# 回包前字段漂移即阻断 diff old/apktool.yml new/apktool.yml动手前逐条过一遍输出目录里 apktool.yml 还在丢了先解包原包补回再谈回包。doNotCompress 保留原始项只增不删。packageId 与 sparseEntries 保持原值没把握就不动。改 SDK 字段前确认目标设备支持对应 API 级别。回包后立即装机冒烟图标、主题、关键界面各点一遍。多人协作时把 yml 和 res/ 一起纳入版本管理别当垃圾文件忽略。下次回包之前先 diff 一下 apktool.yml 再提交 【免费下载链接】ApktoolA tool for reverse engineering Android apk files项目地址: https://gitcode.com/GitHub_Trending/ap/Apktool创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表