微信AndResGuard资源混淆工具
微信AndResGuard资源混淆工具
AndResGuard是一个帮助你缩小APK大小的工具,他的原理类似Java Proguard,但是只针对资源。他会将原本冗长的资源路径变短,例如将res/drawable/wechat变为r/d/a。
AndResGuard不涉及编译过程,只需输入一个apk(无论签名与否,debug版,release版均可,在处理过程中会直接将原签名删除),可得到一个实现资源混淆后的apk(若在配置文件中输入签名信息,可自动重签名并对齐,得到可直接发布的apk)以及对应资源ID的mapping文件。
0x01 原理介绍
根据Android的编译流程,所有资源ID已经被编译成32位int值。这说明我们并不需要去修改xml与java,因为在编译过程已经被R.java所替换,我们直接修改resources.arsc
的二进制数据,不改变打包流程,只要在生成resources.arsc之后修改它,同时重命名资源文件。
0x02 使用场景
- 缩小APK体积
- 保护res资源文件的可读性
- 皮应用中减少跟主应用代码的重复率
0x03 资源混淆配置
- Project根目录的
build.gradle
中,添加插件的依赖
1 | buildscript { |
- app模块的
build.gradle
中添加Res相关配置
1 | plugins { |
0x04 如何启动
使用Android Studio的同学可以在 andresguard
下找到相关的构建任务; 命令行可直接运行./gradlew resguard[BuildType | Flavor], 这里的任务命令规则和assemble一致。
0x05 配置7Zip压缩
在设置sevenzip时, 你只需设置artifact或path, 支持同时设置,总以path的值为优先。
0x06 配置apk输出
如果没有配置finalApkBackupPath,最终结果会覆盖assemble[BuildType | Flavor]的输出APK。如果配置则输出至finalApkBackupPath配置路径。
0x07 Font资源不支持混淆
如果项目中使用了font资源,需要配置mappingFile = file("./resource_mapping.txt")
,同时在app目录的resource_mapping.txt
文件中添加
1 | res path mapping: |
0x08 一些需要注意的问题
- 如果不是对APK size有极致的需求,请不要把resources.arsc添加进compressFilePattern.
- 对于发布于Google Play的APP,建议不要使用7Zip压缩,因为这个会导致Google Play的优化Patch算法失效.
- compress参数对混淆效果的影响
若指定compess 参数.png、.gif以及*.jpg,resources.arsc会大大减少安装包体积。若要支持2.2,resources.arsc需保证压缩前小于1M。 - 操作系统对7z的影响
实验证明,linux与mac的7z效果更好 - keepmapping方式对增量包大小的影响
影响并不大,但使用keepmapping方式有利于保持所有版本混淆的一致性 - 渠道包的问题(建议通过修改zip摘要的方式生产渠道包)
在出渠道包的时候,解压重压缩会破坏7zip的效果,通过repackage命令可用7zip重压缩。 - 通过getIdentifier方式获得资源,需要放置白名单中。
- 部分手机桌面快捷图标的实现有问题,务必将程序桌面icon加入白名单
- 第三方SDK的资源加入白名单。可以在
white_list.md
https://github.com/shwenzhang/AndResGuard/blob/master/doc/white_list.md查看更多sdk的白名单配置
0x09 相关资源
使用说明:https://github.com/shwenzhang/AndResGuard/blob/master/README.zh-cn.md
white_list.md
:https://github.com/shwenzhang/AndResGuard/blob/master/doc/white_list.md
微信AndResGuard资源混淆工具
https://denchopen.github.io/blog/2022/11/26/Android专栏-微信AndResGuard资源混淆工具/