我对公司 APK 做了个瘦身

hello, 大家好,鸡年第一篇blog, 因为节后到现在一直比较忙,上班忙工作,下班忙上分,王者农药,喝了就停不下来…

####开篇语
最近接到老大一个任务:为我们的应用做瘦身.我们电商类项目到现在维护到2.7.0 APK 已经有35M了,说实话已经很大了.通过这两天的努力把安装包从35M瘦身到了23.8M.这其实还不是极限,由于一些原因的限制目前就到23.8M 为止.做个记录,方便以后 review 也为大家提供参考.

####安装包的组成
不废话直接上图:

来看看我们 APK 结构分布:
在 Android Studio 2.2.3 开始,就加入了浏览 APK 结构的功能,我们直接把安装包拖入 IDE ,就可以直接浏览其组成和对应大小,这样能够很方便的对比分析出每一步优化后的结果。


如图, 资源文件和 lib 在 APK 中比例最高,所以重点拿这两个地方开刀.

####第一刀: 资源文件的处理
因为公司的产品比较稳定,所以一些产品图我们保存在了 res 本地中,所以导致了 res 文件过大.其实最好的解决方法,当然是将比较大的产品图放在后台服务器,由于公司后台人员最近比较忙,而且对后台来说这个工程还是蛮大的,所以自己动手,丰衣足食咯…
我们项目中的所有图片都是 png 格式的,这点比较好了,关于图片处理,我首先想到的就是压缩了.虽然 png 和其他格式图片比,本身就比较轻量了,但是还是有很大压缩空间的,因为产品图,在我们项目中只是个缩略图,不需要高保真.
找到了几个压缩工具:

  • ImageOptim:https://imageoptim.com/mac ,支持压缩 PNG/JPEG/GIF ,而且效果显著,我用的就是这个工具.可以看看这里 https://www.diycode.cc/topics/496 ,遗憾的是它只支持 Mac ,Windows 党很难过。
  • TinyPNG:https://tinypng.com/ ,支持对 PNG/JPEG 文件做压缩处理,效果不错。
  • pngquant:https://pngquant.org/ , 支持 PNG 压缩,有时候 TinyPNG 处理过的图片噪点会稍多,可以考虑用 pngquant 来处理。
    来看下效果:

    由于一些变量控制没做到位,所以效果显示稍差,实际 APK 大概减小2M
    ####第二刀: lib 处理
    lib 中主要是一些第三方 sdk 中的 so 文件,Native 库瘦身主要是减小对 CPU 架构的支持.关于 CPU 架构支持,不了解的,传送门附上:https://zhuanlan.zhihu.com/p/23102158
    出于好奇,分析了下微信的 APK 发现他的 lib 下只有 armeabi ,看过上篇文章就明白了.
    来看下我们的 APK 吧:

    看到这个,瞬间来了精神,知道这块瘦身空间有多大了吧.
    根据我们用户的机型分布,最终只保留了对 armeabi-v7a 支持.注意,这里需要根据自家产品的实际情况来决定。
    配置起来很简单,在 build.gradle 使用 abiFilters 配置需要用到的 CPU 架构,并将不需要兼容的 so 文件从项目中移除即可。

####看一下成果: