拆解 Apktool 的 APK 元数据:如何看懂 apktool.yml 并一次性完成重打包
拆解 Apktool 的 APK 元数据如何看懂 apktool.yml 并一次性完成重打包【免费下载链接】ApktoolA tool for reverse engineering Android apk files项目地址: https://gitcode.com/GitHub_Trending/ap/Apktool跑apktool d test.apk后反编译目录顶部会多出个apktool.yml。看不懂它重打包时就会莫名踩坑。这篇文章带你走通「反编译 → 读懂 APK 元数据 → 改一处 → 重新打包」的完整闭环主线就是核心类 ApkInfo。先搞清楚apktool.yml 为什么非落盘不可元数据不是「顺便存一下」而是重打包的直接输入。整条数据流是这样的反编译 (apktool d) → ApkDecoder 从 AndroidManifest.xml / resources.arsc 提取元数据 → 塞进内存里的 ApkInfo 对象 → mApkInfo.save(outDir) 落盘为 apktool.yml ↓ 你在这一步修改 smali / res / apktool.yml 重打包 (apktool b) → ApkBuilder.build 第一件事ApkInfo.load(mApkDir) 回读 → minSdkVersion 决定 smali 组装的字节码级别 → doNotCompress 决定 zip 里哪些文件必须存为 uncompressed → 产出 dist/*.apk拆开看重打包时哪些环节真的在读这些值minSdkVersionApkBuilder.build里直接new SmaliBuilder(parseSdkInt(minSdk))smali 反汇编成 dex 时用哪个 API 级别由它说了算。doNotCompress最终 zip 打包时作为压缩白名单传入名单外的文件一律压缩存储。usesFramework交给AaptInvoker决定 aapt 重建资源表时链接哪个系统框架。apkFileName决定dist/下输出 APK 的文件名。也就是说反编译后的目录里只有 smali、res 这些「零件」而「怎么装回去」的说明书只有这一份。这就是它必须存在的原因。如何读懂 apktool.yml一张表讲完关键字段一份典型配置长这样键名均来自 ApkInfo 源码 的解析逻辑version: 2.9.0 apkFileName: test.apk usesFramework: ids: - 1 sdkInfo: minSdkVersion: 25 targetSdkVersion: 30 versionInfo: versionCode: 1024 versionName: 1.2.4 resourcesInfo: packageId: 127 packageName: com.example.test doNotCompress: - arscyaml 键通俗含义乱改的风险version生成该目录的 Apktool 版本号影响小主要留痕打包实际用本机版本apkFileName原始 APK 文件名决定dist/输出名名字错了不致命只是产物名不对含/、..的值在读取时会被直接以SecurityException拒绝usesFramework(ids/tag)依赖的 Android 框架。ids: [1]就是标准 Android 框架系统应用往往依赖更多填了不存在的框架 id构建期直接找不到框架而失败usesLibrary清单里声明的第三方库uses-library列表一般不用动动了会偏离原始声明sdkInfo(min/target/max)应用支持的 SDK 下限 / 目标 / 上限见下方「坑」小节target 会被夹在 [min, max] 区间内生效三者关系乱了会出兼容问题versionInfo(versionCode/versionName)应用版本号与版本名versionCode 不升反降渠道侧会拒绝「降级」resourcesInfo(packageId/packageName/sparseEntries/compactEntries/keepRawValues)资源包 ID、包名与资源表存储格式高危。packageId改一位所有0x7f…资源引用的高位前缀全部失效featureFlags功能开关表键值对影响资源行为细节不确定就别动doNotCompress必须以不压缩形式进 zip 的后缀/文件名清单把arsc这类条目删掉resources.arsc被压缩存储系统无法按原方式读取一个容易忽略的细节write()方法对每个块做了isEmpty()判断空块直接不写。所以你在apktool.yml里看到的内容就是这个 APK「实际携带」的全部元数据没出现的键就是没有。对比三条读写路径目录、输入流、回写ApkInfo的持久化只围绕apktool.yml这一个文件名入口有三个方式关键 API适用场景从目录读ApkInfo.load(File apkDir)真实构建流程的唯一入口。ApkBuilder.build第一行就是它内部定位到apkDir/apktool.yml读不到抛AndrolibException从流读static ApkInfo load(InputStream in)包私有 VisibleForTesting。用YamlReader直接解析流不碰文件系统适合写测试或纯内存校验脚本回写apkInfo.save(File apkDir)反编译收尾时由ApkDecoder调用把内存对象序列化成 yaml 落盘如果你要程序化改元数据套路就是「load → setter → save」ApkInfo info ApkInfo.load(decodedDir); info.getSdkInfo().setTargetSdkVersion(28); info.getVersionInfo().setVersionCode(2048); info.save(decodedDir);所有 getter/setter 都是公开的SdkInfo、VersionInfo、ResourcesInfo、UsesFramework这几个 元数据组件 也都提供同类访问器想改哪块改哪块。避坑四个高频踩点坑 1apktool.yml 被删、被截断、缩进被改坏为什么踩load是逐行解析的文件缺失抛 IO 异常缩进错乱直接解析失败构建在第一步就死。正确做法把它当源码一样放进版本管理手工编辑只用能保持缩进的编辑器真损坏了拿原始 apk 重新d一遍比重修文件省事。解析与容错的边界行为可以参考 meta 测试目录 里的用例。坑 2随手改resourcesInfo.packageId为什么踩资源引用 ID 的高位字节就是包 ID0x7f对应 127。改了 ID 而不动引用或引用与新 ID 不匹配资源表构建完也无法互相对上。正确做法没有明确需求就别碰真要改必须保证 aapt 重建出的资源表与引用方一致并在真机上验证资源解析。坑 3SDK 三段值改乱为什么踩minSdkVersion直接决定 smali 组装的字节码级别targetSdkVersion生效前会被SdkInfo.getTargetSdkVersionBounded()夹进[min, max]区间。比如你把 target 提到 34 但 max 只有 30实际生效的是 30你以为改了却没改。正确做法保持min ≤ target ≤ max小步调整改完跑一次 build看日志里是否有 target 低于某阈值导致的警告源码里对网络配置等场景就有这类提示。坑 4给usesFramework.ids加不存在的框架为什么踩id 指向系统里实际安装的框架 APK不是随便编的序号。正确做法普通应用保留[1]只有系统应用需要额外框架时才加并确保构建机上已用apktool if安装对应框架否则会直接报框架找不到。进阶把元数据接进批量处理和 CI这套机制对自动化是友好的两个现成玩法批量改版本再打包循环遍历反编译目录对每个目录执行ApkInfo.load(dir)→ 按规则setVersionCode/setVersionName→save(dir)→ 调apktool b。因为所有访问器都是公开的不需要动任何 apktool 内部实现。CI 前置校验利用流式入口写一个不落地文件的检查器——读取apktool.yml流断言sdkInfo三值非空且有序、resourcesInfo.packageId在预期集合内、usesFramework.ids非空、apkFileName不含路径分隔符这条恰好是源码内置的防御。把它挂在 CI 里反编译产物一进仓库就先过校验坏数据不用等到打包才暴露。测试写法可以直接对照 ApkInfoReaderTest 这类现成用例。收尾一句话记住apktool.yml是反编译留给重打包的交接单ApkInfo.load回读的那一刻起minSdk、框架依赖、压缩策略全部由它说了算。动手前先把apktool.yml备份一份改完跑一次apktool b把日志里 SDK 和框架相关的警告当第一审查点 ️【免费下载链接】ApktoolA tool for reverse engineering Android apk files项目地址: https://gitcode.com/GitHub_Trending/ap/Apktool创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

