一、前言
百度 APP 作为日活过亿的国民级利用,通过这些年的倒退,从最后的搜寻,倒退到当初蕴含搜寻、Feed、视频、直播、小说、购物、小程序、网盘和泛滥垂类模块的超级利用,为服务更多用户满足更多用户需要一直迭代,利用像滚雪球一样越滚越大,包体积从最后的几十 MB 倒退到最高时的 420MB,每个版本天然迭代会有至多 3MB 的涨幅,过大的包体积带来的负面作用开始浮现,400M 的体积对下载转化率和卸载率提出了很大的挑战,因而包体积成为百度超级 APP 倒退的拦路虎。
22 年 Q3 开启包体积优化我的项目,从编译器优化 (OC&Swift&C++ 优化、LTO 优化、剥离调试符号、三方 SDK 优化)、图片优化(无用图片、HEIC 图片优化、Asset Catalog 图片优化、图片压缩)、资源瘦身(大资源优化、无用配置文件、反复资源)、代码瘦身(无用类、无用办法、无用模块、精简反复代码、工具类瘦身、AB 试验固化) 和工程架构 (Xcode 打包、防劣化) 等方向做优化。
在满足失常业务迭代状况下,优化落地收益 50M,百度 APP 包体积从七月初的 395M 降落到十二月末的 352M,同一时间段内,国内大厂支流 APP 中,微信从 502M 上涨到 530M,抖音从 390M 上涨到 432M,快手从 310M 上涨到 357M。在很少的人力投入下取的这个成绩,效率十分显著,此外,咱们积淀了各个优化方向的基建工具,欠缺了防劣化机制,为包体积继续优化和避免无序增长打下来松软的根底。
二、背景
2.1 包大小优化的必要性
2.1.1 包体积每减少 6M,利用下载转化率降落 1%
依据 Google Play 的统计:包体积每减少 6M,利用下载转化率降落 1%,APK 包体大小每缩小 10MB,寰球均匀下载转化率会晋升 1.75%,不同市场的数据各有不同,具体请参考如下图表。尽管 AppStore 没有给出相似数据,然而依据同样情理,安装包大小的缩小必然会晋升利用下载转化率。
2.1.2 App Store OTA 下载大小限度,不利于 APP 的推广
下载包大小超出 200 MB 时,会呈现两种状况:
- iOS 13 以下的用户,无奈通过蜂窝数据下载 APP;
- iOS 13 及以上的用户,须要手动设置才能够应用蜂窝网络下载 APP。
2.1.3 磁盘有余时删除首选
下载包体积太大,会占用更多的设施存储空间,对于低存储的设施的用户也会有肯定的影响,可能成为磁盘不够时的首选。
2.1.4 缩小用户的下载志愿
如果蜂窝数据选型默认是低数据模式,那么下载包大小就更会影响用户决策,可能会缩小用户的下载志愿。
2.1.5 其余负面影响
包体积太大,更多的的代码逻辑,加载的类太多,减少 premain 工夫,带来比较慢的启动速度,同时减少启动阶段 SIGKILL 产生的概率,让性能等根底体验变差。此外,过于简单冗余的代码还会减少代码批改的危险,所以包大小不是一个孤立的指标,它从侧面的反映出 APP 的衰弱状态。
2.2 安装包生成过程
在 ipa 包上传 AppStore 后,App Thinning 会针对不同设施型号的硬件架构产生不同的编译产物,用户不同设施从 AppStore 会有不同的下载包,解压缩装置后是最初的安装包。
2.3 包体积指标
2.3.1 下载包大小和安装包大小
- 下载包大小是指 APP 压缩包 (也就是 .ipa 文件) 所占的空间,用户在下载 APP 时,下载的是压缩包,这样做能够节俭流量;
- 当压缩包下载实现后,就会主动解压,解压过程也就是通常所说的装置过程,装置大小就是指压缩包解压后所占用的磁盘空间;
- 在 Appstore 产品信息页 -> 信息 -> 大小,看到数据是安装包大小,不是下载包大小,不同的零碎安装包大小是不一样的;
-
那么苹果后盾的下载大小和装置大小如何查看?
开发者在 iTues-Connect 后盾能够看到不同平台的安装包大小和下载包大小,查看门路是 App Store Connect->TestFlight->Build 流动 -> 抉择版本 -> 文件大小。
2.3.2 安装包体积作为衡量标准
对于 iOS 端来说通常将安装包体积作为衡量标准,这是基于以下两个起因,第一、安装包和下载包大小正相干,安装包体积减小后,下载包体积天然也会减小;第二、AppStore 官网页面给出的是每个 APP 的安装包大小,APP 使用者可十分直观地获取这个信息,然而要想获取下载包大小,必须具备开发者权限,这显然不可能。
三、IOS 端安装包组成部分
四、国内外厂商 APP 体积剖析
咱们针对国内外支流 APP 的安装包做一个简略剖析,重点统计了 IPA 包次要组成部分,如 Mach- O 文件、bundle 图片资源和 Assets 图片资源,原始文件起源是 22 年 9 月份 AppStore 商店安装包,通过剖析有如下结论:
- 从 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 须要推动优化的方向。
五、技术计划
5.1 资源优化
百度 APP 有 30M 的资源,这儿资源是指 plist、js、css、json、端智能模型文件等,因这些文件的优化形式跟图片优化差别很大,所以把两者辨别开来。内置的大块资源 (单个文件大于 80K) 就有 16M,所以具备很大的优化空间,资源优化分为三个局部,别离是大资源优化、无用配置文件和反复资源优化。
5.2 工程架构优化
其余优化伎俩解决的是存量问题,良好的防劣化机制解决的是增量问题,以防止包体积无序增长,百度 APP 联合 Linkmap 和 Mach- O 文件搭建了体积检测流水线,对每个版本每个库的包体积劣化问题做了开掘,联合配额和卡口制度,管制体积增长在正当范畴内。
此外,苹果公司为进一步提高开发者的生产效率,于 22 年 10 月份公布了 Xcode14,新版本编译器具备全新的加强性能,更弱小的并行编译能力,可显著晋升我的项目构建速度,其中,XCode14 的降级对包体积带来比拟显著的优化,官网给出数据是应用程序下载包体积减小了 30%,百度 APP 实际过程中有 26M 的收益,体积缩小了 6.5%。
5.3 图片优化
解压 IPA 包后发现,asset 和 bundle 外面图片有 94M, 这是咱们重点优化的对象,百度 APP 采纳如下形式对不同的图片资源进行了优化。
- 无用图片优化:基于开源工具二次开发,工具针对 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 编译器优化
编译器是包体积优化方向中性价比最高的,LLVM 给咱们提供了大量的编译选项,对于 OC、C、C++、Swift、资源压缩和符号表都有大量优化抉择,百度 APP 采纳的计划如下所示:
5.5 代码优化
代码优化相对而言 ROI 较低,因为影响范畴较广,品质危险较高,优化过程中波及到所有相干人员参加,无奈集中处理。百度 APP 从无用类优化、无用办法瘦身、无用模块瘦身、精简反复代码、工具类瘦身、AB 试验固化等方向做了深度优化。
六、各项优化收益
各项主题优化收益如下所示,对于有的优化曾经收益落地了,其余的还须要排期,按收益从大到小排序,工程方向优化 -》编译器方向 -》图片优化 -》资源文件优化 -》代码瘦身。
七、总结
本文次要介绍了 iOS 包体积优化必要性、下载包和安装包两个指标的区别、安装包组成部分和生成过程、国内外大厂 APP 包体积剖析,而后阐释了百度 APP 包体积优化的总体技术计划,最初介绍了百度 APP 具体实际的优化项及收益,后续咱们会针对每个优化类型具体介绍其原理与实现,敬请期待。
—— END ——
参考资料:
[1]App Thinning 详解:https://medium.com/bitmountn/app-thinning-reduces-ios-app-siz…
[2]App Thinning 官网介绍:https://help.apple.com/xcode/mac/current/#/devbbdc5ce4f
[3]深刻摸索 iOS 包体积优化:https://juejin.cn/post/6844904169938092045
[4]抖音品质建设 – iOS 安装包大小优化实际篇:https://maimai.cn/article/detail?fid=1579866761&efid=3TGrvi9W…
[5]正经剖析 iOS 包大小优化:https://mp.weixin.qq.com/s/\_Mvl0FGriKsvAyRheU2Z7w
[6]XCode14 介绍:https://developer.apple.com/documentation/xcode-release-notes…
举荐浏览:
基于 FFmpeg 和 Wasm 的 Web 端视频截帧计划
百度研发效力从度量到数字化变质之路
百度内容了解推理服务 FaaS 实战——Punica 零碎
精准水位在流批一体数据仓库的摸索和实际
视频编辑场景下的文字模版技术计划
浅谈流动场景下的图算法在反作弊利用