Xcode 弃用 Bitcode,导致应用体积大幅增加


Emerge 是一个监测和减少应用程序大小的平台,可以持续监测并分析应用程序二进制大小,帮助开发者编写更小、更好的代码。近日 Emerge 发布了一份报告,显示最新版本的 Xcode 存在会无意中增加应用程序体积的问题。

Xcode 14 于今年 9 月份正式发布,新版本添加了对 Swift 5.7 的支持,并针对 macOS Ventura、iOS/iPadOS 16 等最新系统添加了 SDK,除此之外,新版本 Xcode 的速度更快、体积缩小了 30%、增加的并行性使得构建项目的速度提高了 25%,以及长时间运行测试的速度提高了 30%。

但在 Xcode 14 发布后不久,Emerge 发现一些 iOS 应用程序的体积则是出现了明显增加,其中从 9 月中旬到 10 月初之间,观测到:

  • 耐克 iOS 应用程序的安装大小一开始仅为 182.2MB,之后变成了 322.1MB,空间占用增加了 76%
  • American Airlines(美国航空)从 182.2MB 增加到 389.1MB,增加了 113%
  • Chime 从 162.8MB 增加到 212.8MB,增加了 31%

在上述这些例子中,应用空间占用突然增大都是由于这些应用程序首次使用了 Xcode 14 构建,而归根结底,导致这个问题发生的原因就是 Xcode 14 默认禁用了 Bitcode。

Xcode 14 更新文档中写道:

Xcode 不再默认构建 Bitcode,在未来的 Xcode 版本中,使用 Bitcode 构建的功能将被移除。含有 Bitcode 的 IPA 将在提交给 App Store 之前被剥离 Bitcode。

什么是 Bitcode

Bitcode 是打包应用程序的一种方式,它可以在开发者把应用提交到 App Store 后,将部分构建过程留给苹果公司完成,苹果所做的事情之一是剥离二进制符号。

什么是二进制符号剥离

二进制符号剥离(Binary symbol stripping)是指从二进制文件中删除某些类型的元数据,这些元数据对于在生产中运行应用程序是非必要的。这些元数据在生产前可能是有帮助的,但之后只会让用户的手机变得更加臃肿。

简单的解释是,Bitcode 通过剥离二进制符号优化了生产构建。如果不打开 Bitcode,开发者就需要修改 Xcode 的构建设置,从而以其他方式剥离二进制符号。

也就是说,当开发者更新至 Xcode 14 之后,任何依赖 Bitcode 的应用程序都不再会从其生产的应用程序中剥离二进制符号了,这意味着一个应用程序可以在不增加任何功能的情况下出现体积大幅增加的情况。

Emerge 深度分析了耐克的 iOS 端应用程序,在 22.35.0 版本中,框架在 191.7MB 的安装大小中占了 163.7MB。而到了 22.36.1 版本,框架在 322.1MB 的总容量中激增到 293.8MB。注意在每个框架中发现的深蓝色的 "String Table" 的增加。

通过比较这两个版本,可以发现几乎所增加的 130MB 的体积都来自于 DYLD.String Tables。这些字符串表本身是非必要的元数据,而它们现在已经进入了生产构建中。

两个版本应用程序的二进制符号也从 213.9KB (占应用程序总大小的 0.11%)增长到了 127.5 MB(占应用程序总大小的 40%)。也就是说耐克 iOS 应用程序在没有任何重大功能变化的同时,增加了 130MB。 (上图:Xcode 14 之前的二进制符号大小;下图:Xcode 14 之后中的二进制符号大小)

除了上述提到的这些应用,此次体积大幅增加的还包括了 Chrome、Amazon、Twitter、Twitch、ESPN 等常用的软件。

应用程序的大小是影响你的应用程序的安装和卸载指标的最大因素之一,过于臃肿会降低应用安装率和提升卸载率,尤其是对于手机空间比较有限的用户来说更加如此,最终会导致用户数量下滑,反过来也影响应用活跃度,甚至是收入。对开发者来说,定期监测并了解如何减少应用程序的下载和安装大小是一项重要的任务。


相關推薦

2022-09-01

