您的位置:首页 > 移动开发 > Android开发

Android的APK安装包瘦身

2016-09-14 18:12 337 查看

概述:

年初我们的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.csdn.net/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
原理介绍:安装包立减1M--微信Android资源混淆打包工具

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极大的瘦身下来,但考虑到风险,建议挑选适合自己的方法;还有一些方法没有列举出来,只因自己还没有亲身试用,等试用过后会及时补充更新。

参考文章:
http://jayfeng.com/2015/12/29/APK%E7%98%A6%E8%BA%AB%E5%AE%9E%E8%B7%B5/?spm=a313e.7916648.0.0.VW6Cyb

http://jayfeng.com/2016/03/01/Android-APP%E7%BB%88%E6%9E%81%E7%98%A6%E8%BA%AB%E6%8C%87%E5%8D%97/?spm=a313e.7916648.0.0.VW6Cyb

http://www.cnblogs.com/soaringEveryday/p/5254520.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: