微信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 2 3 4 5 buildscript { dependencies { classpath 'com.tencent.mm:AndResGuard-gradle-plugin:1.2.21' } }
app模块的build.gradle
中添加Res相关配置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 plugins { id 'AndResGuard' } android {...} andResGuard { mappingFile = file("./resource_mapping.txt" ) use7zip = false useSign = true keepRoot = false fixedResName = "arg" mergeDuplicatedRes = true whiteList = [ "R.mipmap.ic_launcher" , "R.mipmap.ic_launcher_round" , "R.string.app_name" , ] compressFilePattern = [ "*.png" , "*.jpg" , "*.jpeg" , "*.gif" , ] sevenzip { artifact = 'com.tencent.mm:SevenZip:1.2.21' } }
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 2 res path mapping: res/font -> res/font
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
原理介绍:https://mp.weixin.qq.com/s?__biz=MzAwNDY1ODY2OQ==&mid=208135658&idx=1&sn=ac9bd6b4927e9e82f9fa14e396183a8f#rd
white_list.md
:https://github.com/shwenzhang/AndResGuard/blob/master/doc/white_list.md