之前讲过的几种 apk 瘦身方法里,除了通过 proguard 进行混淆压缩比较常规外,其他都是些奇淫技巧,对 apk 进行压缩的大小有限,适合对 apk 大小进行极致优化的场景,并且如果对配置不熟悉,很容易出现各种错误。但其实瘦身最有效的办法之一,就是进行图片压缩。
1. 只配置同一种分辨率下的图片
一般现在我们只配置一种分辨率的图片,现在主流的有 xhdpi、xxhdpi、xxxhdpi,但我们没必要配置3套图片,否则图片资源的大小呈倍数增长。高分辨的图片在低分辨率手机上展示,效果一般没问题,但是低分辨率的图片在高分辨率手机上展示则很可能会出现模糊,结合目前市场上手机的普通情况,目前我们选择了 xxhdpi 这套分辨率的图。也可以只选择 xhdpi 分辨率上的图,效果一般也没问题,结合自己的时实际情况选择。
2. 采用 TinyPng 进行图片压缩
网站地址:https://tinypng.com/
所用的每一个图片,都通过 TinyPng 进行压缩处理,有的比较大的图片可以反复压缩,直到没有压缩空间为止。
3. 使用 xml 定义的 drawable 资源
不要所有的地方都采用 png 图片,特别是像一些类似圆角背景、渐变的颜色背景等,能通过 xml 来定义成 drawable 的,尽量都不要直接使用 png 图片,一个 xml 文件比一个 png 图片会小很多。
4. 使用 .9 png 图片
有些设计师对 Android 不是很熟悉,切图时总会按照效果图切一张大图出来。如果能够使用 .9 图的,尽量跟设计师沟通清楚,虽然制作 .9 图会稍微麻烦一点,但是你要想想,压缩再多代码量也比不了一张大图的大小。
5. 使用 webp 格式的图片
Android 4.3以上就已经全面支持 webp 格式的图片了,不需要自己再做额外的版本兼容了。Android Studio 已经提供了很方便的工具,可以直接将 png 图片转换成 webp 格式了,当然可能会有少许的图片清晰度损耗。一张 100kb 的 png 图片,转成 webp 格式化,大小可能只有几 kb 了,压缩效率惊人。
那是不是可以将所有的 png 图片转换为 webp 图片了,答案是否定的。有的 png 图片转换后,图片大小可能比原图还大,这显然是不行的;有些小的 icon,本身已经很小了,再去压缩降低了清晰度,大小减少得微乎其微,似乎也没这个必要了;有的 webp 图片还是有点兼容性问题,曾经碰到过在某些手机上 webp 图片会花掉的现象。所以我们的处理原则是:
- 小的 icon 图片大小比较小,为了高质量不会去压缩;
- 类似引导图这种,都是全屏大小的图片,全部转换为 webp 格式;
- 一些说明介绍性的 png 图片,如果大小超过 20kb,考虑转换为 webp 格式;
- 对于 20kb 以下的这些图片,优先采用 TinyPng 进行压缩优化;
总的来说,webp 能节省很大的空间,但它不是万能的,根据情况而定。
6. 合理使用网络图片
对于有些并不是高频使用的业务场景,这里面的图片可以考虑使用网络加载的方式。将这些图片存储到服务器,需要用到的时候再来加载或者是预加载好。
7. 小结
以上是我常用的一些方法,只要平时开发的时候,注意这些问题就可以实现了。此外,还有其他的方式,例如使用矢量图,但是矢量图的定义个人觉得有点麻烦,为了自己的开发效率就放弃掉了。图片压缩是减小 apk 大小的最有效方式之一,只有平时注意这个问题,后面想为 apk 瘦身的时候就好办多了。
系列文章
Android apk瘦身最佳实践(一):去除R.class
Android apk瘦身最佳实践(二):代码混淆和资源压缩
Android apk瘦身最佳实践(三):资源混淆原理
Android apk瘦身最佳实践(四):采用AndResGuard进行资源混淆
Android apk瘦身最佳实践(五):图片压缩
Android apk瘦身最佳实践(六):采用D8编译器