今日头条 ios 安装包大小优化在哪,今日头条的安装包到底在哪里

简介今日头条iOS从2023年开始关注安装包大小问题,并开始优化安装包大小。 2023年,我将自己的经验发表为技术文章|今日头条iOS安装包大小优化-思路与实践[1]。从那时起已经过去了三年。在不断探索包大小优化的过程中,今日头条实现了更多的想法,包括构建配置、图像压缩、__TEXT 段迁移和二进制段压缩。这些优化在减少对业务侵入的前提下,让今日头条的包大小得到了大幅提升。与此同时,整个行业也创造了更多优化封装尺寸的解决方案。因此,我们期待更新文章并与您就包大小优化进行交流。

表:今日头条实施的优化项目及效益一览表

1.配置安装包通过构建得到App Sliced ipa文件后,进入.app文件即可解压。 内容。

安装包通常包含两部分:资源和iOS 上的可执行Mach-O 文件。资源可分为Assets.car 文件、Asset Catalog 产品和其他资源。 Assets.car 和Mach-O 文件是我们最注重优化的领域。

1.1. Assets.car 文件Assets.car 文件是项目资产目录的产物。 Xcode工具链中的actool负责构建Assets.car。在构建Assets.car的过程中,actool选择一种编码算法,并根据特定策略对PNG图像进行重新编码。

照片:资产目录

1.2. Mach-O 文件Mach-O 文件是通过编译和静态链接代码源文件获得的。应用程序切片后的Mach-O 文件通常只包含一种模式。 MachOView 等工具可让您可视化Mach-O 中的内容。

同时,链接映射文件对于分析Mach-O文件的结构也很有用。

如果您在构建设置中打开LD_GENERATE_MAP_FILE 开关,则在构建应用程序时会生成一个名为Link Map 的txt 文件,允许您查看Mach-O 中每个段、每个部分和每个功能的分布和大小。此信息通常用于数据包大小优化。

2. 资源大小优化最常见的包大小优化解决方案是“资源压缩”,但实际操作起来需要技巧。今日头条在资源优化方面做了很多尝试。

2.1. 使用适当的资源压缩设置。今日头条目前支持的最低iOS系统版本是iOS 9。然而,大多数Pod库的Podspec文件中指定的deployment_target(最低支持版本)仍然是iOS 8。这意味着在构建Assets.car时,这些Pod库中指定的resource_bundles将是iOS。是支持的最低版本。

通过我们的实验,我们发现了以下几点:

1.将pod库和主项目的最低支持版本从iOS 8.0增加到iOS 9.0。

2. 在pod 库和主项目的Xcode 构建设置中打开ASSETCATALOG_COMPILER_OPTIMIZATION 空间选项。

这两个设置更改了atool 在构建Assets.car 时选择的编码和压缩算法,从而减小了包大小。您可以使用xcrunassetutil –info Assets.car 命令查看Assets.car 中每个图像使用的编码和压缩算法。在今天的头条新闻环境中,结果是:

由于Assets.car中PNG图片的编码和压缩算法发生变化,头条启动时这两种配置的包大小增加了2.31 MB。

2.2. 在调色板中压缩RGB 图像早些时候,当今日头条投资优化包大小时,我们尝试对资产目录中的PNG 图片进行无损压缩,但我们发现图像大小是一个问题。尽管资产目录中的大小已显着减小,但构建的产品的大小基本保持不变。

经过调查,在Xcode中,构建资产目录的工具actool首先对资产目录中的png图像进行解码以获得位图数据,然后使用actool的编码/压缩算法对其进行编码和压缩,我发现了该怎么做。无损压缩通过转换图像编码和压缩算法来减小大小,但保持位图数据不变。对于actool来说,无损压缩无法优化Assets.car的大小,因为它接收到的输入是不变的。

还有其他压缩方法可以优化Assets.car 的大小吗?我认为这是正确有损压缩图像的一个想法。

所以我尝试使用调色板编码方法[2]的RGB。使用调色板由RGB 编码的结果字节流最初维护一个颜色数组。颜色数组的每个成员都使用四个RGBA 分量来维护颜色。图像中的每个像素都存储表示该点颜色的颜色数组索引。颜色数组保存的颜色类型和数量由图像决定,但在任何给定时间,颜色数组最多限制为256 种颜色。顾名思义,这种编码方式就是调色板。

