昨天我发现了很多关于parse.com库的警告:
紧急:所有bitcode都将被删除,因为'[path] /Parse.framework/Parse(PFAnalytics.o)'是在没有bitcode的情况下构建的。您必须在启用bitcode(Xcode设置ENABLE_BITCODE)的情况下重建它,从供应商处获取更新的库,或禁用此目标的bitcode。注意:将来这将是一个错误。
我知道我可以用this answer删除这些警告但现在想知道它是否会对AppStore提交和/或我的应用的实际性能产生任何负面影响。
Xcode告知您有关bitcode
的信息激活此设置表示目标或项目应在编译期间为支持它的平台和体系结构生成bitcode。对于存档构建,将在链接二进制文件中生成bitcode以提交到应用商店。对于其他构建,编译器和链接器将检查代码是否符合bitcode生成的要求,但不会生成实际的bitcode。 [ENABLE_BITCODE]
但是我没有从本文中获得任何真正有用的信息。
ENABLE_BITCODE
实际上做了什么,将来是否会成为非选择性要求?答案 0 :(得分:358)
- ENABLE_BITCODE实际上做了什么,将来是否会成为非选择性要求?
我不确定您在寻找答案的级别,所以让我们一趟。其中一些你可能已经知道了。
在构建项目时,Xcode为Objective-C目标调用clang
,为Swift目标调用swift
/ swiftc
。这两个编译器都将应用程序编译为intermediate representation(IR),其中一个IR是bitcode。从这个IR,一个名为LLVM的程序接管并创建x86 32和64位模式(用于模拟器)和arm6 / arm7 / arm7s / arm64(用于设备)所需的二进制文件。通常,所有这些不同的二进制文件都集中在一个名为fat binary的文件中。
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技术进行重新优化。
答案 1 :(得分:33)
Bitcode是iOS 9
的新功能Bitcode是编译程序的中间表示。您上传到iTunes Connect的包含bitcode的应用将在App Store上进行编译和链接。包括bitcode将允许Apple在将来重新优化您的应用二进制文件,而无需向商店提交新版本的应用。
注意:对于iOS应用,bitcode是默认设置,但是可选。如果您提供bitcode,则应用程序包中的所有应用程序和框架都需要包含bitcode。对于watchOS应用程序,需要bitcode
所以你应该禁用bitcode,直到你的应用程序的所有框架都启用了bitcode。
答案 2 :(得分:31)
Bitcode使崩溃报告更难。以下是HockeyApp的引用(对于任何其他崩溃报告解决方案也是如此):
将应用程序上传到App Store并离开" Bitcode"启用复选框后,Apple将使用该Bitcode构建并在将其分发到设备之前对其进行重新编译。这将导致二进制文件获得一个新的UUID,并且可以通过Xcode下载相应的dSYM。
注意:答案于2016年1月编辑,以反映最近的更改
答案 3 :(得分:11)
答案 4 :(得分:6)
在这里,您可以找到有关 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文件,如Viewing and Importing Crashes in the Devices Window中所述
苹果公司最初推出的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或使用-ngmbed-bitcode的clang传递给Swift编译器。
Bitcode也有一些缺点。开发人员可以通过存储与发送到Apple的二进制文件对应的调试符号的副本来调试应用程序的崩溃报告。当在给定堆栈中发生崩溃时,开发人员可以使用这些调试符号通过对崩溃报告进行符号化来恢复原始堆栈跟踪。但是,符号是将中间形式翻译成二进制形式的副产品;但如果在服务器上完成该步骤,则此信息将丢失。 Apple提供了一个崩溃报告服务,只要开发人员在应用程序发布时上传了调试符号,它就可以扮演调试器的角色。开发人员从未看到确切的二进制文件这一事实意味着他们可能无法在新硬件发展时测试特定问题。还有一些关于放弃Apple执行编译的能力 - 包括注入额外例程或代码片段的能力 - 但由于Apple完全控制了发布过程,因此无论开发人员是否使用bitcode或编译的二进制文件,这些都是可能的。
最后,服务器上的bitcode 可以转换为支持新体系结构和指令集的发展。如果它们维护调用约定和对齐和字的大小,则bitcode应用程序可以被转换为不同的体系结构类型并且专门针对新处理器进行优化。如果使用数学和向量例程的标准库,可以将这些库优化为处理器特定的向量指令,以获得给定应用程序的最佳性能。优化器甚至可以生成多种不同的编码,并根据大小或执行速度进行判断。
答案 5 :(得分:4)
来自docs
Bitcode将允许苹果优化应用,而无需提交其他版本。但是,如果应用程序包中的所有框架和应用都启用了此功能,则您只能启用此功能。 让它有所帮助,但没有它不会产生任何负面影响。
对于iOS应用,bitcode是默认设置,但是可选。如果你提供 bitcode,应用程序包中的所有应用程序和框架都需要包含 位码。对于watchOS应用程序,需要bitcode。
App Store和操作系统优化了iOS的安装 和appOS应用程序通过定制应用程序交付的功能 用户的特定设备,占用空间极小。这个优化, 称为app thinning,可让您创建使用最多设备的应用 功能,占用最少的磁盘空间,并适应未来的更新 这可以由Apple应用。更快的下载速度和更多的空间 其他应用和内容可提供更好的用户体验。
不应有任何性能影响。
答案 6 :(得分:0)
我是否可以使用链接的答案来规避该问题,而不会产生任何负面影响并且不影响未来的 AppStore 提交?
是的
<块引用>ENABLE_BITCODE 究竟有什么作用,将来会成为非可选要求吗?
ENABLE_BITCODE
将代码的中间表示添加到二进制中。对于 watchOS,tvOS 现在是强制性的
如果我启用/禁用它会对性能有任何影响吗?
当您归档项目
时,它会影响 Xcode 构建和内存占用