安装包立减1M--微信Android资源混淆打包工具

上一篇文章我们讲述了Android减少安装包体积的一些tips,本文主要对前文提到的资源混淆做一个简单的分析。微信中的资源混淆工具主要为了混淆资源ID长度(例如将res/drawable/welcome.png混淆为r/s/a.png),同时利用7z深度压缩,大大减少了安装包体积,同时也增加了逼格,提升了反破解难度。

写在前言

资源混淆工具大约是在2014年4月实现,并在微信5.4中使用,减少了大约1M的空间。然后在8月在公司内部开源,现以推广到QQ邮箱、QQ空间、手机管家等多个产品中使用。

具体源码与使用方法详细在github中:

https://github.com/shwenzhang/AndResGuard

方案演进

资源混淆简单来说希望实现将res/drawable/icon,png变成res/drawable/a.png,或我们甚至可以将文件路径也同时混淆,改成r/s/a.png。

Proguard -> Resource Proguard R.string.name -> R.string.a res/drawable/icon -> res/drawable/a r/s/a

我们可以想到以下几种方案:

  1. 最简单的方法,我们按照Proguard的做法,直接在源码级别修改,将代码以及xml的R.string.name中替换到R.string.a,icon.png重命名为a.png 然后再交给Android编译。
  2. 根据Android的编译流程,所有资源ID已经被编译成32位int值。这说明我们并不需要去修改xml与java,因为在编译过程已经被R.java所替换,我们直接修改resources.arsc的二进制数据,不改变打包流程,只要在生成resources.arsc之后修改它,同时重命名资源文件。
  3. 但是方案二看起来不错,但是它依然依赖了编译流程,不利于使用。其实我们可以做到直接处理安装包. 不依赖源码,不依赖编译过程,仅仅输入一个安装包,得到一个混淆包。

几种方案的对比如下:

毫无疑问,微信采用的是方案三。现在关键问题是我们如何直接修改resources.arsc文件来达到资源混淆的效果?

技术实现

在回答上面的问题之前,我们首先需要对resources.arsc的文件格式有一定的了解。resources.arsc一共有五种chunk类型,分别为TYPETABLE,TYPEPACKAGE,TYPE_STRING ,TYPETYPE,TYPECONFIG。

--table,是整个reousces table的开始,它的chunksize即是整个文件的大小。 --package,指的是一个package的开始,其实在resources,arsc是可以有多个package的。而packageID即是资源resID的最高八位,一般来说系统android的是1(0x01),普通的例如com.tencent.mm会是127(0x7f),剩下的是从2开始起步。当然这个我们在aapt也是可以指定的(1-127即八位的合法空间,一些混合编译就是改这个packageID)。 --string, 代表stringblock,我们一共有三种类型的stringblock。分别是table stringblock,typename stringblock, specsname stringblock。 --type,这里讲的是typename stringblock里面我们用到的各种type(用到多少种类型的type,就有多少个type chunk),例如attr, drawable, layout, id, color, anim等,Type ID是紧跟着Package ID。 --config, 即是Android用来描述资源维度,例如横竖屏,屏幕密度,语言等。对于每一种type,它定义了多少种config,它后面就紧跟着多少个config chunk,例如我们定义了drawable-mdpi,drawable-hdpi,那后面就会有两个config。 --entry,尽管没有entry这个chunk,但是每个config里面都会有很多的entry,例如drawable-mdpi中有icon1.png,icon2.png两个drawable,那在mdpi这个config中就存在两个entry。

简单来说方案为:

修改方案

1. table stringblock

我们需要把文件指向路径改变,例如res/layout/test.xml,改为res/layout/a.xml

2. 资源的文件名

需要将资源的文件名改为对应1,即将test.xml重命名为a.xml

3. specsname stringblock

旧的specsname除了白名单部分全部废弃,替换成所有我们混淆方案中用到的字符。由于大家都重复使用[a-z0-9_],specsname的总数量会大大减少。

4. entry中指向的specsname 中的id

例如原本test.xml它指向specsname中的第十项,我们需要用混淆后的a项的位置改写。

5. table chunk的大小

修改table chunk的最后大小

与7z极限压缩结合

根据上文安装包知识的文章,7z有着更好的压缩率,同时我们也可以强制压缩类似resources.arsc、png、jpg等Android默认不会打包压缩的文件。

最后把修改后的resources.arsc重打包即可,微信从解压,到混淆,到重打包耗费时间,不要799,也不要699,仅需35秒。具体效果如下图:

最后,整体的处理流程如下:

一些需要注意的问题

  1. compress参数对混淆效果的影响 若指定compess 参数.png、.gif以及*.jpg,resources.arsc会大大减少安装包体积。若要支持2.2,resources.arsc需保证压缩前小于1M。
  2. 操作系统对7z的影响 实验证明,linux与mac的7z效果更好
  3. keepmapping方式对增量包大小的影响 影响并不大,但使用keepmapping方式有利于保持所有版本混淆的一致性
  4. 渠道包的问题(**建议通过修改zip摘要的方式生产渠道包**) 在出渠道包的时候,解压重压缩会破坏7zip的效果,通过repackage命令可用7zip重压缩。
  5. 若想通过getIdentifier方式获得资源,需要放置白名单中。 部分手机桌面快捷图标的实现有问题,务必将程序桌面icon加入白名单

TODO,除了资源混淆,其实我们还可以实现资源加密等其他功能。

原文发布于微信公众号 - WeMobileDev(WeMobileDev)

原文发表时间:2015-10-12

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏小狼的世界

由于版本依赖造成的YUM段错误

最近在服务器(Centos 5.3,64位)上使用YUM,总是提示 Segmentation Fault,无论执行什么命令都是如此,一时不得其解。

13820
来自专栏企鹅号快讯

做网站-推荐3种CSS,JS合并的方式

在Web项目的开发中,js,css文件会随着项目的开发变得越来越多,越来越大,这就给给性能方面带来一些问题,如,页面引入的的js,css越多的话,那么对就增加了...

810110
来自专栏进击的程序猿

ZooKeeper: Wait-free coordination for Internet-scale systems(笔记)

本文是读ZooKeeper: Wait-free coordination for Internet-scale systems的笔记,从第一手资料了解zook...

12830
来自专栏JavaEdge

网站的伸缩性架构一、网站架构的伸缩性设计二、应用服务器集群的伸缩性设计三、分布式缓存集群的伸缩性设计四、数据存储服务器集群的伸缩性设计

43190
来自专栏微信公众号:Java团长

Maven那点事儿

毋庸置疑,Jason 也是一个秃顶。James Gosling、Rod Johnson、Gavin King,你们可以告诉我为什么吗?

11130
来自专栏Golang语言社区

关于缓存你需要知道的

About Cache 作后端开发的同学,缓存是必备技能。这是你不需要花费太多的精力就能显著提升服务性能的灵丹妙药。前提是你得知道如何使用它,这样才能够最大限度...

369130
来自专栏安恒网络空间安全讲武堂

CVE-2018-14421 Seacms 后台getshell分析

最近看到关注的博客里面,有一篇师傅拿cve的文章,是有关于海洋cms的后台getshell,只给出了exp,但是并没有详细的分析流程,好奇心的驱使下,开始了对这...

18720
来自专栏IT技术精选文摘

HBase Region自动切分细节

Region自动切分是HBase能够拥有良好扩张性的最重要因素之一,也必然是所有分布式系统追求无限扩展性的一副良药。HBase系统中Region自动切分是如何实...

35570
来自专栏IT技术精选文摘

缓存在分布式系统中的应用

缓存是分布式系统中的重要组件,主要解决高并发,大数据场景下,热点数据访问的性能问题。提供高性能的数据快速访问。 一、缓存概述 缓存是分布式系统中的重要组件,主要...

37890
来自专栏公有云大数据平台弹性 MapReduce

MR调优实战

参数1-6是针对yarn的设置。参数1是告诉集群本节点有多少内存资源。2和3设置单个container能够申请到的最小最大内存。4是是否物理开启内存监控,监控c...

25910

扫码关注云+社区

领取腾讯云代金券