应用程序中的大多数图像都使用多种颜色,但这些颜色大多数都非常接近并且难以在视觉上区分,例如在许多平面样式图标中。这种类型的图像非常适合有损压缩,它使用调色板编码来减小颜色数组的大小。除了减少颜色数量以实现有损压缩外,还可以保证保留的颜色更接近原始图像。它还执行有损压缩,因此看起来质量完好无损。登陆今日头条,包大小增加3.15MB。

在我们的具体实现中,我们使用ImageOptim 工具通过调色板将图像编码方法更改为RGB。

imageoptim-Q–no-imageoptim–imagealpha–number-of-colors16–quality40-80./1.png 其中,–number-of-colors 指定颜色数组控件中维护的颜色数量。 – 质量控制图像中的颜色数量。质量将是原始值的百分比。我们的经验是,将颜色数量从16 向上调整可将质量保持在40 到80 之间,从而减小数据包大小,同时显着减少不可见的质量变化。 UI同学的像素眼评测证实,优化前后的照片看起来是一样的。

2.3. 合并资产.car。今日头条使用CocoaPods进行组件集成。各个组件提供的资产目录文件在Podspec中以resource_bundles的形式引入,最终以Assets.car文件的形式体现在安装包中。它在捆绑包下面。

以7.9.4版本为例,安装包有106个bundle,其中包括Assets.car文件。

Assets.car 文件本质上是一个BOM 文件。同时,Xcode在使用actool构建Assets.car文件时,还会进行一些优化操作,比如自动将一些小图片合并到打包的图片中。因此,合并多个Assets.car可以减少重复的BOM块,最大限度地发挥actool的优化效果。

在构建过程中,今日头条在构建阶段添加了一个脚本,用于将多个库中资产目录中的图像合并到一个资产目录中,并通过actool将其合并到Assets.car产品中。此优化使数据包大小增加了2.1MB。同时,从理论分析,这种优化还减少了Assets.car在运行时的解析操作,这对图像读取响应时间带来了积极的好处。

2.4. 压缩文本文件今日头条安装包中除了大部分图片资源外,还包含很多文本文件资源,如JSON文件、HTML文件等。压缩这些文本文件还可以提供数据包大小优化的好处。

今日头条实现的文本文件压缩方案由三部分组成:

1.压缩阶段:在构建阶段添加脚本,用于在构建阶段压缩白名单中的文本文件。

2. 解压阶段:在应用启动阶段,解压操作在异步线程中执行,解压结果保存在沙箱中。

3.读取阶段:当应用程序运行时,钩子读取这些文件并将读取路径从bundle更改为沙箱中的相应路径。

该方案可以在最少的业务干预下完成压缩优化。当我第一次将此解决方案应用于Lottie 动画JSON 文件时,包大小增加了400 KB。未来,该解决方案可能会进一步扩展并应用于更多文件类型。

3、优化Mach-O文件在优化资源的同时,我也注意到Mach-O文件总是占据头条安装包体积的80%左右。优化Mach-O 文件至关重要。下面按时间顺序介绍我们实现的Mach-O文件优化项目。

3.1. 使用-Oz 编译参数。 Oz 是Xcode 11 中的新编译优化选项。 Oz 在WWDC 2023 上亮相《What\’s New in Clang and LLVM》 [3]。 Oz的核心原理是重复利用组织成函数的顺序机器指令,这与“内联函数”原理恰恰相反。因此,开启Oz可以减少二进制大小,但同时理论上会消耗更多的执行效率。应评估与性能(CPU)相关的代码使用情况。

苹果提供的参考数据是包裹数量增加了4.5%。

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

3.2. 使用链接时优化LTOLink 时优化是Xcode 附带的编译/链接参数。根据WWDC 2023 《What\’s New in LLVM》 [4],LTO 对数据包大小和运行效率具有积极影响。今日头条启用增量LTO编译和链接后,包大小减少了6.5MB。

3.3. 修改导出符号配置的Xcode构建设置中的EXPORTED_SYMBOLS_FILE配置,该配置控制Mach-O __LINKEDIT部分中的导出信息信息。动态链接器dyld在进行符号绑定时,会读取所绑定的动态库或可执行文件的导出信息信息,以获取该符号对应的实际调用地址。如果绑定的符号不在目标动态库的导出信息中,dyld 会抛出异常并且应用程序崩溃。

