概述:
年初我们的apk随着业务量的增加,尤其是加入地图导航后,apk的大小从10M徒增到了20M。
apk体积增大的原因:
- 业务量的增加
- 增加高分辨率图片
- 依赖了更多的第三方库
- 无用的资源
本文将根据自己在项目中采取的方法来减小apk的体积。减小apk体积也是一种android的优化手段,包过大会增加用户流量,降低下载欲望,同时也会降低安装失败的概率。
1.Analyze APK
Android Studio 2.2版本增加了Analyze APK功能,可以直接查看apk中各个模块占用的空间,我们可以利用此功能来查看需要优化的部分
可以看出apk中各部分占用空间的比重,现在我们可以知道从何处下手来进行优化。
2.lint检查去除冗余
Android Studio-> Analyze -> Run Inspection by Name 输入unused resources,此功能可以筛选出无用的资源,看一下分析结果
竟有300多个无用的资源文件,这里需要参考这份报告手动去删除,删除一波。
3.使用一套图片资源
我们知道Android支持多套图片资源适配,但对于大多数的app一套图就足够了,鉴于现在的形式,建议1080p的资源放在xxhdpi目录中。也有人建议720p的资源,虽然720p占用的硬盘的内存更小,但是在应用内存中占用更大的空间(可以参考这篇文章:
http://blog.youkuaiyun.com/wrg_20100512/article/details/51295317),这会增加内存溢出的概率,虽然1080p占用的硬盘内存更大一些,但我们可以通过下面的方法近一步的优化。
4.TinyPng有损压缩
官方网站:
https://tinypng.com/
很好的图片压缩网站,直接上传资源然后下载即可,使用非常方便,同时压缩效果非常好,强烈推荐。
5.使用jpg格式
像一些启动页、背景图、轮播图的png图片比较大,就算利用TinyPng有损压缩后感觉还是大,把这个图片转换为jpg后效果很明显。
6.使用webp格式
如果png图片转换成jpg格式后还是很大,此时想压缩的更小,而尽量不降低画质,那么可以考虑一下webp。webp从Android4.0+开始原生支持,所以4.0以下设备将无法看到图片,使用的时候请注意,不过我们的app最低兼容的就是4.0+,所以无需担心。
webp使用方法:
- 首先来下载工具,webp官网下载:https://developers.google.com/speed/webp/docs/precompiled,根据自己的系统下载合适的版本;
- 解压下载的文件,命令行进入bin目录;
- 执行转换命令:cwebp -q <quality> input.jpg -o output.webp 其中quality官方评测75是最佳值,我们可以自己定义数值,我这里用的是75;
- 看一下结果,可以看到直接从201KB减小到了43KB,效果很明显;
7.使用shape背景
在开发的时候我们能用代码做出来的效果就尽量不要用图片,这样可减少图片资源的数量,从而减少体积,很多背景图如按钮的背景、纯色背景都可以使用shape来制作,代码灵活可控,省去了大量的背景图片。
8.开启shrinkResources去除无用资源
通过lint我们已经去除了很多无用的资源,但是我们依赖的一些官方库和第三方库中也可能引用了资源图片,我们不需要这些资源,此时在gradle中使用shrinkResources去除无用资源,效果不错。
9.代码混淆
在gradle中使用minifyEnabled进行Proguard混淆的配置,可减小apk的体积
详细的proguard配置可根据自身项目酌情编写,开启后要做好测试工作。
10.删除无用语言
通过配置resConfig可以选择支持打包的语言,从而去掉世界各地的语言支持
11.使用微信资源压缩打包
微信资源压缩打包原理一句话总结就是:直接处理安装包,不依赖源码,不依赖编译过程,仅仅输入一个安装包,得到一个混淆包。主要是混淆资源ID长度(例如将res/drawable/icon.png混淆成r/s/a.png),同时利用7z深度压缩,大大减小apk体积。
具体源码和使用方法在github中:
https://github.com/shwenzhang/AndResGuard
12.避免重复库
避免重复库看似简单,但其中有玄机,要当心你引用的库中又引用了哪个第三方库,这样就容易出现功能重复的库了,常见的如图片加载的库:Glide、Picasso、ImageLoader等等。可通过studio查看External Libraries目录中是否有重复库的存在,减小apk体积。
13.使用更小的库
顾名思义,更小的库代表体积更小,很好理解。有些时候同样功能的库在大小上的悬殊有可能是很大的,如果对某个库的要求不是非常苛刻,尽量选择更小的库,这会减小apk的体积,这种方案不是决定性因素,可作为参考。
14.删除无用的so包
我们在加入百度地图后,会引入很多很多的so包,这些so文件占用很大的体积,像x86和x86_64都是跑在模拟器上面的,我们无需去支持,可以直接删除,或者在defaultConfig中配置:
15.风险评估
方法条例 | 适用范围 | 易用性 | 风险指数 | 备注 |
---|---|---|---|---|
lint检查去冗余 | 全部 | 易 | 无 | |
使用一套图片资源 | 非极高UI要求的APP | 易 | 无 | |
TinyPng有损压缩 | 非极高UI要求的APP | 易 | 无 | |
使用jpg格式 | 仅限非透明大图 | 易 | 中 | |
使用webp格式 | 仅限4.0+设备 | 中 | 中 | |
使用shape背景 | 全部 | 易 | 无 | |
开启shrinkResources去无用资源 | 全部 | 易 | 无 | |
代码混淆 | 全部 | 易 | 无 | |
删除无用语言 | 非全球国际化应用 | 易 | 无 | |
使用微信资源压缩打包 | 全部 | 中 | 中 | 要配置白名单 |
避免重复库 | 全部 | 中 | 中 | |
使用更小的库 | 全部 | 中 | 中 | |
删除无用so包 | 限对特定设备不兼容(例如模拟器) | 易 | 高 | |
小结:
上述步骤已经能够把APP极大的瘦身下来,但考虑到风险,建议挑选适合自己的方法;还有一些方法没有列举出来,只因自己还没有亲身试用,等试用过后会及时补充更新。
参考文章: