沃梦达 / IT编程 / 移动开发 / 正文

怎样优化今日头条IOS安装包

这篇文章主要介绍了怎样优化今日头条IOS安装包,对IOS优化感兴趣的同学,可以参考下

前言

今日头条 iOS 端从 2016 年起就关注到了安装包大小的问题,并启动了包大小优化。2017 年,我们将当时的经验发表为技术文章 《干货|今日头条iOS端安装包大小优化—思路与实践》[1]。

如今三年过去了。今日头条在继续探索包大小优化时实践了更多思路,包括构建配置、图片压缩、__TEXT 段迁移、二进制段压缩等。这些优化项在业务入侵较少的前提下给今日头条带来了显著的包大小收益。同时,整个业界在包大小优化上也产出了更多方案。因此我们更新文章,期待与大家共同交流包大小优化这件事。


imageoptim -Q --no-imageoptim --imagealpha --number-of-colors 16 --quality 40-80 ./1.png

其中 --number-of-colors  控制颜色数组维护颜色的数量;--quality  控制图片的质量变为原来的百分比。我们的经验表明,当 --number-of-colors  从 16 开始向上调整,--quality 维持 40-80,能够在显著减少包大小的同时维持肉眼看不到的质量变化。经过 UI 同学的像素眼审查,确认优化前后的图片看起来无差别。

苹果给的参考数据是 4.5% 的包体积收益。

我们在评估了执行效率、堆栈解析、稳定性和编译速度后,对大部分源代码开启了 Oz 编译,包体积减小 4MB 以上。

3.2、使用链接时优化 LTO 

3.3、修正 Exported Symbols 配置


@interface presentViewController ()
@property (nonatomic,strong) UIImageView *imageView;
@property (nonatomic,strong) UIButton *button;
@property (nonatomic,strong) NSString *name;
@end

即一个属性占用的包大小大约为 224B。

如果我们用 @dynamic 修饰一个属性,不生成成员变量、get/set 方法,则一个属性可以由 224B 减少到 36B,即仅包含 property 部分的大小。

同时,代码中存在大量通过脚本自动生成的 JSONModel 子类,这些子类往往拥有大量属性。这里也就存在着包大小优化空间。

于是我们通过修改生成 JSONModel 子类的脚本,实现了:

1、属性全部使用 @dynamic 修饰,基础变量额外生成 IVAR

2、所有 JSONModel 的子类继承自新的父类,新的父类实现 resolveInstanceMethod,在该方法中用 class_addMethod 统一为属性添加 get/set 方法。对象类型的属性使用关联对象的方式存取,基础类型的属性使用额外生成的 IVAR 存取。

这一优化获得了 800KB 的包大小收益,并且评估对读写的性能影响损耗可以接受。

3.5、__TEXT 段迁移

安装包经过压缩后的 Download Size 若超过 200 MB,在蜂窝网络下载 App 就会受到限制,这对新增会有较大影响。在 2020 年下半年,我们探索实践了 __TEXT 段迁移技术:在链接阶段使用 -rename_p 选项将 __TEXT,__text 迁移到 __BD_TEXT,__text,减少苹果对可执行文件的加密范围,提升可执行文件的压缩效率,从而减少 Download Size。

使用该方案我们最终减少了 60 MB 的 Download Size 以及 2 MB 的 Install Size。详细的原理可以参考:《今日头条优化实践:iOS 包大小二进制优化,一行代码减少 60 MB 下载大小》[5]。

3.6、二进制段压缩

Mach-O 文件占据了 Install Size 中很大一部分比例,但并不是文件中的每个段/节在程序启动的第一时间都要被用到。可以在构建过程中将 Mach-O 文件中的这部分段/节压缩,然后只要在这些段被使用到之前将其解压到内存中,就能达到了减少包大小的效果,同时也能保证程序正常运行。由于苹果的一些限制,我们目前只压缩了 __TEXT,__gcc_except_tab__TEXT,__objc_methtype两个节,然后在 _dyld_register_func_for_add_image 的回调中对它进行解压。该方案累计优化了 3.5 MB Install Size。

四、总结

在以上优化项落地的同时,我们还与业务协作,通过挖掘无用代码、无用资源等手段,进一步优化着安装包大小。使得今日头条在高速的业务迭代下,包大小仍能保持稳定。

以上就是怎样优化今日头条IOS安装包的详细内容,更多关于今日头条IOS安装包大小优化的资料请关注编程学习网其它相关文章!

本文标题为:怎样优化今日头条IOS安装包