ARTICLE DETAIL

资讯详情

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

重打包后资源引用全挂?Apktool 的 ApkInfo 与 apktool.yml 一次讲清

重打包后资源引用全挂?Apktool 的 ApkInfo 与 apktool.yml 一次讲清 重打包后资源引用全挂Apktool 的 ApkInfo 与 apktool.yml 一次讲清【免费下载链接】ApktoolA tool for reverse engineering Android apk files项目地址: https://gitcode.com/GitHub_Trending/ap/Apktool你改了反编译目录里的一个资源重新打包后新 APK 却打不开或者资源引用全对不上号——十有八九是反编译目录里那个 apktool.yml 出了岔子。重新打包时 Apktool 不依赖任何“记忆”它只读这个文件。apktool.yml 就是 ApkInfo 对象的序列化形态记录着重新构建所需的全部信息依赖哪个 Android 框架、SDK 版本区间、资源包 ID、哪些文件不允许压缩。apktool.yml 是反编译时怎么产生的执行apktool d xxx.apk时ApkDecoder 干的不只是解压文件这一件事它会把 APK 依赖的框架、SDK 边界、应用版本号、资源包信息等一并提取出来装进一个 ApkInfo 对象。ApkInfo 实现了 YamlSerializable 接口支持序列化为 YAML 并持久化反编译收尾阶段由save(outDir)以 apktool.yml 的名字写入输出目录。它的角色是“反编译 → 修改 → 重打包”这条回路里的数据载体你在目录里手改资源和清单重打包时 Apktool 通过ApkInfo.load(dir)把它读回来再据此重建 resources.arsc 与 AndroidManifest.xml。类源码位于brut.apktool/apktool-lib/src/main/java/brut/androlib/meta/ApkInfo.java配套的 SdkInfo、VersionInfo、ResourcesInfo、UsesFramework 都在同一目录下。一份最小可用的 apktool.yml 长这样apkFileName: basic.apk version: 2.8.0 sdkInfo: minSdkVersion: 4 targetSdkVersion: 22 resourcesInfo: packageId: 127 packageName: com.test.basic usesFramework: ids: - 1 doNotCompress: - arsc字段逐项解析每个字段改错了会怎样上表里的顶层键与 ApkInfo 的成员一一对应逐项说明含义和改错后果YAML 字段含义改错会怎样version生成该文件所用的 Apktool 版本号重打包版本与反编译版本不一致行为可能漂移apkFileName原始 APK 文件名解析器会校验路径字符非法值直接抛 SecurityExceptionusesFrameworkids/tagAPK 依赖的 Android 框架及标签重打包时找不到对应框架构建直接失败usesLibrary应用使用的共享库列表运行时找不到库应用崩溃sdkInfomin/target/maxSdkVersion支持的 API 级别下界、目标、上界target 设得过高在低版本设备行为异常ApkInfo 内部会把 target 收敛到 [min, max] 区间再参与构建versionInfoversionCode/versionName清单中的应用版本号与版本名应用商店或更新逻辑读到错误的版本信息resourcesInfopackageId/packageName/sparseEntries/compactEntries/keepRawValues资源包 ID、包名以及稀疏/紧凑条目、保留原始值等开关packageId 一改0x7f 前缀下的所有资源引用全部错位featureFlags功能配置标志开关状态与原 APK 行为不符doNotCompress不按压缩方式存储的文件扩展名列表resources.arsc 等被压缩资源加载可能出错ApkInfo 的 load 与 save 怎么用如果你走 API 而不是命令行调用 apktool比如把 APK 校验嵌进 CI 流水线入口只有两个方法File dir new File(out_dir); ApkInfo apkInfo ApkInfo.load(dir); // 从目录内的 apktool.yml 读取 apkInfo.getSdkInfo().setTargetSdkVersion(29); apkInfo.save(dir); // 整对象写回 apktool.yml注意load(File)实际是在该目录下找名为 apktool.yml 的文件再解析目录里没有它就直接抛 AndrolibException。另有一个ApkInfo.load(InputStream)重载可从任意流读取源码里标注为测试用途常规业务不建议使用。save(dir)只负责把对象序列化回 YAML不会改动原始 APK 文件本身。避坑清单重打包前核对这几项 ️坑删除或改名 apktool.yml。后果重打包时找不到框架依赖与资源包信息构建直接失败。正确做法这个文件不动要修改就先备份。坑手改 packageId改成和原始 APK 不同的值。后果即使构建通过0x7f 前缀的资源引用在设备上也是错乱的。正确做法保持与原始值一致通常是 127。坑随意调整 usesFramework 的框架版本或 SDK 边界。后果重打包抛 FrameworkNotFoundException或者新设备上正常、老设备上崩溃。正确做法与原 APK 保持一致确有功能需要再调整。坑手工编辑 YAML 时弄错缩进或结构。后果load 阶段解析失败重打包报错。正确做法改完先跑一次试打包验证别攒着多处修改一起上。一句话收束apktool.yml 是“反编译 → 修改 → 重打包”之间唯一的元数据载体文件完好重打包才有保证。【免费下载链接】ApktoolA tool for reverse engineering Android apk files项目地址: https://gitcode.com/GitHub_Trending/ap/Apktool创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表