AndResGuard

关注
义项:Android资源混淆工具
AndResGuard

AndResGuard是由微信团队开发并开源的Android资源混淆与APK体积压缩工具,其作用对象仅限于资源文件,原理与Java代码混淆工具ProGuard类似,它可以把res/drawable/wechat这类冗长路径改写为r/d/a,并把wechat.png改名为a.png[1]。该工具直接处理已编译完成的APK,不依赖源码、不侵入编译流程,可明显缩小resources.arsc与安装包体积,并提高APK被Apktool等工具逆向的难度[2]。

百科 图文
目录
  1. 定义
  2. 原理
  3. 发展历程
  4. 应用
  5. 局限
  6. 参见

定义

AndResGuard是一款面向Android应用的资源混淆工具,由微信团队开发并在其开源仓库中发布[1]。它针对的不是Java代码,而是APK中的资源:把res目录与resources.arsc中记录的资源名称、目录层级替换为极短的随机名称,例如将res/drawable/welcome.png改写为r/s/a.png。

从使用形态看,它既可以作为命令行工具运行,也可以通过Gradle插件集成到构建流程中,支持Windows、Linux与Mac平台[2]。工具在处理过程中会删除原有签名,若在配置中填入签名信息,则可自动重签名并做对齐,直接输出可发布的安装包,同时生成记录资源ID对应关系的mapping文件[1]。

原理

Android在编译期会把每一个资源编译成一个32位整型ID,形如$0xPPTTEEEE$,其中PP为包ID,TT为资源类型ID,EEEE为该类型下的条目ID;代码与XML中引用的资源名在编译后已经被替换为这些整型值[3]。因此工具无需回头修改源码或XML,只要改写索引文件resources.arsc中的二进制数据并同步重命名实际资源文件,就能达到混淆效果。

resources.arsc由若干chunk构成,包括TYPETABLE、TYPEPACKAGE、TYPESTRING、TYPETYPE与TYPECONFIG等类型。文件中保存着三处字符串池,分别存放资源值、资源条目名与资源类型名,工具主要替换的是指向文件路径的表字符串与条目名池,白名单之外的部分被替换为短名称[3]。

处理流程上,工具先解压输入APK并复制一份副本,解析副本中的resources.arsc,按配置完成资源名与目录名的混淆,随后重新打包、按需签名、对齐,最后可用7z以极限压缩模式重新压缩,产出体积更小的安装包。

发展历程

资源混淆方案大约在2014年4月实现,并在微信5.4版本中投入使用,使安装包体积减少约1M。同年8月,该工具在公司内部开源,随后推广到QQ邮箱、QQ空间、手机管家等多个产品中使用。

在方案选择上,团队排除了直接修改源码R引用的做法,也放弃了依赖编译流程、在生成resources.arsc之后再改写的方式,最终选择直接处理已打包APK、不依赖源码与编译流程的路线,以获得更彻底的混淆效果。

工具后续以Gradle插件形式发布,插件会为每个application变体创建相应的混淆任务并依赖于对应的打包任务[4]。随着Android版本演进,插件在targetSdkVersion达到30及以上时会自动从压缩列表中移除resources.arsc,因为该版本起要求安装包中的resources.arsc以未压缩且4字节对齐的方式存储[3]。

应用

该工具的主要用途是压缩安装包体积,通过缩短资源名、7z重新压缩、强制压缩图片与resources.arsc、合并重复资源等方式减少占用[5]。同时,由于资源路径与名称被替换,APK的可读性下降,可增加使用Apktool等工具反编译分析的难度[2]。

在工程实践中,它常以Gradle插件方式接入,通过白名单、压缩规则、旧mapping、签名等配置项定制混淆行为[5]。出海项目中,类似的资源混淆与压缩也被用于App Bundle形态的产物优化。

局限

混淆破坏了资源名称的稳定性,凡是按名称动态读取资源的地方都可能失效。通过getIdentifier获取的资源、依赖资源名读取数据的第三方SDK,以及部分手机桌面快捷图标所依赖的图标资源,都必须加入白名单,否则可能出现异常[1]。

压缩策略存在兼容性约束。若把resources.arsc纳入压缩范围,且该文件原始大小超过1M,产物将无法在Android 2.3以下系统运行;文档也不建议对体积没有极致需求的场景压缩resources.arsc[1]。面向Google Play发布的APK,官方文档建议不要使用7z压缩,因为这会破坏Google Play的增量更新算法效果[1]。

7z压缩还会带来其他副作用。使用7z压缩过的APK存在已知问题,即AssetManager的list方法返回的列表首元素为空字符串;同时7z的极限压缩耗时明显增加,且在不同操作系统上的压缩效果存在差异,Windows下生成的包体积通常更大[2]。

此外,混淆名称变化对增量包体积的影响并不显著,采用保留旧mapping配置的主要价值在于维持跨版本混淆结果一致,便于排查问题,而非显著减小差分包[5]。

参见

  • ProGuard —— 面向Java代码的混淆与压缩工具,AndResGuard的资源混淆思路与之类似。

  • Android —— 该工具处理对象的运行平台。

  • APK —— 工具处理的输入与输出文件格式。

  • resources.arsc —— 存储Android资源索引的二进制文件,是资源混淆的核心改写对象。

  • 7z —— 工具用于重新打包与极限压缩的压缩格式。

  • Gradle —— 该工具提供插件集成的构建系统。

词条评价
词条统计

浏览次数:2 次

阅读量:0 次 · 阅读完成量:0 次

最近更新:2026-10-13T20:30:56Z

历史版本

本条目引用的词条
Android 微信 命令行 ProGuard APK resources.arsc 7z Gradle