Codex 技能目录上手指南:3 分钟装好第一个技能

Codex 技能目录上手指南:3 分钟装好第一个技能

Codex 技能目录上手指南:3 分钟装好第一个技能 【免费下载链接】skills Skills Catalog for Codex 项目地址: https://gitcode.com/GitHub_Trending/skills4/skills 想让 Codex 在合并 PR 前按固定流程逐条处理评审意见,或者动代码前先输出一份结…

2026/11/12 5:50:30 阅读更多 →
annotated_deep_learning_paper_implementations 中的 MLP-Mixer:用序列混合 MLP 替换自注意力,训练 Masked Language Model

annotated_deep_learning_paper_implementations 中的 MLP-Mixer:用序列混合 MLP 替换自注意力,训练 Masked Language Model

annotated_deep_learning_paper_implementations 中的 MLP-Mixer:用序列混合 MLP 替换自注意力,训练 Masked Language Model 【免费下载链接】annotated_deep_learning_paper_implementations 🧑‍🏫 60 Implementations/tutorial…

2026/11/12 5:50:30 阅读更多 →
OpenHands Agent Canvas 开发指南:本地 Dev Stack 架构、Agent Server 版本选择与嵌入式定制(基于 docs/DEVELOPMENT.md)

OpenHands Agent Canvas 开发指南:本地 Dev Stack 架构、Agent Server 版本选择与嵌入式定制(基于 docs/DEVELOPMENT.md)

