一、前语

百度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没有给出相似数据,可是依据相同道理,装置包巨细的削减必然会提高运用下载转化率。

百度APP iOS端包体积50M优化实践(一)总览

2.1.2 App Store OTA下载巨细限制,不利于APP的推广

下载包巨细超出 200 MB 时 ,会呈现两种情况:

  • iOS 13 以下的用户,无法通过蜂窝数据下载 APP;

  • iOS 13 及以上的用户,需求手动设置才能够运用蜂窝网络下载 APP。

百度APP iOS端包体积50M优化实践(一)总览
2.1.3 磁盘缺乏时删去首选

下载包体积太大,会占用更多的设备存储空间,关于低存储的设备的用户也会有一定的影响,或许成为磁盘不行时的首选。

2.1.4 削减用户的下载意愿

如果蜂窝数据选型默认是低数据形式,那么下载包巨细就更会影响用户决策,或许会削减用户的下载意愿。

2.1.5 其他负面影响

包体积太大,更多的的代码逻辑,加载的类太多,添加premain时刻,带来比较慢的发动速度,一起添加发动阶段SIGKILL发生的概率,让功能等根底体验变差。此外,过于杂乱冗余的代码还会添加代码修正的危险,所以包巨细不是一个孤立的目标,它从旁边面的反映出 APP 的健康状况。

2.2 装置包生成进程

在ipa包上传AppStore后,App Thinning会针对不同设备型号的硬件架构发生不同的编译产物,用户不同设备从AppStore会有不同的下载包,解紧缩装置后是最终的装置包。

百度APP iOS端包体积50M优化实践(一)总览

2.3 包体积目标

2.3.1 下载包巨细和装置包巨细

  • 下载包巨细是指APP紧缩包(也就是 .ipa 文件)所占的空间,用户在下载APP时,下载的是紧缩包,这样做能够节省流量;

  • 当紧缩包下载完成后,就会自动解压,解压进程也就是通常所说的装置进程,装置巨细就是指紧缩包解压后所占用的磁盘空间;

  • 在Appstore产品信息页->信息->巨细,看到数据是装置包巨细,不是下载包巨细,不同的体系装置包巨细是不相同的;

百度APP iOS端包体积50M优化实践(一)总览

  • 那么苹果后台的下载巨细和装置巨细怎么检查?

    开发者在iTues-Connect后台能够看到不同渠道的装置包巨细和下载包巨细,检查途径是App Store Connect->TestFlight->Build活动->挑选版本->文件巨细。

百度APP iOS端包体积50M优化实践(一)总览

2.3.2 装置包体积作为衡量标准

关于iOS端来说通常将装置包体积作为衡量标准,这是根据以下两个原因,榜首、装置包和下载包巨细正相关,装置包体积减小后,下载包体积天然也会减小;第二、AppStore官方页面给出的是每个APP的装置包巨细,APP运用者可十分直观地获取这个信息,**可是要想获取下载包巨细,必须具有开发者权限,**这显然不或许。

三、IOS端装置包组成部分

组成部分 阐明
Mach-O文件 iOS体系上的可执行文件
Watch APP中带有WatchApp
Widget组件 Widget通过在 iOS 主屏幕放置小组件,让用户能够随时访问 APP中的内容,Widget 能够坚持更新,然后让用户获得最新信息,当需求更多细节时,点击Widget 会直接带到 APP中的恰当位置
APP自定义动态库 APP中自定义的动态库, 动态库在运用编译打包的时分,仅把链接信息编译到运用二进制可执行文件中,将 framework 的加载推迟到运行时,因此,运用在提交评定时的代码段巨细核算,是不会将动态库的代码段核算核算在内,然后能够节省出一大截代码段巨细空间
swift体系库 swift体系库,低版本体系上无swift体系库,需iPA包中自带,12.2以上体系自带swift体系库
Assets资源 Assets.car文件,运用Assets.xcassets管理的图片资源会统一打包进入该文件
根目录下的图片资源 直接添加进工程的图片文件,如png、jpeg、svg、webp、AppIcon等图片资源
bundle资源 用bundle管理资源,里面能够是图片,也能够是其他的配置文件
其他配置文件 除Assets、bundle资源和根目录下的图片资源为外,其他配置文件,如plist、js、css、json、端智能模型文件等

四、国内外厂商APP体积剖析

百度APP iOS端包体积50M优化实践(一)总览

百度APP iOS端包体积50M优化实践(一)总览

咱们针对国内外干流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需求推进优化的方向。

五、技能计划

百度APP iOS端包体积50M优化实践(一)总览

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选用的计划如下所示:

百度APP iOS端包体积50M优化实践(一)总览

5.5 代码优化

代码优化相对而言ROI较低,由于影响范围较广,质量危险较高,优化进程中涉及到一切相关人员参与,无法会集处理。百度APP从无用类优化、无用办法减肥、无用模块减肥、精简重复代码、东西类减肥、AB试验固化等方向做了深度优化。

六、各项优化收益

各项主题优化收益如下所示,关于有的优化已经收益落地了,其他的还需求排期,按收益从大到小排序,工程方向优化-》编译器方向-》图片优化-》资源文件优化-》代码减肥。

百度APP iOS端包体积50M优化实践(一)总览

七、总结

本文主要介绍了iOS包体积优化必要性、下载包和装置包两个目标的差异、装置包组成部分和生成进程、国内外大厂APP包体积剖析,然后阐释了百度APP包体积优化的总体技能计划,最终介绍了百度APP详细实践的优化项及收益,后续咱们会针对每个优化类型详细介绍其原理与实现,敬请期待。

—— END——

参阅资料

[1]App Thinning详解:medium.com/bitmountn/a…

[2]App Thinning官方介绍:help.apple.com/xcode/mac/c…

[3]深化探究 iOS 包体积优化:/post/684490…

[4]抖音品质建造 – iOS 装置包巨细优化实践篇:maimai.cn/article/det…

[5]正经剖析iOS包巨细优化:mp.weixin.qq.com/s/_Mvl0FGri…

[6]XCode14介绍:developer.apple.com/documentati…

引荐阅读: 根据FFmpeg和Wasm的Web端视频截帧计划

百度研制效能从度量到数字化蜕变之路

百度内容了解推理服务FaaS实战——Punica体系

精准水位在流批一体数据仓库的探究和实践

视频编辑场景下的文字模版技能计划

浅谈活动场景下的图算法在反作弊运用