中国川派团膳领导品牌

成立20余年来,顺心理想是致力于把最正宗的川派美食美味普及到团体膳食领域

地道川菜调料,真正川菜师傅!

全国客服热线:0476-853177531

手机官网二维码

微信二维码

CLOSE

完美体育APP手机网页版_今日头条 iOS 安装包巨细优化 - 新阶段、新实践

文章来源: 完美体育app官方网址下载发布时间:2022-05-29 00:57
本文摘要:前言今日头条 iOS 端从 2016 年起就关注到了安装包巨细的问题,并启动了包巨细优化。2017 年,我们将其时的履历揭晓为技术文章 干货|今日头条iOS端安装包巨细优化—思路与实践 [1]。如今三年已往了。今日头条在继续探索包巨细优化时实践了更多思路,包罗构建设置、图片压缩、__TEXT 段迁移、二进制段压缩等。 这些优化项在业务入侵较少的前提下给今日头条带来了显著的包巨细收益。同时,整个业界在包巨细优化上也产出了更多方案。

完美体育app官方网址下载

前言今日头条 iOS 端从 2016 年起就关注到了安装包巨细的问题,并启动了包巨细优化。2017 年,我们将其时的履历揭晓为技术文章 干货|今日头条iOS端安装包巨细优化—思路与实践 [1]。如今三年已往了。今日头条在继续探索包巨细优化时实践了更多思路,包罗构建设置、图片压缩、__TEXT 段迁移、二进制段压缩等。

这些优化项在业务入侵较少的前提下给今日头条带来了显著的包巨细收益。同时,整个业界在包巨细优化上也产出了更多方案。因此我们更新文章,期待与大家配合交流包巨细优化这件事。

表格:今日头条落地的优化项和收益一览一、安装包的组成当我们通过构建,获得了一个经由了 App Slicing 后的 ipa 文件后,将其用 zip 解压缩方式解压,进入 .app 文件后,我们就可以直观地看到安装包中的内容。一个安装包,往往包罗资源与 iOS 上的可执行文件 Mach-O 文件两部门,资源又可以分为 Asset Catalog 的构建产物 Assets.car 文件和其他资源。

其中 Assets.car 文件和 Mach-O 文件,是我们投入较多精神优化的部门。1.1、Assets.car 文件Assets.car 文件是工程中 Asset Catalog 的构建产物。Xcode 工具链中的 actool 卖力构建 Assets.car。

在构建 Assets.car 的历程中,actool 会根据一定计谋选取编码算法,对其中的 png 图片重新编码。图:Asset Catalog1.2、Mach-O 文件Mach-O 文件是 iOS 上的可执行文件,它是由代码源文件经由编译和静态链接获得。经由 App Slicing 之后的 Mach-O 文件往往仅包罗单个架构。使用 MachOView 等工具,我们可以直观相识 Mach-O 中包罗的内容。

同时,Link Map 文件能更进一步资助我们分析 Mach-O 文件的组成。在 Build Settings 中打开 LD_GENERATE_MAP_FILE 开关,构建 App 的历程中就会生成一个名叫 Link Map 的 txt 文件,它能展示每个段、每个节、每个函数在 Mach-O 中的漫衍和巨细。这些信息是包巨细优化中经常使用的。二、资源巨细优化“压缩资源”往往是最容易被遐想到的包巨细优化方案,但实际操作起来,却也包罗技巧。

今日头条在资源优化上做了诸多实验。2.1、使用合适的资源压缩设置今日头条现在最低支持的 iOS 系统版本为 iOS 9。然而,大部门 Pod 库的 Podspec 文件中指定的deployment_target(最低支持版本)由于未实时修改,依然还是 iOS 8,这就导致了这些 Pod 库中指定的 resource_bundles 在构建出 Assets.car 时,是以 iOS 8 为最低支持版本的。

我们通过实验发现:1、将 Pod 库和主工程的最低支持版本从 iOS 8.0 提升成 iOS 9.02、开启 Pod 库和主工程 Xcode Build Settings 中的 ASSETCATALOG_COMPILER_OPTIMIZATION space 选项这两项设置可以改变 actool 构建 Assets.car 时选取的编码压缩算法,减小包巨细。我们可以使用 xcrun assetutil --info Assets.car 下令检查 Assets.car 中每张图片使用的编码压缩算法。在今日头条情况下,整理的效果如下:由于 Assets.car 中 png 图片的编码压缩算法获得了改变,这两项设置在今日头条落地时获得了 2.31MB 的包巨细收益。

2.2、使用 RGB with palette 压缩图片在今日头条投入包巨细优化的早期,我们曾实验对 Asset Catalog 中的 png 图片做无损压缩,但实践后发现,虽然放入 Asset Catalog 的图片巨细有了显着减小,可是构建的产物的巨细却险些没有变化。经由探究,我们发现,Xcode 中,构建 Asset Catalog 的工具 actool 会首先对 Asset Catalog 中的 png 图片举行解码,获得 Bitmap 数据,然后再运用 actool 的编码压缩算法举行编码压缩处置惩罚。

