首页 文章

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

提问于
浏览
203

昨天我认识到有关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]

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

  • 我是否可以使用链接的答案来规避问题而不会产生任何负面影响并且不会影响未来的AppStore提交?

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

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

7 回答

  • 10

    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技术进行重新优化 .

  • 33

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

    Build settings

  • 337

    Bitcode是iOS 9的新功能

    Bitcode是编译程序的中间表示 . 您上传到iTunes Connect的包含bitcode的应用将在App Store上进行编译和链接 . 包括bitcode将允许Apple在未来重新优化您的应用二进制文件无需向商店提交新版本的应用程序 . 注意:对于iOS应用程序,bitcode是默认设置,但是可选 . 如果您提供bitcode,则应用程序包中的所有应用程序和框架都需要包含bitcode . 对于watchOS应用程序,需要bitcode

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

  • 4

    Bitcode makes crash reporting harder . 以下是HockeyApp的引用(对于任何其他崩溃报告解决方案也是如此):

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

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

  • 30

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

    enter image description here

    设置“否”它运作良好 .

    enter image description here

  • 59

    在这里你可以找到关于 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和应用程序细化服务已暂停,因为升级时出现问题从一种类型的硬件到不同类型的硬件没有恢复正确版本的二进制文件 . 此问题随后在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提供了一个崩溃报告服务,只要开发人员在应用程序发布时上传了调试符号,它就可以扮演调试器的角色 . 开发人员从未看到确切的二进制文件这一事实意味着他们可能无法在新硬件发展时测试特定问题 . 还有一些关于放弃Apple执行编译的能力 - 包括注入额外例程或代码片段的能力 - 但由于Apple完全控制了发布过程,因此无论开发人员是否使用bitcode或编译的二进制文件,这些都是可能的 . . 最后,服务器上的bitcode可以转换为支持新的体系结构和指令集随着它们的发展而变化 . 如果它们维护调用约定和对齐和单词的大小,则bitcode应用程序可能会被转换为不同的体系结构类型并进行优化专门针对新处理器 . 如果使用数学和向量例程的标准库,可以将这些库优化为处理器特定的向量指令,以获得给定应用程序的最佳性能 . 优化器甚至可以生成多种不同的编码,并根据大小或执行速度进行判断 .

    欲了解更多信息,请检查HereHere

  • 6

    来自docs

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

    Bitcode将允许苹果优化应用程序,而无需提交其他版本 . 但是,如果应用程序包中的所有框架和应用都启用了此功能,则您只能启用此功能 . 让它有所帮助,但没有它不会产生任何负面影响 .

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

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

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

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

    不应该有任何性能影响 .

相关问题