且 Flutter 支持的最低 macOS 版本将增加到 10.13 High Sierra。 Bitcode 弃用 在即将发布的 Xcode 14 版本中,iOS 应用程序提交将不再接受 Bitcode ,并且启用了 bitcode 的项目将在此版本的 Xcode 中发出构建警告。鉴于此,Flutter 将在

2023-09-15

ripILAfterAOT 模式 .NET 开发团队尝试为 .NET 和 .NET MAUI 应用程序选择最佳的开箱即用默认配置。 具体来说,在 .NET 6 及更高版本中,这些应用程序现在在以Release模式构建时默认使用 AOT 编译模式。AOT 编译可加快启动时间并提

2023-08-19

e 15 时,还需确保还下载了 iOS 17 模拟器。 破坏性变更和弃用 破坏性变更 下一版本默认 Material 3 下一个Flutter 稳定版本中计划将 ThemeData useMaterial3 默认值从 false 更改为 true。换句话说,应用程序将默认获取 Material 3 颜色、

2023-07-13

已发布,具体更新内容如下: Changed 从模板中删除已弃用的存根类型@types/metro-config(63f78ea8de) 将 CLI 升级到 11.3.5,Metro 升级到 0.76.7(ba5fa9c394) 将@react-native/metro-config升级至0.72.9(21daa6e790,f37386176) Android specific

2022-06-09

建动画电影、视觉效果、艺术、3D 打印模型、交互式 3D 应用、VR 和计算机游戏。 近日,Blender 3.2 正式发布,该版本的更新内容如下: 新的 Cycles 渲染 有一种新类型的 Cycles 渲染通道,仅包含来自光源子集的光照。可以使用灯光

2021-12-20

到~/Library/Caches/com.apple.amp.itmstransporter。当向 App Store 提交应用程序时,Xcode 会使用该库的更新版本。(86390060) 截止记者发稿,全球已经有3500万苹果用户受到影响,上千万用户已经被入侵,设备被控制...很严重啊

2022-10-04

oslyn 分析器和源代码生成器在 Visual Studio 中无法加载。 增加了对 Xcode 14.0 的支持 更多详情可查看:https://learn.microsoft.com/en-us/visualstudio/releases/2022/release-notes#17.3.5

2023-09-15

le XCFramework:构建模拟器现在是可选的。 iOS:不再生成 bitcode,因为它已被 Apple 弃用。 watchOS:添加了对 arm64 的支持。 Zig 工具链现在可以用作现代构建系统来替换 autoconf/automake/libtool/make/ccache 和编译器。这可以实现更快的

2023-09-02

维,避免中文转英文时,单词在一个元素中出现多次,会导致有时两个英文单词连起来的问题 初步修复了中文转日文、英文转法语等在第二次及更多次执行翻译会导致内容出现逐渐增加的情况 修复 translate.service翻译服务,统计

2023-06-30

误等)。 请注意,这项技术不是指导开发者如何构建应用程序的学习系统,而是学习开发者如何工作,进而提供相关帮助和建议。苹果希望使用机器学习模型来消除开发障碍——无论这意味着创建大部分代码,或者只是帮助

2023-10-24

定该技术是否能够应对竞争对手,以及苹果如何将其实际应用到产品中。 分别负责人工智能和软件工程的高级副总裁 John Giannandrea 以及 Craig Federighi 正在带头开展这项工作,服务主管 Eddy Cue 也参与其中。目前,3 人计划每年在

2023-06-16

宝极小版本安装包评测”。据称该版本 App 相比现有版本体积大幅缩减,但目前没有关于该版本的详细信息,所以暂时无法了解具体是如何缩减 App 体积。 有网友猜测是支付宝对 App 的功能进行了删减,或者是采用了 Web 技术来

2023-08-22

务栏无法闪烁的问题 修复了群组列表悬停时出现滚动条导致徽标闪烁的问题 修复浅色模式下危险按钮颜色错误的问题 修复userSetting的缓存键不正确的问题 修复被禁言后依旧可以在聊天框使用右侧输入框操作的问题 对部

2023-11-12

NET 7 首次引入了以原生 AOT (Native AOT)发布应用程序的选项。基于此特性,开发者使用原生 AOT 发布应用程序可以创建一个完全独立 (self-contained) 的版本,它不需要运行时,所有内容都包含在一个文件中。 微软介绍道,.NET 8 为原