随着app添加或者替换的功能越来越多,app的体积越来越大,考虑到app体积影响到的用户体验和下载欲望,项目就开始了瘦身之旅。虽然和道长一样瘦身是痛苦的,但是还好有一些成果,不像道长的体重一样……这里和小伙伴们分享一下。
#一、apk的组成
app瘦身之前,我们首先需要了解安装包的组成结构:
- dex文件
我们编写的所有Java代码都会由编译器转化成dex文件 - res文件夹
存放所有的资源文件 - lib文件夹
存放所有的库文件 - assets文件夹
存放需要保持原始文件的资源文件夹 - AndroidManifest.xml文件
Android应用的配置文件 - META-INF文件夹
存放签名校验相关的文件 - 其他文件
然后我们可以使用Android Studio (注意是2.2.3版本以上)直观的看一下我们的安装包的构成以及大小:
我们可以看到在安装包中占比较大的包括:dex文件、res文件夹、assets文件夹、lib文件夹以及resource.arsc文件。所以,接下来的瘦身优化就是让这些文件变小,以此达到瘦身的目的。
#二、res瘦身
首先我们看到res是占有apk最大的体量。我们从res瘦身开始也是最容易下手的地方。
##1.移除无用的资源
如果我们一个一个的查看这个图片是否被占用是很傻的。我们可以借用Android Studio来实现:
然后输入:Unused resources
随后会有一个弹窗如下,这个弹窗有很多选项,这里道长选择整个项目:
然后等待一下就会有结果了:
你可以找到相应的资源一一删除,但是像道长这样有2370个的,如果让道长一一删除,道长选择狗带。当然Android Studio是很人性化的。让我们看看怎么使用Studio删除所有无用的资源:
然后会有一个弹窗然你选择:
注意:代码中引用方式不同,所以存在代码中使用了某个资源,但是依然被当成没有引用的情况,例如通过使用getIdentifier、Uri等方式。
##2.不打包无用的资源
当然这样只能一次清除无用资源,但是总不能每次迭代更新都清一次吧。然后我们可以在gradle中这样配置就不用每次都清理了。
注意:shrinkResource只能帮你压缩合并资源,并不能帮你移除资源文件,所以经过一段时间的积累还是要清理一次的。
##3.使用 Drawable XML、Color、.9 PNG、JPG 代替 PNG
- Drawable XML替换PNG
使用场景:一些渐变的图片或者纯色的图片 - Color替换PNG
使用场景:纯色的图片 - .9 PNG替换PNG
使用场景:复用率比较高的图片,且形状相似 - JPG替换PNG
使用场景:不需要透明度的图片
##4.尽量只保存1~2份图片资源
虽然在 drawable 或者 mipmap 目录用于适配不同 dpi 的屏幕,但是市场上xxhdpi的手机屏幕还是占有绝大部分的,但是考虑到以后的手机屏幕的dpi提高,所以我们项目选择了保留xxhdpi和xxxhdpi这两份图片资源。
#二、lib瘦身
##1.移除无用的dependencies、jar包和.so文件
app功能的添加可能要引用一些第三方开源框架。但是当这些功能删除掉时应当及时删除相应的dependencies、jar包和.so文件。在打包中如果全架构适配.so文件会占有体积的很大一部分,如下所示:
而一些架构市场占有率是很低的,一些大厂也做了相应的处理,如下所示:
微信(只适配armeabi)、qq(只适配armeabi)、王者荣耀(只适配armeabi-v7a)、百度地图(只适配armeabi)、大众点评(只适配aremeabi)等
所以最后在build.gradle中的defaultConfig作如下配置就可以大幅缩减app体积:
##2.移除功能重叠的框架
像我们项目中有几套网络访问框架Volley、HttpClient、Retrofit这三套框架,而切图片加载框架有ImageLoader、Picasso两套框架,我们这样只能靠代码Review解决,最后决定移除那些框架。
##3.减小对 Support 兼容包的依赖
我们看到我们项目的dex文件有两个,这是因为使用Support-V4造成的。项目引入V4包无疑会增大 dex 文件的大小,Google已经意识到这个问题,所以 Support-V7就做了拆分,并且开始对 Support-V4做拆分,虽然目前成果还不明显,当使用V7包替换了V4包后,可能就从2个dex变成1个dex。
#三、代码瘦身
##1.移除废弃功能的代码
如果该功能已经废弃就可以直接删除了,即便以后脑残产品又要添加了,我们也可以在git或者SVN上找到。
##2.移除重复的代码
已经有了的功能代码,团队成员不知道自己又写了一套,只能靠代码 Review 解决了。
好了,我们这次app瘦身的内容大概就这么多。希望这篇博客能够为小伙伴们提供一些帮助。