微信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 资源混淆配置

  1. Project根目录的build.gradle中,添加插件的依赖
1
2
3
4
5
buildscript {
dependencies {
classpath 'com.tencent.mm:AndResGuard-gradle-plugin:1.2.21'
}
}
  1. 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
// 打开这个开关,会keep住所有资源的原始路径,只混淆资源的名字
keepRoot = false
// 设置这个值,会把arsc name列混淆成相同的名字,减少string常量池的大小
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'
//path = "/usr/local/bin/7za"
}

/** * 可选: 如果不设置则会默认覆盖assemble输出的apk **/
// finalApkBackupPath = "${project.rootDir}/final.apk"

/** * 可选: 指定v1签名时生成jar文件的摘要算法 * 默认值为“SHA-1” **/
// digestalg = "SHA-256"
}

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.mdhttps://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.mdhttps://github.com/shwenzhang/AndResGuard/blob/master/doc/white_list.md

作者

Dench

发布于

2022-11-26

更新于

2022-11-26

许可协议

CC BY-NC-SA 4.0

Your browser is out-of-date!

Update your browser to view this website correctly.&npsb;Update my browser now

×