尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

读懂 Apktool ApkInfo:APK 元数据的存储、加载与回写

读懂 Apktool ApkInfo:APK 元数据的存储、加载与回写 读懂 Apktool ApkInfoAPK 元数据的存储、加载与回写【免费下载链接】ApktoolA tool for reverse engineering Android apk files项目地址: https://gitcode.com/GitHub_Trending/ap/Apktool反编译一个 APK 后你随手删掉了输出目录里的apktool.yml再跑apktool b直接报错。你删掉的不是一份配置文件而是 Apktool 重打包所依赖的 APK 元数据它的存取逻辑都集中在 ApkInfo.java 这一个类里。apktool.yml里到底存了什么反编译时Apktool 会在输出目录写出一份apktool.yml记录 APK 反编译过程中提取到的关键信息这就是 APK 反编译元数据的落盘形式。ApkDecoder 解析 AndroidManifest.xml 和 resources.arsc 时会把 ApkInfo 对象逐字段填好最后 save 到磁盘apktool b重打包时第一步就是读回这个文件。所以元数据的流向是原始 APK → 内存对象 → yml → 内存对象 → 新 APK。丢了这份文件重建就失去了对原始包的描述。类的顶层字段和文件里的键一一对应下表是各字段的说明字段含义典型值version反编译所用 Apktool 版本2.9.0apkFileName原始 APK 文件名demo.apkusesFramework应用依赖的框架ids 与 tagids: [1]usesLibrary应用声明的共享库org.apache.http.legacysdkInfo最低 / 目标 / 最高 SDK 版本minSdkVersion: 25versionInfo应用版本号与版本名versionCode: 10resourcesInforesources.arsc 的包 ID、包名与重建标志packageId: 127featureFlags功能开关通常为空doNotCompress不参与压缩的文件类型列表arsc下面是一份典型的apktool.yml关键字段加了注释# apktool.ymlApktool 反编译时写出的 APK 元数据快照 version: 2.9.0 # Apktool 版本 apkFileName: demo.apk # 原始 APK 文件名 usesFramework: # 框架依赖 ids: [1] # 1 表示默认 Android 框架 sdkInfo: # SDK 版本范围 minSdkVersion: 25 targetSdkVersion: 33 versionInfo: # 来自 AndroidManifest.xml 的版本信息 versionCode: 10 versionName: 1.2.0 resourcesInfo: # 重建 resources.arsc 的参数 packageId: 127 # 资源包 ID127 即 0x7f sparseEntries: false doNotCompress: # 不压缩的文件类型 - arsc注意两点version字段记录写出这份文件的 Apktool 版本yml 的约定在不同大版本间有过变化靠它判断文件来源另外回写时 ApkInfo 只写非空字段某个子对象没值对应的键在文件里就干脆不出现。从磁盘到内存再到磁盘load 和 save 各做了什么ApkInfo 的 load 和 save 是 APK 元数据与磁盘之间往返的两个入口下面的代码是最常见的用法读进来、改一个字段、再写回去。ApkInfo apkInfo ApkInfo.load(new File(demo)); // 读 apktool.yml apkInfo.setApkFileName(demo-modified.apk); // 修改字段 apkInfo.save(new File(demo)); // 写回load(File)会到指定目录下找apktool.yml用 YamlReader 逐行解析load(InputStream)用于从流里读取一般只在测试中出现。save(File)与 load 对称把各字段经 YamlWriter 序列化回同名文件。文件缺失时 load 会直接抛 AndrolibException开头那个报错就是这么来的。还有一个细节解析apkFileName时会检查值里是否包含/或\这类路径分隔符命中就抛 SecurityException防止恶意构造的 yml 把路径指到目录之外。四个子对象各管什么UsesFramework 记录应用依赖的框架包括 ids 列表和可选的 tag。普通应用一般是 ids 为 [1]1 表示系统框架框架应用则有自定义 tag重打包时要靠它定位对应的 framework-res.apk。SdkInfo 保存清单里的三个 SDK 版本字段minSdkVersion、targetSdkVersion、maxSdkVersion。除了纯数字它也能把 N、T 这类字母代号解析成对应数字。VersionInfo 是从 AndroidManifest.xml 读出的 versionCode 与 versionName重打包时 Apktool 允许在构建参数中覆盖这两个值。ResourcesInfo 记录重建 resources.arsc 的关键参数packageId通常是 127即 0x7f、packageName以及 sparseEntries、compactEntries、keepRawValues 三个标志。这些标志决定重建时是否采用稀疏或紧凑结构需要与原 APK 保持一致。重打包时它替你守住了什么 ️负责重打包的 ApkBuilder 会从这些字段取走大部分构建参数。随便改一个字段问题通常会在构建时或运行时暴露把arsc从 doNotCompress 里删掉构建时 resources.arsc 会被压缩着写进 zip老版本 Android 无法对压缩后的资源文件做内存映射资源加载可能直接失败。把 resourcesInfo 里的 packageId 从 127 改成别的值smali 和清单里 0x7f0xxxxx 形式的资源引用会全部对不上应用一般启动即崩。框架应用改动了 usesFramework 的 ids 或删掉 tag重打包时找不到正确的 framework-res.apk要么构建报错要么产出缺资源的包。sdkInfo 同理minSdkVersion 设得比目标设备 API 高应用直接装不上。稳妥的做法是——只改资源或代码时这份文件就别动或只动你确知用途的字段。调试时怎么确认元数据没丢怀疑某个字段在 load/save 中丢失时可以翻 brut.apktool/apktool-lib/src/test/java/brut/androlib/meta/ 目录下的测试ApkInfoReaderTest 验证标准 YAML 的解析ApkInfoSerializationTest 验证 load 与 save 的往返一致性。在「反编译 → 修改 → 重打包」管线里ApkInfo 就是逐级传递的元数据快照apktool.yml还在包就能重建。【免费下载链接】ApktoolA tool for reverse engineering Android apk files项目地址: https://gitcode.com/GitHub_Trending/ap/Apktool创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表