Xcode构build选项的影响“启用位代码”是/否

昨天我发现了很多关于parse.com图书馆的警告:

紧急:所有位码将被丢弃,因为'[path] /Parse.framework/Parse(PFAnalytics.o)'是在没有位码的情况下构build的。 您必须使用位代码重新启动(Xcode设置ENABLE_BITCODE),从供应商获取更新的库,或者禁用此目标的位代码。 注意:这将是一个错误。

我知道这个事实,我可以删除这个警告与这个答案,但现在想知道是否会有任何负面影响AppStore提交和/或我的应用程序的实际performance。

Xcode通知您关于位代码

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

但是我没有从这个文本中得到任何有用的信息。

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

我不确定你在什么级别寻找答案,所以让我们来一个小小的旅程。 其中一些你可能已经知道了。

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

ENABLE_BITCODE选项删除了最后一步。 它用IR位码二进制创build了一个应用程序版本。 这有很多不错的function,但有一个巨大的缺点:它不能在任何地方运行。 为了得到一个运行bitcode二进制文件的应用程序,需要重新编译bitcode( 可能是汇编或代码转换…我不知道正确的动词 )到x86或ARM二进制文件中。

当一个bitcode应用程序被提交给App Store时,Apple将会执行最后一步并创build完成的二进制文件。

现在,bitcode应用程序是可选的,但历史显示,苹果将可选的东西变成需求(比如64位支持)。 这通常需要几年时间,所以第三方开发人员(如Parse)有时间更新。

  • 我是否可以使用上述方法而不会有任何负面影响,并且不会影响未来的app store提交?

是的,你可以closuresENABLE_BITCODE,一切都会像以前一样工作。 直到苹果使应用程序商店的bitcode应用程序的要求,你会没事的。

  • 如果启用/禁用它,是否会对性能产生影响?

对于实现它而言,永远不会有负面的性能影响,但是用于testing的应用程序的内部分发可能会变得更加复杂。

至于积极的影响…这是复杂的。

为了在App Store中分发,Apple将为每个机器体系结构(arm6 / arm7 / arm7s / arm64)创build不同版本的应用程序,而不是使用胖二进制文件的应用程序。 这意味着在iOS设备上安装的应用会更小。

另外,当bitcode被重新编译时( 可能再次组合或者转码…我不确定正确的动词 ),它被优化。 LLVM一直致力于创build更好的优化。 从理论上讲,应用程序商店可以在每个新的LLVM版本的App Store中重新创build应用程序的独立版本,因此您的应用程序可以使用最新的LLVM技术进行重新优化。

确保select“全部”来查找启用位码构build设置:

构建设置

位码是iOS 9的一个新function

位码是编译程序的中间表示。 包含位码的上传到iTunes Connect的应用程序将在App Store上编译和链接。 包括位码将允许苹果在将来重新优化您的应用程序二进制文件,而无需将新版本的应用程序提交给商店。

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

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

位码使得崩溃报告更难 。 这里是HockeyApp的一个引用(对于其他崩溃报告解决scheme也是如此):

将应用上传到App Store并启用“Bitcode”checkbox后,Apple将使用该Bitcode版本,并在将其分发到设备之前对其进行重新编译。 这将导致二进制获得一个新的UUID,并有一个选项通过Xcode下载相应的dSYM。

注意:2016年1月编辑的答案反映了最近的变化

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

在这里输入图像描述

设置为“否”,效果很好。

在这里输入图像描述

从文档

  • 我是否可以使用上述方法而不会有任何负面影响,并且不会影响未来的app store提交?

Bitcode将允许苹果优化应用程序,而不必提交另一个版本。 但是,如果应用程序包中的所有框架和应用程序都启用了此function,则只能启用此function。 有它的帮助,但没有它不应该有任何负面影响。

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

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

  • 如果启用/禁用它,是否会对性能产生影响?

App Store和操作系统通过针对用户特定设备的function量身定制应用程序,以最小的占用空间优化iOS和watchOS应用程序的安装。 这种称为应用程序细化的优化function可让您创build使用大多数设备function的应用程序,占用最less的磁盘空间,并适应未来可以由Apple应用的更新。 其他应用程序和内容的更快下载和更多空间提供了更好的用户体验。

不应该有任何性能影响。

在这里你可以find关于Bitcode的所有解决scheme

根据Apple Doc位码是一个编译程序的中间表示。 包含位码的上传到iTunes Connect的应用程序将在商店中编译和链接。 包括位码将允许苹果在将来重新优化您的应用程序二进制文件,而无需将新版本的应用程序提交给商店。

Xcode默认情况下隐藏了编译时生成的符号,所以它们不能被Apple读取。 只有在将应用上传到iTunes Connect时select包含符号,符号才会发送给Apple。 您必须包含符号才能接收来自Apple的崩溃报告。

注意:对于iOS应用程序,位码是默认的,但是可选的。 对于watchOS和tvOS应用程序,位码是必需的。 如果您提供位码,应用程序包(项目中的所有目标)中的所有应用程序和框架都需要包含位码。 在使用iTunes Connect发布您的应用程序之后,您可以下载用于构build的dSYMs文件,如查看和导入设备窗口中的崩溃

苹果最初推出的位码和应用程​​序细化服务被搁置,因为从一种硬件升级到另一种硬件的问题并没有恢复正确版本的二进制文件。 随后iOS 9.0.2修复了此问题,并重新启用了该function。

Bitcode一直是LLVM编译和优化阶段的一部分,但通过将后端逻辑移动到Apple服务器,它将优化和组装阶段从开发人员编译时间移至App Store部署。 这释放未来重新优化或重新翻译的潜力,以支持未来更新更快的处理器。 watchOS和tvOS部署需要Bitcode部署,并且可以通过项目设置中的“启用位代码”选项对现有iOS部署进行有条件启用。 这将为debugging版本添加一个标志embedded位代码标记,并为归档/设备版本添加embedded位代码。 这些可以通过-embed-bitcode传递给Swift编译器,或者通过使用带有-fembed-bitcode的clang传递给Swift编译器。

位码也有一些缺点。 开发人员可以通过存储与运往Apple的二进制文件相对应的debugging符号副本来debugging应用程序的崩溃报告。 当给定堆栈发生崩溃时,开发人员可以通过使用这些debugging符号来象征化崩溃报告来恢复原始堆栈跟踪。 然而,符号是将中间forms翻译成二进制的副产品; 但如果这一步是在服务器上完成的,则此信息将丢失。 苹果公司提供了一个崩溃报告服务,可以发挥debugging器的一部分,只要开发者在应用程序发布时已经上传了debugging符号。 开发人员从来不会看到确切的二进制文件,这意味着他们可能无法testing特定的问题,因为新硬件的发展。 还有一些担心,苹果将执行编译function(包括注入额外例程或代码片段的能力),但是由于Apple完全控制了发布过程,因此无论开发人员是使用位代码还是编译的二进制文件。

最后,可以转换服务器上的位码 ,以支持新的架构和指令集。 只要它们保持alignment和字的调用约定和大小,比特码应用程序就可以被转换成不同的体系结构types,并专门针对新的处理器进行优化。 如果使用math和向量例程的标准库,可以将这些库优化到特定于处理器的向量指令中,以获得给定应用程序的最佳性能。 优化器甚至可以根据大小或执行速度生成多种不同的编码和判断。

欲了解更多信息请点击这里和这里