作为一般规则,需要出口信息。然而,对于Mach-O 文件,并非所有符号都需要暴露给其他动态库或可执行文件。理想情况下,私有符号应该使用__attribute__((visibility(hidden))) 进行编码。但是,如果您发现很难将修饰符一一添加到历史代码中,导出的符号配置使您有机会在项目中维护公共符号的白名单。如果输入有效的EXPORTED_SYMBOLS_FILE 配置,动态库或可执行文件将在静态链接期间删除非白名单符号。这可以减小封装尺寸并增加逆向工程难度。

使用导出的符号配置后,今日头条的包大小减少了2.1 MB。

3.4. 动态属性属性是OC 中最常见的概念之一。然而,属性并不像我们想象的那么小。分析Mach-O文件后,我们发现属性可以分为三部分。

(1)成员变量部分:成员变量基本上是一个大小为32B的结构体,结构体内部三个指针(Offset、Name、Type)所指向内容的大小分别为8B、10B、10B , 分别。 Name和Type指针所指向的内容的大小与成员变量的类型和名称的长度有关。总大小约为60B。

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

(2)自动生成的set/get方法部分:set/get方法基本上是一个大小为24B的结构体,该结构体包含三个指针:Name、Type、Implementation,内容大约为10B、10B、10B。 20B。一个方法的大小约为64B,set和get方法的大小为128B。

(3)属性部分:属性的本质仍然是一个大小为16B的struct。结构体中两个指针指向的内容大小分别约为10B和10B,与属性的名称和类型有关。财产。总大小约为36B。

换句话说,一个属性的数据包大小约为224B。

如果使用@dynamic更改属性并且不生成成员变量或get/set方法,则属性可以从224B减少到36B(仅属性部分的大小)。

同时,你的代码中还有很多通过脚本自动生成的JSONModel子类,而这些子类往往包含大量的属性。这里还有优化数据包大小的空间。

我通过修改生成JSONModel 子类的脚本来完成此任务。

1. 所有属性均通过@dynamic 进行更改,基本变量生成额外的IVAR。

2.所有JSONModel子类都继承自一个实现resolveInstanceMethod的新父类。该方法使用class_addMethod为属性统一添加get/set方法。使用关联对象来访问对象类型的属性,使用另外生成的IVAR 来访问基本类型的属性。

此优化将数据包大小增加了800 KB,并且对读取和写入的性能影响评估为可接受。

3.5. __TEXT 段迁移如果安装包的压缩下载大小超过200 MB,则蜂窝网络上的应用下载将受到限制,新添加将受到显着影响。 2023年底,我们探索并实践了__TEXT段迁移技术。在链接阶段使用-rename_section 选项将__TEXT,__text 迁移到__BD_TEXT,__text,减少了Apple 可执行文件的加密范围并提高了可执行文件的安全性。压缩效率降低了下载大小。

使用此解决方案,最终下载大小减少了60 MB,安装大小减少了2 MB。详细原理请参见今日头条优化实践:iOS包大小的二进制优化[5]。

3.6. 二进制段压缩Mach-O 文件占安装大小的很大一部分,但并非文件中的所有段/部分在程序第一次启动时都被使用。 Mach-O 文件的这一部分可以在构建过程中进行压缩,如果在使用之前将这些部分解压缩到内存中,则可以起到减小包大小的作用,同时仍保持程序的正常运行。由于Apple的一些限制,我们目前在_dyld_register_func_for_add_image回调中仅压缩和解压缩两个部分:__TEXT,__gcc_Except_tab和__TEXT,__objc_methtype。该解决方案将累积安装大小优化为3.5 MB。

4.总结在实现上述优化的同时,我们还与企业合作,通过挖掘浪费的代码和浪费的资源,进一步优化其安装包的大小。这使得今日头条即使在业务快速迭代的情况下也能保持稳定的包大小。

