Andorid插件之资源去重丶图片压缩丶混淆插件(2)

2,246

功能实现

前面已经分析清晰了,只需要在 processDebugResources Task 添加一个 dotLastAction对应去重丶压缩丶混淆丶修改 resources.arscOK 了。

w

去重资源

其实美团技术团队,提出过这种去重的方案,当时我不明白这些大厂的程序员只喜欢说理论不喜欢给一个代码实例吗?大体方案如下:

  1. resources-debug.ap_ 是一个 ZIP 文件,遍历里面的每个文件,查找每个文件的 crc 值(这个值能判断出文件是否相同,有点类似文件的 MD5 值),记录重复的文件。
  2. 删除 resources-debug.ap_ 记录的重复文件。
  3. 通过 android-chunk-utils 修改 resources.arsc ,把这些重复的资源都重定向到同一个文件上.

为啥要修改 resources.arsc 文件呢?我前面都说过了,因为 resources.arsc 面记录的了一些信息,具体什么信息呢?看下嘛的图。

从上图可以知道,resources.arsc 记录了文件的信息,包括 R 类的 id 信息,以及文件路径。我们删除了 res 中重复的资源,哪我们也要将 resources.arsc 重复的信息,修改绑定到唯一留下的重复文件,不然代码中使用的重复资源就会出现找不到的情况。

图片压缩

图片压缩逻辑就简单很多了,我们只需要遍历 res 目录下面所有的图片,进行压缩算法进行压缩就行了。难点在于用什么工具处理压缩图片呢?

我寻找到了很多资料,当时异想天开的用鲁班压缩,最后发现鲁班压缩用了 AndroidSDK 并没有提供 Java 版。

最终看到了这个开源项目 McImage,既然前人有人实现了这样的图片压缩插件。看了下他的原理,是和我前面分析的 MergeResources Task 做的操作,因为它只是压缩图片,不做去重和混淆,在这 MergeResources Task 的之后做操作当然是可以的啦。

既然有前人为我们完成了这部分功能,我就不浪费时间啦,谢谢!McImage


图片压缩算法

资源混淆

说到资源混淆,不得不说腾讯开源的项目 AndResGuard 它的混淆原理也是修改 resources.arsc (万变不离其宗),但是这个插件需要运行 Task 生成混淆资源的 Apk。我大体看了下他是在生成 Apk 之后做的处理,这样还需要对 Apk 重新签名,比较麻烦。

混淆修改 resources.arsc 什么信息呢?要怎么处理呢?




我们来看下最终的混淆结果!

前面说 Name 也要改,最后才想起来 Name 不能改!因为代码中寻找资源并不一定都是通过 ID 查找,也可以通过 getIdentifier(String name, String defType, String defPackage) 根据昵称找 ID,所以 Name 不能混淆。

总结

总算所有的逻辑思路都理解了,清晰了,技术难点都攻破了,接下来就开始

源代码

QOptimize 插件是一款,在 Apk 编译期间对 Apk 进行体积优化的一款插件。

git地址

博客地址