Xcode构建选项“启用bitcode”的影响是/否

昨天我发现了大量关于parse.com库的警告:

紧急:所有位码将被丢弃,因为'[path]/Parse.framework/Parse(pfanalysis .o)'是没有位码构建的。你必须通过启用bitcode (Xcode设置ENABLE_BITCODE)重新构建它,从供应商那里获得一个更新的库,或者禁用这个目标的bitcode。注意:这将是未来的一个错误。

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

Xcode会通知你有关比特码的信息

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

但我并没有从这篇文章中得到任何真正有用的信息。

  • 我可以使用链接的答案来规避这个问题,而不产生任何负面影响,也不会影响未来的AppStore提交吗?
  • ENABLE_BITCODE实际上是做什么的,将来它会是一个非可选的要求吗?
  • 如果我启用/禁用它会对性能有任何影响吗?
196659 次浏览

Bitcode是iOS 9的一个新特性

位码是编译程序的中间表示形式。你上传到iTunes Connect的包含比特码的应用程序将被编译并链接到App Store。包含位码将允许苹果在未来重新优化你的应用程序二进制,而无需向应用商店提交新版本的应用程序。

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

所以你应该禁用位码,直到你的应用程序的所有框架都启用位码。

文档

  • 我是否可以在不影响未来appstore提交的情况下使用上述方法?
比特代码将允许苹果优化应用程序,而无需提交另一个构建。但是,只有当应用程序包中的所有框架和应用程序都启用了此功能时,您才能启用此功能。 拥有它是有帮助的,但没有它不应该有任何负面影响
  • ENABLE_BITCODE实际上是做什么的,将来它会是一个非可选的需求吗?
对于iOS应用程序,bitcode是默认值,但可选。如果你提供 Bitcode,应用程序包中的所有应用程序和框架都需要包含 bitcode。对于watchOS应用程序,bitcode是必需的
  • 如果我启用/禁用它会对性能有任何影响吗?

App Store和操作系统优化iOS的安装 和watchOS应用程序通过定制应用程序交付的能力 用户的特定设备,以最小的足迹。这种优化, 所谓的应用程序细化,让你创建的应用程序使用最多的设备 特性,占用最小的磁盘空间,并适应未来的更新 可以被苹果应用。更快的下载和更多的空间 其他应用程序和内容提供了更好的用户体验

不应该有任何性能影响。

  • ENABLE_BITCODE实际上是做什么的,将来它会是一个非可选的需求吗?

我不知道你在寻找什么样的答案,所以让我们来一次小旅行。其中一些你可能已经知道了。

当你构建你的项目时,Xcode为Objective-C目标调用clang,为Swift目标调用swift/swiftc。这两个编译器都将应用程序编译为中间表示 (IR),其中一个IR是位码。从这个IR中,一个名为LLVM的程序接管并创建x86 32和64位模式(用于模拟器)和arm6/arm7/arm7s/arm64(用于设备)所需的二进制文件。通常,所有这些不同的二进制文件都集中在一个名为脂肪二进制的文件中。

ENABLE_BITCODE选项省略了最后一步。它创建了一个版本的应用程序与IR位码二进制。它有许多不错的特性,但有一个巨大的缺点:它不能在任何地方运行。为了让带有二进制位码的应用程序运行,位码需要重新编译(可能是组装或转码……我不确定正确的动词)为x86或ARM二进制。

当一个位码应用程序被提交到应用程序商店时,苹果将执行最后一步并创建完成的二进制文件。

目前,位码应用程序是可选的,但历史表明苹果将可选的东西变成了要求(比如64位支持)。这通常需要几年的时间,所以第三方开发人员(如Parse)有时间进行更新。

  • 我是否可以在不影响未来appstore提交的情况下使用上述方法?

是的,你可以关闭ENABLE_BITCODE,一切都将像以前一样工作。在苹果将位码应用程序作为应用程序商店的要求之前,你会没事的。

  • 如果我启用/禁用它会对性能有任何影响吗?

启用它永远不会对性能产生负面影响,但用于测试的应用程序的内部分发可能会变得更加复杂。

至于积极的影响,这很复杂。

为了在App Store中发行,苹果将针对不同的机器架构(arm6/arm7/arm7s/arm64)为你的应用创建不同的版本,而不是一个带有臃肿二进制文件的应用。这意味着安装在iOS设备上的应用程序将更小。

另外,当bitcode被重新编译(可能是组装的,也可能是转码的……我也不确定用哪个动词)时,它会被优化。LLVM一直致力于创造新的更好的优化。从理论上讲,应用商店可以在每一个新的LLVM版本中重新创建应用程序的单独版本,所以你的应用程序可以使用最新的LLVM技术进行重新优化。

确保选择“All”以找到启用位码构建设置:

Build settings

位码使得崩溃报告更加困难。下面是来自HockeyApp的引用(对于任何其他崩溃报告解决方案也是如此):

当将应用上传到app Store并启用“Bitcode”复选框时,苹果将使用该Bitcode构建并在将其分发到设备之前重新编译。这将导致二进制文件获得一个新的UUID,并且有一个选项可以通过Xcode下载相应的dSYM。

注:答案在2016年1月进行了编辑,以反映最新变化

@vj9 thx。我更新到xcode 7。它显示了同样的错误。设置“NO”后构建良好

enter image description here

设置“NO”,效果很好。

enter image description here

我可以使用链接的答案来规避这个问题,而不产生任何负面影响,也不会影响未来的AppStore提交吗?

是的

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

ENABLE_BITCODE将代码的中间表示形式添加到二进制中。对于watchOS, tvOS现在是强制性的

如果我启用/禁用它会对性能有任何影响吗?

当你存档你的项目时,它对Xcode构建和内存占用有影响

< a href = " https://stackoverflow.com/a/66845532/4770877 " > [Bitcode] < / >

XCode 14 Beta版已弃用Bitcode:

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

从Xcode 14开始,watchOS和tvOS应用程序不再需要比特码,应用商店也不再接受Xcode 14提交的比特码。

Xcode不再默认构建bitcode,如果项目显式启用bitcode,则会生成警告消息:“使用bitcode构建已弃用。请更新您的项目和/或目标设置以禁用位码。”在未来的Xcode版本中,使用比特码构建的功能将被移除。包含位码的IPAs在提交到应用商店之前会被去除位码。过去提交的位码的调试符号仍然可以下载。(86118779)

对于任何想了解比特码的人来说,比特码似乎不再是必要的了。

  • 从Xcode 14开始,watchOS和bitcode不再需要 tvOS应用,应用商店不再接受位码
  • Xcode不再默认构建bitcode并生成警告 消息,如果项目显式启用bitcode: " Building with . Bitcode已弃用。请更新您的项目和/或目标 设置禁用位码。”使用位代码构建的能力 将在未来的Xcode版本中删除。包含位码的ipa 在提交给应用程序之前会有位码剥离吗 商店。调试符号只能从App Store Connect /下载 TestFlight为现有的比特码提交,不再 可用Xcode 14提交。李(86118779)< / >