5.参与在实践包大小优化的过程中,我们了解到优化不仅需要冷静和技术研究,还需要与我所理解的所有利益相关者合作。今日头条平台架构作为iOS团队,我们持续在性能优化、基础组件、业务架构、研发系统、安全合规、线下质量基础设施、线上问题识别与归因平台等方面持续努力并负责保障和改进。系统。今日头条的产品质量和开发效率以今日头条为核心,并向外延伸。

如果您对技术充满热情,热爱追求卓越,并热衷于使用自己的代码来改变数亿用户的体验,我们希望您加入我们。我们期待您与我们一起成长。目前我们正在北京和深圳招聘。请将简历发送至tech@bytedance.com。

;邮件标题:姓名- 工作经验- 今日头条- 平台架构- iOS/Android。

参考文献[1]更多今日头条iOS安装包大小优化思路与实践|

[2] 调色板图像

http://www.manifold.net/doc/mfd9/palette_images.htm

[3] WWDC 2023 Clang 和LLVM 的新特性

https://developer.apple.com/videos/play/wwdc2023/409/

[4] WWDC 2023 LLVM新特性

https://developer.apple.com/videos/play/wwdc2023/405/

[5]今日头条优化实践:iOS包大小二进制优化欢迎关注“字节跳动技术团队”

简历投递联系邮箱:tech@bytedance.com

本文和图片来自网络,不代表火豚游戏立场,如若侵权请联系我们删除:https://www.huotun.com/game/674895.html

(0)
上一篇 2024年6月4日
下一篇 2024年6月4日

相关推荐

  • 和平精英身法必备的枪?

    和平精英身法必备的枪? 是步枪。步枪是一种全能性枪械,具有中远距离射击、连发和单发射击等多种功能,可以应对多种情况,而且精准度高,不易误伤队友。在和平精英游戏中,体现身法的关键就是要快速切换姿势,而步枪可以快速切换姿势并进行精准射击,因此是必备的。除了步枪外,一些玩家可能会选择短枪或冲锋枪等快速射击的武器来体现身法。但是这些武器的精准度和射程都相对较低,容易…

    游戏快讯 41分钟前
  • 和平精英的牌子怎么获得?

    和平精英的牌子怎么获得? 方法/步骤: 1. 打开和平精英,登录好账号;进入到主页后,点击右下角的直播图标 2. 进入到直播页面之后,切换右上角的页签到“我的” 3. 在“我的”页面中,点击进入“任务中心”;通过完成任务,获取赛事币 4. 退出“任务中心”,返回到“直播”的页签;点击“助威”按钮 和平精英花瓣如何获得? 通过参加和平精英游戏内的各种活动,包括…

    游戏快讯 2小时前
  • 和平精英怎么开变声器免费?

    和平精英怎么开变声器免费? 1. 首先打开和平营地 2. 在和平营地里选择营地工具 3. 然后打开变声器 4. 启动游戏,就可以在和平精英开免费的变声器了 和平精英变声器怎么关? 1.点击设置 2.从游戏中找到游戏设置选项并点击一下。 3.点击声音设置 4.在设置界面找到“声音设置”选项进入。 5.关闭变声器 6.在变声器栏下点击关闭按钮即可。 和平精英如何…

    游戏快讯 3小时前
  • 和平精英无敌版怎么获得礼包?

    和平精英无敌版怎么获得礼包? 礼包领取大全: 1、官网礼包,官网这里是有预约的礼包,玩家可以领取到下载的专属套装,188金币、海滨突袭套装、头盔皮肤、首款背包,玩家可以领取很多的助力礼包,奖励和平精英中的助力礼包。 2、游戏网站礼包,玩家直接通过官网去领取对应的礼包,这里是有大量的专属礼包有需要的玩家可以去领取。 3、购买礼包,玩家也可以去购买礼包,这种礼包…

    游戏快讯 4小时前
  • 和平精英怎么换主题背景呢?

    和平精英怎么换主题背景呢? 第一步,在大厅中点击下方的【仓库】按钮; 第二步,点击仓库右侧的【战备】功能; 第三步,在战备中选择最下方的【主题背景】 第四步,返回大厅,可以看到背景已经应用在了大厅界面 和平精英下载:和平精英最新版 和平精英换头像多久更新? 和平精英换头像会立刻更新显示出来,无需等待,不能显现出头像,可能是因为换的方式不对,需要在第三方平台进…

    游戏快讯 6小时前