Xcode构建选项“启用位代码”(Enable bitcode)的影响是什么?是/否。

288

昨天我注意到关于parse.com库的大量警告:

紧急:所有位码都将被删除,因为 '[path]/Parse.framework/Parse(PFAnalytics.o)' 是没有使用位码构建的。您必须重新启用位码(Xcode设置ENABLE_BITCODE),从供应商获取更新的库或为此目标禁用位码。注:这将是将来的错误。

我知道可以通过此答案来消除这些警告,但现在想知道是否会对AppStore提交和/或我的应用程序实际性能产生任何负面影响。

Xcode通知您有关位码:

激活此设置表示目标或项目应在支持它的平台和体系结构上在编译期间生成位码。 对于归档构建,将在链接的二进制文件中生成位码以提交到应用商店。 对于其他构建,编译器和链接器将检查代码是否符合位码生成的要求,但不会生成实际的位码。 [ENABLE_BITCODE]

但我从这段文字中没有得到任何真正有用的信息。

  • 我能否使用上述答案绕过问题而不会产生任何负面影响,并且不会影响未来的AppStore提交?
  • ENABLE_BITCODE实际上是做什么的,它将成为非可选要求吗?
  • 如果我启用/禁用它是否会有性能影响?
9个回答

481
我不确定您需要什么级别的答案,因此让我们稍微了解一下。您可能已经知道其中一些内容。
当您构建项目时,Xcode会为Objective-C目标调用clang,并为Swift目标调用swift/swiftc。这两个编译器都将应用程序编译为中间表示(IR),其中一个IR是位码。从这个IR开始,一个名为LLVM的程序接管并创建x86 32和64位模式(用于模拟器)以及arm6 / arm7 / arm7s / arm64(用于设备)所需的二进制文件。通常,所有这些不同的二进制文件都被 lumped together放在一个称为fat binary的单个文件中。
ENABLE_BITCODE选项可以省略最后一步。它创建了一个带有IR位码二进制的应用程序版本。这有很多好处,但是有一个巨大的缺点:它无法在任何地方运行。为了使具有位码二进制的应用程序运行,需要将位码重新编译(也许是汇编或转码...我不确定正确的动词是什么)成x86或ARM二进制文件。
当位码应用程序提交到App Store时,苹果将执行此最后一步并创建完成的二进制文件。
现在,位码应用程序是可选的,但历史表明,苹果会将可选的事物变成要求(例如64位支持)。这通常需要几年时间,因此第三方开发人员(如Parse)有时间进行更新。
  • 我能在不影响未来的App Store提交的情况下使用上述方法吗?
是的,您可以关闭ENABLE_BITCODE,一切都像以前一样正常工作。在苹果将位码应用程序作为App Store的要求之前,您不会有问题。
  • 如果我启用/禁用它,是否会有任何性能影响?

启用它不会产生负面影响,但是内部分发测试应用程序可能会更加复杂。

至于积极的影响……那就很复杂了。

对于在App Store中分发,苹果将为每种机器架构(arm6/arm7/arm7s/arm64)创建单独的应用程序版本,而不是一个包含多个架构的应用程序。这意味着安装在iOS设备上的应用程序将更小。

此外,当重新编译位码时(可能是组装或转码……我不确定正确的动词),它会被优化。LLVM始终致力于创建新的更好的优化。理论上,App Store可以在每次发布新版本的LLVM时重新创建应用程序的单独版本,因此您的应用程序可以使用最新的LLVM技术进行重新优化。


29
苹果将为每种机器架构(arm6/arm7/arm7s/arm64)创建单独的应用程序版本,而不是一个包含多个二进制版本的应用程序。这意味着安装在iOS设备上的应用程序将更小。这就是所谓的"Slicing"。这与Bitcode无关。 - user102008
19
“ENABLE_BITCODE选项剪裁了这个最后的步骤。” 它并没有剪裁任何步骤。所有架构的二进制文件仍然被生成。此外,对于每种架构,都会添加位码信息。请参见https://dev59.com/Gl0a5IYBdhLWcg3wFlVH#31030741。 - user102008
8
请参考 https://developer.apple.com/library/prerelease/watchos/documentation/IDEs/Conceptual/AppDistributionGuide/AppThinning/AppThinning.html 。"Slicing 是创建并为不同目标设备提供应用程序包的变体的过程。一个变体只包含目标设备所需的可执行架构和资源。" - user102008
8
启用 Bitcode 并不能使应用在设备上的安装大小比禁用 Bitcode 时更小,这并不是一个正确的说法。任何地方都没有提到过这一点。 - user102008
7
并不是所有供应商都提供源代码。如果供应商提供的只是静态库和头文件(或框架),那么供应商需要启用比特码编译他们的东西。 - Jeffery Thomas
显示剩余15条评论

72

请务必选择“全部”,以查找启用位代码构建设置:

构建设置


4
最终有了屏幕截图(还有,为什么提交到商店时必须禁用位码才能工作...?) - user5306470

36

Bitcode是iOS 9的一个新功能。

Bitcode是编译程序的中间表示形式。上传到iTunes Connect的包含bitcode的应用将在App Store上进行编译和链接。包含bitcode将使苹果公司在未来重新优化您的应用程序二进制文件,而无需提交新版本的应用程序到商店。

