瘦身意味了什么呢?人们瘦身味了更好的身体和更匀称的身材。那么app呢?提高下载转化率,用户在无wifi情况下少用流量!据调查:一个应用大小是 20MB ,有很多个潜在用户想要去下载尝试使用,结果有一半的用户嫌弃流量太耗费钱了,太大直接看都不看河在等待下载的过程中就取消下载,用户流失性太大,那么应用的下载转化率就是最多60%。
人精装了,总比臃肿看起来要好得多!那么app的安装包越小,用户下载等待的时间越短,对手机存储配置小的设备体验愈佳,应用的下载转化率也就越高。
要对安装包做瘦身,首先需要了解安装包的组成结构(就像是减肥阶段知道了解自己身体各个状况一样)。
其中,在安装包中占比较大的包括:dex文件、res文件夹、assets文件夹、lib文件夹以及resource.arsc文件。所以,接下来的瘦身优化就是让这些文件变小,以此达到瘦身的目的。
在 Android Studio 2.2.3 开始,就加入了浏览 APK 结构的功能,我们直接把安装包拖入 IDE ,就可以直接浏览其组成和对应大小,这样能够很方便的对比分析出每一步优化后的结果。资源瘦身
了解完 APK 的组成,我们可以开始着手优化的工作了,因为资源文件在 APK 中的占比最高,所以优先从资源瘦身开始着手。
.9 PNG 代替 PNG
一些情况下,我们可以考虑使用 Drawable XML 来代替 PNG,如:渐变的背景图,用几行 XML 就可以描绘出来,何必使用几十到上百K的 PNG 文件;
用 Color 代替 PNG,如:纯色的背景;
从性能上看(推荐大家可以用用flowup),比起使用图片资源需要先将其生成 Bitmap 再传到底层交由 GPU 渲染,用 Drawable XML 和 Color 则更加高效,它是直接将 Shape 信息传到底层由 GPU 进行渲染,CPU 和 内存的占用会更少;
用 .9 PNG 代替 PNG,场景很多,不举例了;
使用 JPG 代替 PNG
用 JPG 代替 PNG,由于 JPG 没有 Alpha 通道,所以文件更小,适用于不需要透明度的图片可以考虑。
谨慎使用 WebP 代替 PNG(需要透明度体现的话最还不要用webp,失真)
由于 WebP 效果好,且相同效果下, WebP 文件比 PNG 文件要小得多 ,所以,网上很多人说使用 WebP 代替 PNG,对此,我保持异议。理由如下:
WebP 在 Android 端,最低只支持 4.0 ,要兼容 4.0 以下的环境需要额外引入兼容库,反而增大安装包体积;
Android Studio 不支持预览 WebP 图片,引用 WebP 的布局文件也无法预览显示;
解压了 BAT 们的应用,以及同类竞品,基本没有发现在资源文件中用 WebP 的;
有损编码格式的音频文件代替无损格式的音频文件
从下面这篇官方文档
https://developer.android.com/guide/topics/media/media-formats.html
可以看到 Android 平台支持的音视频格式,下面列出有损和无损常用的格式(不要认为有损编码就是音质很差):
无损格式:WAV,PCM,ALS等
有损格式:MP3,AAC,WMA,Ogg Vorbis
实际开发中需要使用音频文件尽量采用 MP3、Ogg 这种有损格式,尽量不要用 WAV、PCM 这种无损音频。
移除无用的资源
这里的移除无用资源文件主要分为两个部分:不打包没有使用的资源和删除没有使用的资源。
不打包没有使用的资源,在项目的 build.gradle 中配置 shrinkResources true 即可。删除没有使用的资源,通过 Android Studio 选中项目右键 => Analyze => Run Inspection by Name => 输入 Unused Resuroces
即可看到所有未使用的资源文件,建议定期清理掉这些没用的文件,一方面可以减小工程的大小,另一方面太多的资源文件会导致打包后 resources.asc 文件变得越来越大。
综合以上几点,就可以有效的精简我们安装包中的res文件夹、assets文件夹、resource.arsc文件大小,从而达到瘦身目的。
工具
TinyPNG:https://tinypng.com/,支持对 PNG/JPEG 文件做压缩处理,效果不错。
mozjpeg:https://imageoptim.com/mozjpeg, 用于 PNG 转 JPEG、JPEG 压缩,效果很好。
Adobe Audition CC:http://www.adobe.com/cn/products/audition.html,Adobe 出品,支持对音频的采样率,分辨率和声道数目做更改,以此达到裁剪音频的目的(采样率,分辨率和声道数目是音频文件格式的关键参数,决定着音频文件的大小)。
以上是我优化过程中用到的觉得不错的工具,有更好的推荐,欢迎补充。
Native瘦身
Native 库瘦身主要是减小对 CPU 架构的支持,配置起来很简单,在 build.gradle 使用 abiFilters 配置需要用到的 CPU 架构,并将不需要兼容的 so 文件从项目中移除即可。过滤一些abifile,根据我们用户的机型分布,最终只保留了对 armeabi-v7a 支持。注意,这里需要根据自家产品的实际情况来决定。
综上,就可以有效的精简我们安装包中的 lib 文件夹大小,从而达到瘦身目的。也有一种做法是通过在 build.gradle 配置 include 来针对每个 CPU 架构生成单独的安装包,虽然看起来很不错,但是很多国内应用市场上架的时候并不支持这种每个 CPU 配置一个包的做法,所以此做法较为鸡肋,不太建议去做,如果应用只上 Google Play ,那确实要比配置 abiFilters 好得多。
代码(dex)瘦身
主要如下:
移除废弃功能的代码,反正有 git ,删了随时可以找回;
移除重复代码,如:已经有了的功能代码,团队成员不知道自己又写了一套,只能靠代码 Review 解决了;
移除功能重叠的框架,如:项目中有几套网络访问框架AsyncHttpClient、Retrofit 等,同样只能靠代码 Review 解决;
移除无用的 dependencies 或者 jar 包;
减小对 Support 兼容包的依赖,Support-V4 包非常大,项目引入无疑会增大 dex 文件的大小,Google 已经意识到这个问题,所以 Support-V7 一开始就做了拆分,并且开始对 Support-V4 做拆分,虽然目前成果还不明显,不过还是蛮值得期待的,特别是发现你少了 Support-V4 包后,可能就从2个 dex 变成1个 dex 了呢;
插件化(最近在用small的框架,还很不错!),一种懒加载思想的体现,先让用户能够安装宿主包,对于一些功能模块做插件化,在特定的时机再下载安装;
精简我们安装包中的 dex 文件大小,从而达到瘦身目的。
需要用到的工具
Android Studio→Inspect Code...
统计APK文件中class、method、field、string数量
值得阅读的文章