当苹果公司
推出Bitcode技术并使其成为watchOS和tvOS的强制性产品时,该公司似乎对根本为什么需要它的问题
不屑一顾 。 她只是模糊地说,它有助于自定义二进制文件并使用最新的编译器改进。
从那时起,Bitcode在watchOS顺利过渡到64位方面发挥了重要作用,开发人员甚至不必在目录中重新编译其应用程序。 Apple本身会自动执行此操作:所有应用程序都开始在Apple Watch Series 4上运行。您甚至可能没有注意到已经发生了迁移。
什么是位码? 好吧,带有小b的位代码是LLVM所使用的特定于体系结构的中间表示形式,带有大b的位代码是指一组函数,这些函数使您可以将此视图嵌入到Mach-O二进制文件中,并提供了可呈现此文件的机制在应用商店上。
位代码不像源代码那样灵活,但是它比嵌入式二进制文件灵活得多,带有用于编译器的元数据和注释。 实际上,您(或Apple)可以轻松地从应用程序中获取Bitcode Blob,然后将其重新编译为应用程序的完整功能副本。 从armv7切换到armv7s或从arm64切换到arm64e非常酷,这可以节省开发人员,因为他们每次Apple更换ARM芯片时都必须重新编译二进制文件。 苹果公司在OpenGL驱动程序中长期使用位码,因此可以针对各种GPU架构动态优化驱动程序。
我们已经看到Microsoft利用Xbox One上的静态重新编译功能,提供了对最初为Xbox 360编写的整个游戏库(在PowerPC下)的访问,而完全没有开发人员或源代码的访问。 而且没有像Bitcode这样的中介,从而简化了流程。
当然,ARM上的macOS鬼影已经徘徊了很多年。 许多人想知道这是否会使使用Bitcode移植应用程序变得更容易。 结果,他们达成共识,即Bitcode不适合在根本不同的架构(例如Intel和ARM)之间进行转换。
这没有说服我,所以我决定检查!
首先,我们需要在
Objective-C上使用Bitcode的简单测试应用程序; 通常仅在为App Store创建档案时才包含它,因此您需要强制将其包含在常规程序集中。 您可以使用
-fembed-bitcode
或自定义构建选项:
BITCODE_GENERATION_MODE = bitcode
照常为通用iOS设备或连接的设备创建一个二进制文件。 似乎Bitcode并未内置在arm64e程序集中(例如,如果您有A12设备),因此可以关闭Xcode设置“仅针对活动体系结构编译”,而直接针对arm64进行编译。
使用
ebcutil工具
,可以轻松地从已编译的二进制文件中检索所有
Bitcode对象。
ebcutil -a arm64 -e path/to/MyApp.app/MyApp
然后为Intel重新编译每个Bitcode对象。
for f in *; do clang -arch x86_64 -c -Xclang -disable-llvm-passes -emit-llvm -x ir -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk $f -o $fo; done
现在,我们将编译后的Blob链接回二进制文件。
clang -arch x86_64 -mios-version-min=12.0 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk *.o -o path/to/MyApp.app/MyApp
如果可行,现在我们有了原始arm64应用程序的x86版本! 从理论上讲,它可以直接放置在iOS模拟器窗口中,进行安装和启动。
这是一个非常重要的事实:
如果Intel和ARM平台包含Bitcode,则可以在它们之间静态传输二进制文件 。 确实有效!
更复杂项目的陷阱
似乎ARC使用了内置的汇编程序,因此,当您必须禁用ARC时,要从arm64传输到x86。
某些类型的块(例如完成处理程序)会使用不可接受的指令启动编译器。 如果出现X87错误,则可能是问题所在。
为什么选择Objective-C? 好吧,Swift在设计时就考虑了ARC。 我认为没有办法避免上述内联汇编程序,因此重新编译现在会失败。
让我们再迈出一步:我们
将使用marzipanify将这个Intel iOS应用程序转换为可与Marzipan一起使用的Mac程序。

很简单!
从理论上讲,这意味着Apple可以在Mac上从App Store运行任何iOS应用程序,而无需开发人员更新或重新编译其应用程序。
如果Mac从Intel切换到ARM芯片怎么办? 好的,正如您所看到的,借助Bitcode,它可以在无需开发人员帮助的情况下将所有支持Bitcode的应用程序转移到Mac App Store,因此从第一天开始就可以更换处理器。 这给了苹果更多的自由。 现在,您无需提前一年就宣布向新处理器的过渡,并且不再需要Rosetta之类的技术。
显然,我们还没有达到这一点:今天,Apple在Mac App Store中不包含适用于应用程序的Bitcode,而今天,Bitcode可能不适用于这种架构转换。 我将重点关注这两个因素,而不是苹果,并为macOS 10.15上的所有Marzipan应用启用Bitcode。