OpenHands Agent Canvas 开发指南:本地 Dev Stack 架构、Agent Server 版本选择与嵌入式定制(基于 docs/DEVELOPMENT.md) 【免费下载链接】OpenHands 🙌 OpenHands: AI-Driven Development 项目地址: https://gitcode.com/GitHu…

2026/11/9 21:17:43 阅读更多 →

最新新闻

Electron桌面应用开发实战:从环境搭建到打包发布全流程

Electron桌面应用开发实战:从环境搭建到打包发布全流程

做前端这些年,我大部分时间都在跟浏览器标签页打交道,直到第一次把桌面应用跑起来,才发现原来自己一直被限制在地址栏和刷新按钮围起来的框框里。Electron这个词,最开始是在某段时间频繁出现在同事的讨论里,一个用HTML…

2026/11/12 5:00:00 阅读更多 →
滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

简介:亚太天能T109滑盖智能锁产品说明书是一份PDF格式的官方技术文档,主要面向智能锁安装人员、终端用户及售后维护者,帮助快速掌握产品安装、配置与常见故障处理。全包仅1个PDF文件,大小4.37MB,内容结构清晰&#xff…

2026/11/12 5:13:20 阅读更多 →
PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

上个月我在调试一台高速AGV的驱动系统,整车要求空载跑到8m/s,电机转速已经拉到额定点,驱动器的输出电压也顶到了母线电压极限附近。再往上踩速度指令,转速纹丝不动,三相电流反而开始震荡。那会儿我的第一反应就是&…

2026/11/12 5:13:20 阅读更多 →
C++核心知识点:从内存管理到STL的实战指南

C++核心知识点:从内存管理到STL的实战指南

C 这门语言我前前后后折腾了十几年,用它写过嵌入式驱动、做过游戏服务端,也搭过基础组件库。每次看到新人一头扎进"C 核心知识点"这个搜索词,我其实挺感慨的——这门语言的难点从来不是语法多,而是知识点之间的耦合太深…

2026/11/11 17:16:37 阅读更多 →
T109滑盖智能锁怎么装?安装调试与故障排查全攻略

T109滑盖智能锁怎么装?安装调试与故障排查全攻略

简介:亚太天能T109滑盖智能锁产品说明书以PDF格式发布,适合智能锁用户、安装人员与售后维修人员阅读。内容围绕T109系列指纹密码刷卡锁展开,先介绍前面板、后面板、锁体、机械钥匙、电池盒盖等部件名称与功能,再给出完整安装步骤&…

2026/11/11 17:16:37 阅读更多 →
LLM知识降熵:从信息垄断到理解权下放

LLM知识降熵:从信息垄断到理解权下放

你有没有过这种经历:翻开源码注释、论文摘要或者一份专业报告,每个字都认识,连在一起却像天书。想找人聊聊,身边要么没人懂,要么懂的懒得跟你解释。后来我试着把同一段内容丢给一个大语言模型,几秒钟之后&a…

2026/11/12 5:13:20 阅读更多 →

日新闻

周新闻

月新闻