AndResGuard的使用

AndResGuard是何物?

AndResGuard是一个帮助你缩小APK大小的工具,他的原理类似Java Proguard,但是只针对资源。他会将原本冗长的资源路径变短,例如将res/drawable/wechat变为r/d/a。一般用于给apk瘦身。

具体请看:

https://github.com/shwenzhang/AndResGuard/blob/master/README.zh-cn.md

我们解压缩apk后可以看到这个文件

resources.arsc

这个文件是编译后的二进制资源文件,里面是id-name-value的一个map,即id与资源名称的一个映射,如:

AndResGuard。它将资源的名称进行了混淆,所以可以用它对resources.arsc进行优化,只是具体优化效果与编码方式、id数量、平均减少命名长度有关。

例如:

表一:

 

表二:

表二是经过优化后的,我们一眼就可以知道表2肯定比表1存储的字符要小,所以整个文件的大小肯定也要小一些,因此就达到了瘦身的效果。

 

总的来说它可以将res/drawable/activity_advanced_setting_for_test变为r/d/a,达到混淆与减少体积的效果,也增加了反编译后阅读代码的难度,安全性高

 

那么怎么使用呢?

第一种方式:AS集成

1、在项目的build.gradle中添加依赖如下:

 

 

2、在app下建立gradle文件and_res_guard.gradle,里面的内容如下:

其中whiteList(白名单)中指定不需要进行混淆的资源路径规则,所有使用getIdentifier访问的资源都需要加入白名单,因为使用这种方式访问的资源,在代码中写死了id,比如:
int mipmapId = getResources().getIdentifier(“ic_launcher”, “mipmap”, getPackageName());,如果不加入白名单的话会报找不到资源的错误。
 
还有一些第三方SDK,因为有些SDK的代码中也用这种方式引用到对应的资源文件,如果对其进行混淆,会导致找不到对应资源文件,出现crash,所以不能对其资源文件进行混淆。像友盟这种喜欢用反射获取资源的SDK就是一个坑(友盟的SDK就是坑王)!对于app启动图标这样的icon可以不做混淆,推荐将其放入白名单里

可以在white_list.md查看更多sdk的白名单配置,也欢迎大家PR自己的白名单

 

compressFilePattern和compressFilePattern中的通配符支持? + *


白名单机制只作用于资源的specsName,不会keep住资源的路径。如果想keep住资源原有的物理路径,可以使用mappingFile。 例如我想keep住icon所有folder,可以在mappingFile指向的文件添加:

 

注意!

  1. 如果不是对APK size有极致的需求,请不要把resource.asrc添加进compressFilePattern. (#84 #233)
  2. 对于发布于Google Play的APP,建议不要使用7Zip压缩,因为这个会导致Google Play的优化Patch算法失效. (#233)

 

3、在app的build.gradle中引入:

编译一下便可以在gradle的task任务列表里看到混淆任务

使用:

双击对应的task可以编译debug包,release包。混淆后的apk生成在build/output/apk/AndResGuard_*目录中,默认会生成4种apk,我们选择签名、压缩、对齐后的apk即可,后缀名是*_signed_7zip_aligned.apk

 

第二种方式:指令集成

 1、下载AndResGuard过程:

https://github.com/shwenzhang/AndResGuard

 

 

2、解压,可以看到这个文件,进入这个文件

 

文件夹里面有这么一些东西:

 

文件作用:

jar包:用来执行命令的时候使用

build_apk.bat :windows执行脚本

build_apk.sh:linux执行脚本,由于我使用的是windows系统,所以就。

发布者

大道苍莽,一笔一墨,皆重之。

发表评论

电子邮件地址不会被公开。