Apktool ApkInfo 完全指南:APK 元数据加载机制全解
Apktool ApkInfo 完全指南:APK 元数据加载机制全解
【免费下载链接】ApktoolA tool for reverse engineering Android apk files项目地址: https://gitcode.com/GitHub_Trending/ap/Apktool
Apktool 是 Android APK 逆向工具,它的 ApkInfo 类干一件事:把反编译时提取的元数据写进 apktool.yml,让重打包时能按原样还原配置。
核心概念速览
ApkInfo 实现了 YamlSerializable 接口,就是 apktool.yml 的一行行内容到内存字段的映射。
读取靠一个 switch 把 key 对到字段,写入时只写非空字段,所以这个 yml 文件总是很精简。
| apktool.yml 里的键 | ApkInfo 对应字段 | 装了什么 |
|---|---|---|
| version | mVersion | 反编译用的 apktool 版本 |
| apkFileName | mApkFileName | 原始 APK 的文件名 |
| usesFramework | UsesFramework | 依赖的框架 ID 列表和 tag |
| usesLibrary | List<String> | 依赖的第三方库 |
| sdkInfo | SdkInfo | min/target/maxSdkVersion |
| versionInfo | VersionInfo | versionCode 和 versionName |
| resourcesInfo | ResourcesInfo | packageId、packageName、sparseEntries 等 |
| featureFlags | Map<String, Boolean> | 传给 aapt2 的功能开关 |
| doNotCompress | List<String> | 重打包时不压缩的文件类型 |
源码在 apktool-lib 模块的 meta 包下,类名一眼可认:ApkInfo、SdkInfo、UsesFramework、VersionInfo、ResourcesInfo。
动手实操:apktool.yml 怎么读
你反编译完一个 APK,打开输出目录,第一眼看到的就是 apktool.yml。
一个最小可用的样子大概是这样:
version: 2.11.1 apkFileName: demo.apk sdkInfo: minSdkVersion: 24 targetSdkVersion: 33 resourcesInfo: packageId: 127 packageName: com.example.demo改这个文件是有实际后果的。
比如你把 minSdkVersion 从 24 改成 21,重打包时 AaptInvoker 会拿它拼 aapt2 命令参数,资源编译的资源级别就跟着变了。
而 packageId 建议别动:它参与所有资源引用 ID 的构造,改了之后引用可能对不上号。
数据怎么流转:ApkInfo 的加载机制
按数据流看,整条链路是三段:
产生 → 落盘 → 消费
- 产生:ApkDecoder 解析 APK 时 new 一个 ApkInfo,顺手填上版本号、从 manifest 里抠出的 minSdkVersion、doNotCompress 列表
- 落盘:解码完成后调用 save(outDir),序列化成 apktool.yml
- 消费:重打包时 ApkBuilder 里一行 ApkInfo.load(apkDir) 读回来,AaptInvoker 从里面取 sdkInfo、versionInfo、usesFramework 拼命令,doNotCompress 决定哪些文件以不压缩方式打进 zip
关键调用就这两头:
mApkInfo.save(outDir); // 解码后:对象 → apktool.yml ApkInfo apkInfo = ApkInfo.load(mApkDir); // 重打包前:apktool.yml → 对象中间那个 yml 文件是唯一的持久化介质,内存对象从不跨进程存活。
踩过的坑
删了 apktool.yml,重打包直接报错
- 你遇到了什么:觉得 yml 只是记录文件,顺手删掉,一打包就崩
- 为什么会这样:ApkBuilder 靠 load 恢复版本、框架、SDK 配置,文件不在它没法继续
- 怎么解决:反编译目录里的 apktool.yml 别动,想备份就整个目录拷走
手改 yml 缩进错乱
- 你遇到了什么:手工编辑后字段层级变了,apktool 读不了
- 为什么会这样:它用自家的 YamlReader 逐行解析,靠缩进判层级
- 怎么解决:同级字段保持对齐缩进;顺带说,未知字段会被跳过不报错,但错缩进会
apkFileName 被拒:Malicious value
- 你遇到了什么:把 APK 改个怪名字,重打包报 SecurityException
- 为什么会这样:源码里对 "."、".." 和带路径分隔符的值主动抛异常,这是防路径穿越的防御
- 怎么解决:apkFileName 保持纯文件名,别塞路径
下一步
apktool.yml 就是重打包的蓝图。想再往下钻,读一下 ApkInfo.java 的 readItem 和 write 两个方法就通了。
【免费下载链接】ApktoolA tool for reverse engineering Android apk files项目地址: https://gitcode.com/GitHub_Trending/ap/Apktool
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