无损压缩通过变换图片的编码压缩算法淘汰巨细,可是不会改变 Bitmap 数据。对于 actool 来说,它吸收的输入没有改变,所以无损压缩无法优化 Assets.car 的巨细。那是否有其他的压缩方式能优化 Assets.car 的巨细呢?我们推测对图片做合适的有损压缩是一个思路。于是我们实验了 RGB with palette 编码方式[2]。

RGB with palette 编码的获得的字节省首先维护了一个颜色数组。颜色数组每个成员用 RGBA 四个分量维护一个颜色。图像中的每个像素点则存储颜色数组的下标代表该点的颜色。

颜色数组维护的颜色种类和数量由图片决议,同时可以人为的限制颜色数组维护颜色的种类的上限,默认为最大值 256 种。这种编码方式正如它的名字:palette(调色板)。App 中大部门图片虽然使用了许多种类的颜色,但这些颜色中大多数都很是靠近,从视觉上很难分辨,好比大量扁平气势派头的 icon。

这种类型的图片很是适适用 palette 编码且淘汰颜色数组巨细的方式来举行有损压缩,既能淘汰颜色数量实现有损压缩,也能保证保留的颜色贴近原始图片,使得经由有损压缩后的也看起来质量无损。我们在今日头条上落地,获得了 3.15MB 包巨细收益。

在详细执行中,我们使用了 ImageOptim 工具改变图片的编码方式为 RGB with palette :imageoptim-Q--no-imageoptim--imagealpha--number-of-colors16--quality40-80./1.png其中 --number-of-colors 控制颜色数组维护颜色的数量;--quality 控制图片的质量变为原来的百分比。我们的履历讲明,当 --number-of-colors 从 16 开始向上调整,--quality 维持 40-80,能够在显著淘汰包巨细的同时维持肉眼看不到的质量变化。经由 UI 同学的像素眼审查,确认优化前后的图片看起来无差异。

2.3、Assets.car 合并今日头条使用 CocoaPods 举行组件集成,各个组件携带的 Asset Catalog 文件以 Podspec 中 resource_bundles 的方式引入,最终会以 Bundle 下的 Assets.car 文件的形式体现在安装包内。以 7.9.4 版本为例,安装包内有 106 个 Bundle 包罗 Assets.car 文件:Assets.car 文件本质上是 BOM 文件,同时,Xcode 在使用 actool 构建 Assets.car 文件时,也会自带一些优化操作,好比:将若干张小图片自动合并为一张 Packed Image。因此,将若干个 Assets.car 合并,可以淘汰重复的 BOM Block,也可以最大化享受到 actool 自带的优化效果。在构建的历程中,今日头条通过在 Build Phases 中加入剧本,将多个库中 Asset Catalog 中的图片合并到一个 Asset Catalog 中,再经 actool 构建成 Assets.car 产物。

这一优化发生了 2.1MB 的包巨细收益。同时,从理论上分析,这一优化也可以淘汰运行时 Assets.car 的剖析操作,对图片读取的响应耗时有正向收益。2.4、文本文件压缩除了占比最大的图片资源,今日头条安装包内另有不少文本文件资源,如 JSON 文件、HTML 文件等。

这些文本文件的压缩也能带来包巨细优化效果。今日头条落地的文本文件压缩方案由三部门组成:1、压缩阶段:在 Build Phase 中添加剧本,构建期间对白名单内的文本文件做 zip 压缩;2、解压阶段:在 App 启动阶段,在异步线程中举行解压操作,将解压产物存放到沙盒中;3、读取阶段:在 App 运行时,hook 读取这些文件的方法,将读取路径从 Bundle 改为沙盒中的对应路径;这一方案能在业务入侵较少的前提下完成压缩优化。我们首先将这一方案应用在了 Lottie 动画的 JSON 文件上,发生了 400KB 的包巨细收益。后续这一方案也可以进一步拓展,应用在更多类型的文件上。

三、Mach-O 文件优化在资源优化的同时,我们也关注到,Mach-O 文件始终占据了今日头条安装包 80% 左右的体积。Mach-O 文件的优化必不行少。下面我们以时间顺序,先容我们落地的 Mach-O 文件优化项。

3.1、使用 -Oz 编译参数Oz 是 Xcode 11 新增的编译优化选项。WWDC 2019 《What's New in Clang and LLVM》[3] 中对 Oz 有过先容。Oz 的焦点原理是对重复的一连机械指令外联成函数举行复用,和“内联函数”的原理正好相反。

完美体育app官方网址下载

因此,开启 Oz,能减小二进制的巨细,但同时理论上会带来执行效率的分外消耗。对性能(CPU)敏感的代码使用需要评估。苹果给的参考数据是 4.5% 的包体积收益。

