其他
百度APP iOS端包体积50M优化实践(一)总览
The following article is from 百度App技术 Author RichardYang
一、前言
二、背景
2.1 包大小优化的必要性
2.1.1 包体积每增加6M,应用下载转化率下降1%
2.1.2 App Store OTA下载大小限制,不利于APP的推广
iOS 13 以下的用户,无法通过蜂窝数据下载 APP; iOS 13 及以上的用户,需要手动设置才可以使用蜂窝网络下载 APP。
2.1.3 磁盘不足时删除首选
2.1.4 减少用户的下载意愿
2.1.5 其他负面影响
2.2 安装包生成过程
2.3 包体积指标
2.3.1 下载包大小和安装包大小
下载包大小是指APP压缩包(也就是 .ipa 文件)所占的空间,用户在下载APP时,下载的是压缩包,这样做可以节省流量; 当压缩包下载完成后,就会自动解压,解压过程也就是通常所说的安装过程,安装大小就是指压缩包解压后所占用的磁盘空间; 在Appstore产品信息页->信息->大小,看到数据是安装包大小,不是下载包大小,不同的系统安装包大小是不一样的;
那么苹果后台的下载大小和安装大小如何查看? 开发者在iTues-Connect后台可以看到不同平台的安装包大小和下载包大小,查看路径是App Store Connect->TestFlight->Build活动->选择版本->文件大小。
2.3.2 安装包体积作为衡量标准
对于iOS端来说通常将安装包体积作为衡量标准,这是基于以下两个原因,第一、安装包和下载包大小正相关,安装包体积减小后,下载包体积自然也会减小;第二、AppStore官方页面给出的是每个APP的安装包大小,APP使用者可非常直观地获取这个信息,但是要想获取下载包大小,必须具有开发者权限,这显然不可能。
三、IOS端安装包组成部分
GEEK TALK
四、国内外厂商APP体积分析
GEEK TALK
从APP包体积来看,QQ和微信包体积最大(500M+),处于第一梯队,百度和抖音居于第二梯队(380M+),快手(320M)处于第三梯队,美团、淘宝和头条包体积是在250M左右 ,是国内大厂中体积最小的,国外的主流APP如Facebook和YouTube在280M左右,包体积控制的还是比较节制的。 国外的APP大量使用动态库,Facebook自定义动态库有53个,主mach-o体积只有8.3M,代码主要在动态库,国内自定义动态库基本6个左右,像美团和百度基本没有自定义动态库; Swift的使用是大势所趋,国外大厂在用,国内大厂除了美团没有Swift动态库(暂没发现),其他厂都有,这与Apple的努力密不可分,2019年Apple发布了 Swift 5.0 版本,宣布了 ABI 稳定后,像手淘也拥抱了Swift; bundle和Asset使用对比,Asset是所有大厂APP主流,美团APP用bundle较广泛,bundle图片webP优化较多; 从图片的角度来比较,不论是bundle图片资源还是Assets图片资源,百度APP是其他APP的好几倍,冗余资源很多,这是我们的优化方向; SVG、iconfont的使用,国内大厂像QQ和淘宝,大量使用SVG矢量图和iconfont字体文件构建纯色图以此来降低图片体积,这也是百度APP需要推动优化的方向。
五、技术方案
GEEK TALK
5.1 资源优化
5.2 工程架构优化
5.3 图片优化
无用图片优化:基于开源工具二次开发,工具针对OC、swift、xib、html、js、css、json、plist文件扫描排查未引用的图片,然后针对如下字符串拼接的常见case二次过滤:暗黑模式(后缀_dark,_day,_night)、后缀是数字的图片序列(覆盖如下后缀_%d,_%ld,_%zd,_%lu); Asset Catalog图片优化:之前在bundle需要放二倍图和三倍图,同一张图片最后在用户手机上会有两份,iOS7系统有了Asset Catalog后,Asset Catalog为不同类型设备(分辨率不同)或者相同类型设备但不同配置(磁盘不同)提供定制化资源下载,当用户下载App时,只有跟用户手机硬件设备参数相匹配的资源才会被下载,其他不会下载,从而降低下载包体积; HEIC图片优化:更改PNG和JPEG图片编码格式,选择HEIC方案,基于以下优点:1、体积最小,HEIC比PNG体积减少50%,WebP比PNG优化30%;2、解码效率高,跟WebP相比,HEIC硬解码效率高,略慢于JPEG; WebP压缩优化:根据前面的结论有HEIC格式图片后,图片优化工作就已经结束了,其实不然,HEIC是iOS12以后推出来一种新格式,百度APP经过这么多年开发积累了许多老图片,对于带有Alpha通道的并经过压缩的PNG图片,转换为HEIC格式后,在iOS12和13系统存在兼容性问题,Alpha通道全变为0,为此对于这种case,尤其是大图,我们采用WebP压缩优化; TinyPng压缩:WebP 在 CPU 消耗和解码时间上会比 PNG 高两倍,因为对于大于100KB的图片我们使用 WebP,对于小于 100KB 图片,使用TinyPng进行压缩,虽然压缩率没有 WebP 那么高,但是没有改变图片编码方式,所以不会增加解析性能损耗。
5.4 编译器优化
5.5 代码优化
六、各项优化收益
GEEK TALK
七、总结
GEEK TALK
END