android:app瘦身之旅

来源:互联网 发布:行知职高吧 编辑:程序博客网 时间:2024/06/05 21:13

随着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文件

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瘦身的内容大概就这么多。希望这篇博客能够为小伙伴们提供一些帮助。