我们在评估了执行效率、客栈剖析、稳定性和编译速度后,对大部门源代码开启了 Oz 编译,包体积减小 4MB 以上。3.2、使用链接时优化 LTOLink-Time Optimization 链接时优化,是 Xcode 自带的一个编译/链接参数。凭据 WWDC 2016 《What's New in LLVM》[4]的先容,LTO 对包巨细和运行效率都有正向影响。

今日头条在编译和链接中均开启 Incremental LTO 后,包体积减小 6.5MB。3.3、修正 Exported Symbols 设置Xcode Build Settings 中的 EXPORTED_SYMBOLS_FILE 设置,控制着 Mach-O 中 __LINKEDIT 段中 Export Info 的信息。

动态链接器 dyld 在做符号绑定时,会读取被绑定的动态库或可执行文件的 Export Info 信息,获得一个符号对应的实际挪用地址。如果正在被绑定的符号,在目的动态库的 Export Info 中缺失,dyld 则会抛出异常,体现为 App 瓦解。虽然从原理上看,Export Info 中的信息不行或缺。

可是,对于一个 Mach-O 文件来说,并非所有的符号都是需要袒露给其他动态库或可执行文件的。理想情况下,私有的符号应该在编码时就应该以 __attribute__((visibility(hidden))) 修饰。

完美体育app官方网址下载

但在历史代码难以逐个添加修饰符的情况下,Exported Symbols 设置给了工程一个维护公有符号白名单的时机。如果填写了有效的 EXPORTED_SYMBOLS_FILE 设置,动态库或者可执行文件会在静态链接时去掉白名单以外的符号,起到缩减包巨细、增加逆向难度的作用。今日头条在使用 Exported Symbols 设置后,包巨细淘汰了 2.1MB。

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、20B。

一个方法巨细或许是64B,set、get 两个方法就是 128B。(3)property 部门:property 的本质仍然是个结构体,巨细是 16B,结构体中两个指针指向内容的巨细划分或许是 10B、10B,和属性的名字和类型相关。总巨细或许 36B。

即一个属性占用的包巨细约莫为 224B。如果我们用 @dynamic 修饰一个属性,不生成成员变量、get/set 方法,则一个属性可以由 224B 淘汰到 36B,即仅包罗 property 部门的巨细。同时,代码中存在大量通过剧本自动生成的 JSONModel 子类,这些子类往往拥有大量属性。

这里也就存在着包巨细优化空间。于是我们通过修改生成 JSONModel 子类的剧本,实现了:1、属性全部使用 @dynamic 修饰,基础变量分外生成 IVAR2、所有 JSONModel 的子类继续自新的父类,新的父类实现 resolveInstanceMethod,在该方法中用 class_addMethod 统一为属性添加 get/set 方法。

工具类型的属性使用关联工具的方式存取,基础类型的属性使用分外生成的 IVAR 存取。这一优化获得了 800KB 的包巨细收益,而且评估对读写的性能影响损耗可以接受。

3.5、__TEXT 段迁移安装包经由压缩后的 Download Size 若凌驾 200 MB,在蜂窝网络下载 App 就会受到限制,这对新增会有较大影响。在 2020 年下半年,我们探索实践了 __TEXT 段迁移技术:在链接阶段使用 -rename_section 选项将 __TEXT,__text 迁移到 __BD_TEXT,__text,淘汰苹果对可执行文件的加密规模,提升可执行文件的压缩效率,从而淘汰 Download Size。使用该方案我们最终淘汰了 60 MB 的 Download Size 以及 2 MB 的 Install Size。

详细的原理可以参考:今日头条优化实践:iOS 包巨细二进制优化 [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 团队,在性能优化、基础组件、业务架构、研发体系、宁静合规、线下质量基础设施、线上问题定位归因平台等偏向连续深耕,卖力保障和提升今日头条的产物质量和开发效率,聚焦于今日头条的同时向外延伸。如果你对技术充满热情,喜欢追求极致,盼望用自己的代码改变数亿用户的体验,接待加入我们。我们期待你与我们配合发展。

现在我们在北京、深圳均有招聘需求,简历投递邮箱:tech@bytedance.com;邮件标题:姓名 - 事情年限 - 今日头条 - 平台架构 - iOS/Android。参考资料[1] 干货|今日头条iOS端安装包巨细优化—思路与实践 [2] Palette Images http://www.manifold.net/doc/mfd9/palette_images.htm[3] WWDC 2019 What's New in Clang and LLVM https://developer.apple.com/videos/play/wwdc2019/409/[4] WWDC 2016 What's New in LLVM https://developer.apple.com/videos/play/wwdc2016/405/[5] 今日头条优化实践:iOS 包巨细二进制优化 接待关注「 字节跳动技术团队 」简历投递联系邮箱「 tech@bytedance.com 」。


本文关键词:完美,体育,APP,手机,完美体育app官方网址下载,网页,版,今日,头条,iOS

本文来源:完美体育APP手机网页版-www.shanghaicohem.com