开篇语 前阵子老大交给了我一个任务,主要是帮我们开发的直播应用做 Android 端的安装包瘦身,花了大概一周的时间把安装包从 18MB 减小到了 12.5MB。原本完全可以优化到 10MB 之下,但由于其他原因的限制,所以目前阶段只到 12.5MB 为止。在此记录一下优化的思路和用到的工具,方便自己以后 Review ,有需要的童鞋也可供参考。 瘦身的目的 从目的导向来看,我们是不会无缘无故去做一件事情的,那我们对应用瘦身的目的是为了什么?答案是:提高下载转化率。什么是下载转化率?举个栗子:你的应用大小是 18MB ,有100个潜在用户想要去下载尝试使用,结果有20个用户嫌弃安装包太大直接扬长而去,有20个用户在等待下载的过程中取消下载,最终只有60个用户真正下载安装,那么应用的下载转化率就是 60/100 = 60% 。 简单的小结便是:安装包越小,用户下载等待的时间越短,对手机存储配置小的设备体验愈佳,应用的下载转化率也就越高。记得以前在腾讯大讲堂听微信大牛说过,微信第一个版本只有差不多 400KB ,瞬间膜拜。 安装包的组成要对安装包做瘦身,首先需要了解安装包的组成结构,这里简单的梳理了一下组成各个部分及其作用: 其中,在安装包中占比较大的包括:dex文件、res文件夹、assets文件夹、lib文件夹以及resource.arsc文件。所以,接下来的瘦身优化就是让这些文件变小,以此达到瘦身的目的。 在 Android Studio 2.2.3 开始,就加入了浏览 APK 结构的功能,我们直接把安装包拖入 IDE ,就可以直接浏览其组成和对应大小,这样能够很方便的对比分析出每一步优化后的结果。 资源瘦身 了解完 APK 的组成,我们可以开始着手优化的工作了,因为资源文件在 APK 中的占比最高,所以优先从资源瘦身开始着手。
开发目录下会有个 drawable 或者 mipmap 目录用于适配不同 dpi 的屏幕,下面是不同命名目录所适配的 dpi 范围 目前市面上绝大部分机型都处于 xxhdpi 的适配范围,所以可以考虑只保留 xxhdpi 目录下一份图片资源,具体保留哪个目录下的资源和保留几份资源还得依照应用自身的实际机型分布决定。
用 JPG 代替 PNG,由于 JPG 没有 Alpha 通道,所以文件更小,适用于不需要透明度的图片可以考虑。
由于 WebP 效果好,且相同效果下, WebP 文件比 PNG 文件要小得多 ,所以,网上很多人说使用 WebP 代替 PNG,对此,我保持异议。理由如下:
从下面这篇官方文档 可以看到 Android 平台支持的音视频格式,下面列出有损和无损常用的格式(不要认为有损编码就是音质很差):
实际开发中需要使用音频文件尽量采用 MP3、Ogg 这种有损格式,尽量不要用 WAV、PCM 这种无损音频。
这里的移除无用资源文件主要分为两个部分:不打包没有使用的资源和删除没有使用的资源。
即可看到所有未使用的资源文件,建议定期清理掉这些没用的文件,一方面可以减小工程的大小,另一方面太多的资源文件会导致打包后 resources.arsc 文件变得越来越大,公司有一项目 resources.arsc 文件已经达到 2-3 MB 的程度,有点惊人。 综合以上几点,就可以有效的精简我们安装包中的res文件夹、assets文件夹、resource.arsc文件大小,从而达到瘦身目的。 工具上一章节提到的是优化的思路,本章节整理在优化过程中使用到的工具。
以上是我优化过程中用到的觉得不错的工具,有更好的推荐,欢迎补充。 另外,在对图片做压缩的时候,不要贪图方便直接将整个资源目录下的图片一次性压缩一趟。很多时候,前面做这个项目的人可能已经对一些资源文件做过压缩处理,很容易导致二次压缩而引起一些图片失真。这里我建议是,去到应用的资源目录下将资源文件从大到小排序,定一个标准,如超过 20KB 的图片要做压缩处理,则将这些符合条件的图片 Copy 一份出来做压缩处理,处理后确保没出现失真的情况下再替换对应优化前的图片资源。 音频文件的处理,同理。 Native库瘦身Native 库瘦身主要是减小对 CPU 架构的支持,配置起来很简单,在 build.gradle 使用 abiFilters 配置需要用到的 CPU 架构,并将不需要兼容的 so 文件从项目中移除即可。 根据我们用户的机型分布,最终只保留了对 armeabi-v7a 支持。注意,这里需要根据自家产品的实际情况来决定。由于之前对 CPU 的架构分布不是很熟悉,感谢微信的张绍文、沪江的徐宜生以及虎牙的郑晓滨几位老司机给我科普了一发。 综上所述,就可以有效的精简我们安装包中的 lib 文件夹大小,从而达到瘦身目的。也有一种做法是通过在 build.gradle 配置 include 来针对每个 CPU 架构生成单独的安装包,虽然看起来很不错,但是很多国内应用市场上架的时候并不支持这种每个 CPU 配置一个包的做法,所以此做法较为鸡肋,不太建议去做,如果应用只上 Google Play ,那确实要比配置 abiFilters 好得多。 代码瘦身这里可以做的事情也是很多,主要如下:
综上所述,就可以有效的精简我们安装包中的 dex 文件大小,从而达到瘦身目的。 结束语整个优化过程我把项目从 18 MB 优化到了 12.5 MB,以上有些优化点受其他一些原因的影响,只能暂时作罢,可以考虑纳入下一次的优化排期。套路大概就是这么些,实践的时候请根据自身项目定夺,并优先优化性价比较高的部分(性价比=可优大小/所需时间)。 |
|