注意:对于iOS应用程序,bitcode是默认启用的,但是可选的。如果提供bitcode,则应用程序包中的所有应用程序和框架都需要包含bitcode。对于watchOS应用程序,bitcode是必需的。

因此,在您的应用程序的所有框架都启用bitcode之前,您应该禁用bitcode。


将来重新优化您的应用程序二进制文件 - 您能详细解释一下吗? - genaks
这里说:“Bitcode是iOS 9的一个新功能”,并且“[...]对于watchOS应用程序,需要使用bitcode[...]”。那么,如果我想在iOS 8下创建一个WatchOS应用程序呢? - superpuccio

34

Bitcode 使崩溃报告更加困难。以下是来自 HockeyApp 的引用(对于任何其他的崩溃报告解决方案也同样适用):

当上传应用程序到 App Store 并勾选 "Bitcode" 复选框时,苹果将使用该 Bitcode 构建并在分发到设备之前在其端重新编译它。这将导致二进制文件获得新的 UUID,可以通过 Xcode 下载相应的 dSYM。

注:答案已于 2016 年 1 月进行编辑以反映最近的更改


2
在9月至12月期间,这个问题通过新的Xcode Organizer导出选项得以解决(请参见HA howto中的更新),但随后又出现了问题(请参见我已解决的HA问题)。 - Pavel Zdenek

21

从 XCode 14 Beta 开始,Bitcode已经被弃用:

https://developer.apple.com/documentation/xcode-release-notes/xcode-14-release-notes

从Xcode 14开始,watchOS和tvOS应用程序不再需要bitcode,并且App Store不再接受来自Xcode 14的bitcode提交。

Xcode不再默认构建bitcode,并生成警告消息,如果项目明确启用bitcode:“正在使用bitcode进行构建已过时。请更新您的项目和/或目标设置以禁用bitcode。” 未来的Xcode版本将删除使用bitcode的能力。在提交到App Store之前,包含bitcode的IPA将被剥离bitcode。过去的bitcode提交的调试符号仍可供下载。(86118779)

对于任何想了解bitcode的人,似乎它将不再是必需的。


但是在这里仍然提到启用位码将有助于减小应用程序的大小。https://developer.apple.com/documentation/xcode/doing-basic-optimization-to-reduce-your-app-s-size - Venkatesh Chejarla
@VenkateshChejarla 不再了!他们设法更新了文档 ;) - Ecuador
从Xcode 15 beta的发布说明中:“已删除Bitcode支持,并且ENABLE_BITCODE构建设置不再起作用。(105281961)” https://developer.apple.com/documentation/Xcode-Release-Notes/xcode-15-release-notes - Jan Ehrhardt

14

@vj9 谢谢。我升级到了Xcode 7,但仍然遇到了同样的错误。在设置"NO"之后构建成功。

输入图像描述

设置 "NO" 后它就正常工作了。

输入图像描述


1
@Septronic 如果你想选择YES,你需要检查所有第三方框架是否支持。 - zszen
您的目标最低支持的iOS版本必须是iOS 6或更高版本。 - shallowThought

6
文档中得知:
  • 我是否可以使用以上方法,既不会产生负面影响,又不会危及未来的AppStore提交?

启用 Bitcode 将允许Apple进行应用程序优化而无需您再次提交构建。但是,只有在应用程序包中的所有框架和应用程序启用此功能时,才能启用此功能。拥有它会有所帮助,但没有它不应该产生任何负面影响。

  • ENABLE_BITCODE 实际上是什么?将来它是否是一个非可选要求?

对于iOS应用程序,Bitcode 是默认选择但是可选的。如果您提供了 Bitcode,则应用程序包中的所有应用程序和框架都需要包括 Bitcode。对于watchOS应用程序,Bitcode是必需的。

  • 启用 / 禁用它是否会产生任何性能影响?

应用商店和操作系统通过按照用户特定设备的功能量身定制应用程序传递,来优化iOS和watchOS应用程序的安装,最大限度地减轻空间占用。这种优化称为 app thinning,它允许您创建使用最多设备功能,占用最少磁盘空间并容纳可以由 Apple 应用的未来更新的应用程序。更快的下载速度和更多其他应用程序和内容提供更好的用户体验。

不应该产生任何性能影响。


1
  • 从Xcode 14开始,watchOS和tvOS应用程序不再需要位码,App Store也不再接受来自Xcode 14的位码提交。
  • Xcode不再默认构建位码,并生成警告消息,如果项目明确启用了位码:“使用位码构建已过时。请更新您的项目和/或目标设置以禁用位码。”在未来的Xcode版本中,将删除使用位码的功能。包含位码的IPA将在提交到App Store之前被剥离位码。调试符号只能从App Store Connect / TestFlight下载现有位码提交的符号,不再适用于使用Xcode 14进行的提交。(86118779)

0

我能使用链接的答案来规避问题,而不会产生任何负面影响,并且不会影响未来的AppStore提交吗?

可以。

ENABLE_BITCODE实际上是做什么的?它将来会成为一个非可选要求吗?

ENABLE_BITCODE将您的代码添加到二进制文件中的中间表示。对于watchOS、tvOS现在是强制性的。

如果我启用/禁用它,是否会有任何性能影响?

当您归档项目时,它会影响Xcode构建和内存占用。

[Bitcode]


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接