Android瘦身之旅

android studio 下载 | 2019-01-11 15:28

话说爱美之心人皆有之,再加上当下以瘦为美的审美观,只要你够瘦,你才能更美。女人嘛~~ 瘦才算漂亮。为了跟随社会的潮流,APP变瘦变美的呐喊声也越来越大,只有变瘦变美,才会讨人喜欢。所以APP瘦身成为移动开发中不可或缺的环节,Apk瘦身后,可以直接的为用户节省流量,对于有线下运营推广的情况下可以更好的的获取用户。对于同行业竞品应用来说,更小的Apk体积,更具有优势。对于研发人员来说也是一次技术的提升,经验的积累。

2、APK组成

对于瘦身该怎么瘦,前提我们要分析apk文件的组成部分,只有弄明白apk文件内部的组成结构,我们才可以对症下药,逐个攻破。那么该怎么看内部的组成呢?我们可以通过Android Studio(注:需要IDE版本在2.2以后)自带的工具Analyze APK来进行分析,只要我们把生成的APK文件直接拖到Android Studio开发工具中就可以看到这个apk内部的组成。如下图:

通过查看我们发现Apk构成主要分为以下部分:

Java Class,被DEX编译后可供Dalvik/ART虚拟机所理解的文件格式

存放一些静态文件,例如html、音频、apk、js文件等

resources.arsc

编译后生成的二进制资源索引文件,资源id和资源key的映射关系

APK的签名信息

AndroidManifest.xml

程序全局配置文件

3、瘦身方向

通过Analyze APK分析我们可以发现各个部分在apk中的占比,其中占比最多的主要在lib、res、classes.dex、assets和resources.arsc这几个文件夹,接下来我们就针对每一个部分进行优化压缩。主要分为一下几个方向

lib文件夹So优化

res文件夹图片优化

classes.dex代码优化

assets资源优化

resources.arsc索引文件优化

4、瘦身操作

4.1、对lib文件夹So优化

So(shared object,共享库)是机器可以直接运行的二进制代码,是Android上的动态链接库,类似于Windows上的dll。每一个Android应用所支持的ABI是由其APK提供的.so文件决定的,这些so文件被打包在apk文件的lib/目录下。

So的常见的场景如:加解密算法、音视频编解码、核心代码等。在生成SO文件时,需要考虑适配市面上不同手机CPU架构,而生成支持不同平台的SO文件进行兼容。目前Android共支持七种不同类型的CPU架构,分别是:ARMv5,ARMv7 (从2010年起),x86 (从2011年起),Mips (从2012年起),ARMv8,Mips64和x86_64 (从2014年起)。

SO文件就是为了在对应的CPU架构上拥有更高的性能,适配市面上所有的CPU架构是最好不过了,但是这样会导致在libs目录下放置各个架构平台的So文件过多,Apk文件的大小自然也就更大了。那么我们自然想到缩减Libs的目录,一般情况下留下armeabi目录即可,armeabi目录下的So可以兼容别的平台的So,但是性能会有所损耗,会失去对特定平台的优化。但是我们可以只保留armeabi目录,根据功能模块对SO性能依赖程度,通过代码判断设备的CPU类型,SO的文件命名后缀可以加上CUP架构的标示,用于代码判断的时候加载其对应架构的SO文件,这样既缩减了Apk的体积,也不影响性能敏感模块的执行。

我们可以直接在项目的build.gradle中修改配置只保留armeabi目录即可

abiFilters 'armeabi'

4.2、对res文件夹图片优化

在res目录下面占比最大的其实是图片资源,首先我们可以删除一些无用的图片,检查一下是否有大图片存在,如果存在大图,可以对大图进行压缩处理。对于drawable目录只保留一份资源,但是Google强烈建议根据不同屏幕密度准备多套切图资源来做适配的。但是鉴于Android上对UI要求不会是最顶级的那种高度,即便是放在合适(注意这两个字)一个的目录下,在不同的分辨率下也会做自动的适配(等比例拉伸、缩放);因此还是建议:对UI不是最顶级要求的话根据自己的用户群体机型放在一个合适的目录下。这样毋庸置疑可以缩减Res的大小,进而减少Apk的体积。优化效果最为显著的莫过于对图片进行压缩,我们这里采用WebP的格式对图片进行展示。这里普及一下WebP,下面是WebP的介绍:

Google于2010年提出了一种新的图片压缩格式 — WebP,为图片提供了无损和有损压缩能力,同时在有损条件下支持透明通道。据官方实验显示:无损WebP相比PNG减少26%大小;有损WebP在相同的SSIM(Structural Similarity Index,结构相似性)下相比JPEG减少25%~34%的大小;有损WebP也支持透明通道,大小通常约为对应PNG的1/3。同时,谷歌于2014年提出了动态WebP,拓展WebP使其支持动图能力。动态WebP相比GIF支持更丰富的色彩,并且也占用更小空间,更适应移动网络的动图播放。

在项目中我们怎么使用WebP呢?放心Android Studio IDE工具已经为我们提供了转换方式,下面开始展示将图像转换成WebP格式:

1.对要压缩的图片或者drawable文件夹点击右键,会有一个菜单项 Convert to WebP之后点击确认,如下图:

如果勾选了预览在转换过程中会有预览的对话框,如下图

之后点击Finish即可,可以在日志窗口看转换的结果,在日志窗口可一看到跳过了多少的.9图片没多少个透明的图片等信息如下图:

最后你会惊奇的发现你图片减少了很多,内心是不是有种窃喜。

4.3、对classes.dex代码优化

因为classes.dex主要组成部分就是Java的字节文件,所以我们可以通过一下手段进行操作

删除项目中无用的代码和模块,对日积月累的迭代需求定期检查,即使的删除无用的代码和功能

删除无用的依赖库,并且及时的更新第三方的依赖库

启用Proguard混淆减少dex大小(效果明显,配置简单)

4.4、对assets资源优化

为什么特意说一下assets目录,因为我们这里会存放一些静态文件资源例如音频,Html,Js等文件,这些文件占用的空间一般都比较大,所以经常进行检查和清理,会有助于我们后期的优化。

4.5、对resources.arsc索引文件优化

5、瘦身总结

通过这次瘦身发现:删除不用的图片、删除遗留的音频资源、压缩图片见效最大;Android-apk瘦身So以及资源文件是见效最快的操作,并且使用WebP格式的图片,Apk会缩减更大的比例;而针对Dex的优化可能作用不会很明显

所以我们在开发过程中要定期检查依赖的SO和三方库,对Ui设计的图片都进行压缩并及时的删除不用的资源和依赖库,并且及时与产品、测试沟通,即使提测流程邮件中有说明,也要注重线下的交流,确保瘦身过程配置上的异常能够及时发现。本文只是本人的优化经验,如果有更好的优化方式欢迎交流。后期如果有更好的方式和工具,我会及时同步更新文章。