Android之安装包极限瘦身

引言

随着项目需求不断增加,Apk安装包变得越来越大,迫切需要瘦身。

普通瘦身

1)压缩图片
图片资源是导致apk体积重要原因之一。在图片资源使用时,我们尽量不引入无用的资源,同时要合理适配屏幕分辨率。
压缩图片,如使用 tinypng
合理使用SVG。优点:不失真。缺点:消耗CPU计算能力。
合理使用WebP。优点:图片占比小 缺点:加载比PNG慢,要求配置高。

2)Lint工具
Lint工具非常强大。它可以分析很多问题:
  • 检查没有使用的布局,及布局嵌套太多等
  • 未使用过的资源,如图片
  • Strings字符串的引用
  • 检测Leak
  • 未注册的组件
  • java语法问题
  • 等等
3)资源插件化
表情包、皮肤等,可以打包成apk动态加载。

4)混淆  
修改文件名,变成短文件名如a.java、b.java
方法名变成短名
去掉注释等等

极限瘦身

极限瘦身也可称为apk"再混淆"。什么是“再混淆”,就是apk先通过as混淆后,再进行资源混淆。

为什么能进行资源混淆呢?
google在把apk打包的时候,把应用程序资源目录的信息,包括每一个资源名称、类型、值、ID以及所配置的维度信息,都记录到了一个叫resources.arsc的二进制文件。这个resources.arsc文件想象成是一个资源索引表,它在给定资源ID和设备配置信息的情况下,能够在应用程序的资源目录中快速地找到最匹配的资源。
解压apk,可以看到这个文件:


resources.arsc分析

Resource.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。


资源混淆的实现原理:通过读取分析resources.arsc二进制文件和结合res文件下的drawable、layout等资源,按照你的规则(重写定义res下的文件路径、文件名)重新生成新的resources.arsc二进制文件。然后替换apk里的resources.arsc。

资源混淆后res路径


感谢腾讯大牛已经写好了这样一个ResProguard工具,见:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值