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

luk*_*302 228 xcode ios parse-platform bitcode

昨天我认识到有关parse.com库的大量警告:

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

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

Xcode告诉你有关bitcode的信息

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

但是我没有从本文中获得任何真正有用的信息.

  • 我是否可以使用链接的答案来规避问题而不会产生任何负面影响并且不会影响未来的AppStore提交?
  • 什么是ENABLE_BITCODE真正做的,这将是未来的一个非强制性要求?
  • 如果启用/禁用它会对性能产生影响吗?

Jef*_*mas 374

  • ENABLE_BITCODE实际上做了什么,将来是否会成为非选择性要求?

我不确定你在什么级别寻找答案,所以让我们来一趟.其中一些你可能已经知道了.

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

ENABLE_BITCODE选项会删除此最后一步.它使用IR bitcode二进制文件创建应用程序版本.这有许多不错的功能,但有一个巨大的缺点:它无法在任何地方运行.为了获得一个运行bitcode二进制文件的应用程序,bitcode需要重新编译(可能是组装或转码......我不确定正确的动词)到x86或ARM二进制文件中.

当bitcode应用程序提交到App Store时,Apple将执行此最后一步并创建完成的二进制文件.

目前,bitcode应用程序是可选的,但历史记录显示Apple将可选内容转换为需求(如64位支持).这通常需要几年时间,因此第三方开发人员(如Parse)有时间更新.

  • 我可以使用上述方法而不会产生任何负面影响并且不会影响未来的appstore提交吗?

是的,您可以关闭ENABLE_BITCODE,一切都会像以前一样工作.直到Apple将bitcode应用程序作为App Store的一项要求,你才会没事.

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

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

至于积极影响......那很复杂.

