iOS包体积优化-图片压缩

2,949 阅读5分钟

前言

上一篇iOS包体积优化实战-无脑瘦身篇实践下来,确实优化效果显著,后来又删了一些无用代码和无用图片,到最后打出来的dev包大概240M左右。那接下来就是参考业界图片压缩方案了。本篇从实践角度来给大家做一下前车之鉴😂😂😂

一、分析图片占用大小

优化之前,肯定要先分析一下我们的包那么大,那到底图片占了多大,对吧?要是图片只占了一点点,那就算全删了也没优化多少。

解压ipa包,查看包内容,找到Assets.car,可以看到,确实很大。

但这里有一个奇怪的点,也是问了好多同学,也没有完全解答清楚。

可以看到,我们把Assets.car解压之后,其实文件大小总共就只有50Mb左右,为什么苹果经过处理之后,变成Assets.car的包变成了200Mb,接近4倍,

developer.apple.com/forums/thre… 有人似乎也有这种疑问,但Apple认为这是预期的行为。他们针对特定操作系统版本进行了优化。当最终应用程序被精简后,将仅显示必需的内容。简单来讲就是,App Store下载后,包应该是精简过的。

但我们的dev测试包没办法精简啊😳😳😳。。。尴尬

二、Assets文件夹分析

看一下我们解压后的Assets文件夹里面的文件,可以看到都是1x、2x图,3x图呢?我也不知道。。。应该跟我打得是dev包有关,猜想到appstore的话,应该会根据机型下发不同分辨率的图,这应该就是前面所说的,Assets帮我们做的事情。

分析过程中发现了一些问题,比如说jpg放在Asset里面,apple会帮我们转换成png,当jpg本身很大的时候,转出来的png会更大,之前美图的文章是说59k的jpg转出来就是185k的png了(但其实不是说跟大小有关,后续会用数据说明),其实png也一样,先看下图,同一张png图片,Assets之后,变大了好多好多。

但也有不会变大的,上图就显示没有变大。之前业界的结论是说,Assets里面最好不要放超过100kb的图,加载的时候会有缓存,不禁怀疑那难道图片过大,苹果的压缩算法还会导致图片变大?立马搜索看有没有大图没有变大的情况,被我找到了🤣🤣🤣。。。想来苹果的算法也不会那么菜啊,哈哈。

那就应该是跟图片本身有关了,但图片大小涉及到的因素有很多,我们又不是专门研究这个的,所以无从分析啊。那不管怎么说,我们还没尝试图片压缩方案呢,作为实践派,先试上一试。

三、ImageOptim压缩

ImageOptim是一款开源的图片压缩工具,压缩比例可以自己调,我用的无损压缩。

我先用ImageOptim压缩那张会变大的图片,确实效果不明显,但不会像苹果的压缩算法那样直接变大,所以两种做法应该还是有区别的,苹果不单单是做了压缩,应该还做了其他处理,主要是为了商店下载版本的包优化。

那接下来就是尝试全部压缩一遍,然后打包上传,可以看到最终结果还是很喜人的,节省了12.8MB。

当美滋滋开始打包,喝杯茶,准备深藏功与名的时候,现实给了我一记狠狠的闷棍。包的大小并没有改变,还是跟原来一样大小,我很痛苦但又不得不承认的验证了之前头条的结论。头条说自己用ImageOptim压缩后再用苹果的Assets,没有效果,很有可能反而会使包增大。

虽然美图的文章是持相反态度的,但基于什么原因,文章也没有详说。目前我验证下来的结果确实是,用ImageOptim压缩Assets是没有效果的。

那至于还有想压缩Assets的想法的话,大家可以把头条的那篇文章读完,人家本着no zuo no die的精神踩了很多坑,最终压缩这条路已经无路可走,最后从tint color这个角度入手,开始实施精简图片,可以想见,这个工程并不小,但确实是一个具体的优化方向。

当然还有一个方法是图片放云端,可以是自己的云端,也可以是苹果的云端,如果放在苹果的云端,我们只能TestFlight测试了,目前看下来有风险且不易测试,如果业务场景适合放云端的话,这也是一种优化策略。

四、总结

那目前实践下来,苹果对Assets压缩的过程做了自己独特的处理,想要人为的改变这一过程,是不被苹果允许的,有时候可能还会出现反效果,那我们能做的是什么呢?

  • 项目开发前,需要制定规则,图片大小尽量不能大于某一临界值,这样UI设计师也会保持敏感度
  • 项目开发过程中,开发人员也要对UI提供的切图大小保持敏感,怕麻烦的可以编写一个脚本,定一个临界值,当大于这个临界值的时候告警
  • 项目开发结束,肯定会出现一些无用图片资源,尽快删除
  • 当项目涉及到白天黑夜模式切换,尽量采用头条的方案,用改变tint color的方式实现切换效果
  • 方案设计之初,哪些图片可以放云端需要充分讨论,这比我们后期哼哧哼哧的去做优化可简单太多了(当然你们要是用这个做绩效,当我没说😂😂😂 )