对于在App Store中的分发,Apple将为每个机器架构(arm6/arm7/arm7s/arm64)创建应用程序的单独版本,而不是一个带有胖二进制文件的应用程序.这意味着iOS设备上安装的应用程序将更小.

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

  • "Apple将为每个机器架构(arm6/arm7/arm7s/arm64)创建应用程序的单独版本,而不是一个带有胖二进制文件的应用程序.这意味着安装在iOS设备上的应用程序将更小." 这就是切片的作用.这与Bitcode无关. (13认同)
  • "ENABLE_BITCODE选项切断了最后一步." 它没有削减任何步骤.所有架构二进制文件仍然生成.然后为EACH架构添加PLUS bitcode信息.请参见http://stackoverflow.com/a/31030741/102008 (8认同)
  • 与禁用Bitcode时相比,启用Bitcode会使应用程序上安装的应用程序更小,这并不是一个真实的说法.没有任何地方可以这么说. (6认同)
  • @ onmyway133并非所有供应商都提供来源.如果所有供应商提供的是静态lib和头文件(或框架),那么供应商需要在启用bitcode的情况下编译他们的东西. (6认同)
  • 请参阅https://developer.apple.com/library/prerelease/watchos/documentation/IDEs/Conceptual/AppDistributionGuide/AppThinning/AppThinning.html"切片是为不同目标设备创建和提供应用包变体的过程. variant仅包含**可执行体系结构**和目标设备所需的资源." (5认同)
  • "永远不会对启用它产生负面的性能影响"是一个大胆的主张.也许它以这样一种方式进行优化,即它会导致热点中的缓存未命中或分支预测失败.虽然它不太可能对性能产生积极影响. (3认同)
  • @user102008 [“您上传到 iTunes Connect 的包含位码的应用程序将在 App Store 上进行编译和链接。”](https://developer.apple.com/library/prerelease/watchos/documentation/IDEs/Conceptual/AppDistributionGuide/ AppThinning/AppThinning.html)所以看起来切片是一种方式,而位码是另一种方式。这仍然是关于位码的真实陈述。 (2认同)
  • 这里非常丰富的(而且有些令人担心的)书面记录:https://medium.com/@FredericJacobs/why-im-not-enabling-bitcode-f35cd8fbfcc5#.gqwvu6av9 (2认同)

Gam*_*int 61

确保选择"全部"以查找启用bitcode构建设置:

构建设置

  • 最后一个屏幕截图(另外,为什么除非禁用位码,否则提交到商店不起作用......?) (4认同)

agy*_*agy 33

Bitcode是iOS 9的新功能

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

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

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


Ale*_*nin 31

Bitcode使崩溃报告更难.以下是HockeyApp的报价(对于任何其他崩溃报告解决方案也是如此):

将应用程序上传到App Store并启用"Bitcode"复选框时,Apple将使用该Bitcode构建并在将其分发到设备之前对其进行重新编译.这将导致二进制文件获得新的UUID,并且可以选择通过Xcode下载相应的dSYM.

注意:答案于2016年1月编辑,以反映最近的更改

  • 在9月和12月之间,此问题通过新的Xcode Organizer导出选项得以解决(请参见引用的HA howto中的更新),然后再次中断(请参阅我已解决的[HA问题](http://support.hockeyapp.net/discussions/problems / 50477-symbolicating-bitcode-enabled-appstore-app-have-the-dsyms-downloaded)) (2认同)

Eri*_*vic 21

Bitcode 从 XCode 14 Beta 中已弃用:

\n

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

\n
\n

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

\n

如果项目显式启用位码,Xcode 不再默认构建位码并生成警告消息: \xe2\x80\x9c 使用位码构建已被弃用。请更新您的项目和/或目标设置以禁用位码。\xe2\x80\x9d 使用位码构建的功能将在未来的 Xcode 版本中删除。包含位码的 IPA 将在提交到 App Store 之前删除位码。过去提交的位码的调试符号仍然可供下载。(86118779)

\n
\n

对于任何想了解位码的人来说,似乎不再需要它了。

\n


zsz*_*zen 11

@ vj9 thx.我更新到xcode 7.它向我显示了同样的错误.设置"否"后构建好

在此输入图像描述

设置"否"它运作良好.

在此输入图像描述


Rex*_*Rex 8

在这里,您可以找到有关Bitcode的所有解决方案

根据Apple Doc

Bitcode是编译程序的中间表示.您上传到iTunes Connect的包含bitcode的应用将在商店中进行编译和链接.包括bitcode将允许Apple在将来重新优化您的应用二进制文件,而无需向商店提交新版本的应用.

默认情况下,Xcode会隐藏在构建时生成的符号,因此Apple无法读取它们.只有在将应用程序上传到iTunes Connect时选择包含符号才会将符号发送给Apple.您必须包含符号才能从Apple接收崩溃报告.

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

Apple最初推出的bitcode和app thinning服务被搁置,因为从一种类型的硬件升级到另一种类型的硬件的问题没有恢复正确版本的二进制文件.此问题随后在iOS 9.0.2中得到修复,并且重新启用了该功能.

Bitcode一直是LLVM编译和优化阶段的一部分,但通过将后端逻辑移至Apple服务器,它将优化和组装阶段从开发人员编译时移至App Store部署.这为未来重新优化或重新转换提供了可能性,以支持未来更新更快的处理器.watchOS和tvOS deploments需要Bitcode部署,并且可以通过项目设置中的"Enable Bitcode"选项有条件地启用现有iOS部署.这将为调试版本添加一个标志embed-bitcode-marker,为存档/设备版本添加一个embed-bitcode.这些可以使用-embed-bitcode传递给Swift编译器,或者使用-ngmbed-bitcode传递给clang.

Bitcode也有一些缺点.开发人员可以通过存储与发送到Apple的二进制文件对应的调试符号的副本来调试应用程序的崩溃报告.当在给定堆栈中发生崩溃时,开发人员可以使用这些调试符号通过对崩溃报告进行符号化来恢复原始堆栈跟踪.但是,符号是将中间形式翻译成二进制形式的副产品; 但如果在服务器上完成该步骤,则此信息将丢失.Apple提供了一个崩溃报告服务,只要开发人员在应用程序发布时上传了调试符号,它就可以扮演调试器的角色.开发人员从未看到确切的二进制文件这一事实意味着他们可能无法在新硬件发展时测试特定问题.

最后,服务器上的bitcode可以转换为支持新的体系结构和指令集随着它们的发展而变化.如果它们维护调用约定和对齐和字的大小,则bitcode应用程序可以被转换为不同的体系结构类型并且专门针对新处理器进行优化.如果使用数学和向量例程的标准库,可以将这些库优化为处理器特定的向量指令,以获得给定应用程序的最佳性能.优化器甚至可以生成多种不同的编码,并根据大小或执行速度进行判断.

欲了解更多信息,请查看此处此处


vj9*_*vj9 6

文档

  • 我可以使用上述方法而不会产生任何负面影响并且不影响未来的应用商店提交吗?

Bitcode 将允许苹果优化应用程序,而无需提交另一个构建。但是,只有在应用程序包中的所有框架和应用程序都启用了此功能时,您才能启用此功能。拥有它有帮助,但没有它不应该有任何负面影响。

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

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

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

App Store 和操作系统通过根据用户特定设备的功能定制应用程序交付,以最小的占用空间来优化 iOS 和 watchOS 应用程序的安装。这种优化称为应用程序精简,可让您创建使用最多设备功能、占用最少磁盘空间并适应 Apple 可以应用的未来更新的应用程序。其他应用程序和内容的更快下载和更多空间提供了更好的用户体验。

不应该有任何性能影响。