2015 年起,苹果允许你可以选择是否在你的 iOS 应用或 SDK 上是否包含 Bitcode
。为了消除大家对 Bitcode
的疑惑,我们来讨论以下几点:
什么是 Bitcode
?
想知道什么是 Bitcode
,我们先来回顾下编译过程。编译器会在编译时将可读代码转为计算机或手机可执行的机器码。
编译过程有下面三个不同的步骤:
- 编译器前端将源代码转换成某种中间产物 Intermediate representation (IR);
- 优化器执行一个优化队列来对中间产物 (IR) 进行优化,使它变得更小更高效:移除冗余代码、对结果进行预先计算、内联代码等等。编译过程中的这个关键步骤使用的就是中间产物 (IR),而不是源代码或机器码,因为它更容易的被优化器来解释*(这句话我的意思可能表达的不太对,欢迎指正)*;
- 编译器后端会根据优化后的中间产物生成机器码。
所以当我们聊到 Bitcode
,实际上是在说这种由 Clang 编译器使用的中间产物(或者更准确的来说,是这种编译器的中间产物在磁盘中的表现形式)。Clang 广泛使用在基于 LLVM 框架的 C/C++/Objective-C 语言家族的编译器上,它同样被苹果在 Xcode 中用来编译 iOS 和 macOS 应用。所以 Bitcode
并不是什么新奇的东西,因为它一直存在于 LLVM 框架的编译器中。
构建你的 Bitcode-enable 项目:
2015 年,苹果添加了是否在你的应用编译过程中嵌入 Bitcode
的选项。当禁用这个选项的时候,编译器只会生成包含机器码的可执行文件。
但如果选中了这个选项,Bitcode
会连同机器码一起被包含在可执行文件中。
当执行嵌入了 Bitcode
的应用,Bitcode
会被忽略,应用程序会以和运行普通可执行文件相同的方式来运行机器码。
苹果在嵌入 Bitcode
的时候做了什么?
为什么苹果会提供嵌入 Bitcode
的选项呢?答案是显而易见的。将 Bitcode
嵌入进可执行文件,苹果能在不通过开发者交互的情况下重编译应用。优点如下:
- 苹果在不断加强 Clang 编译器的优化,以便进一步提高 iOS 应用的性能。通过嵌入
Bitcode
,苹果能使用最新的、升级过的编译器重编译应用。这将简化开发者更新他们的开发环境、重编译再到上传应用到 App Store 的这这一套流程。 - 嵌入
Bitcode
,开发者能自动迁移他们的 App 到最新的设备上。嵌入Bitcode
使苹果能够重新编译现有的应用程序,并使它们与新设备的芯片组兼容。
嵌入 Bitcode
安全么?是否有安全隐患?
嵌入 Bitcode
过程中的关键信息永远不会被发送到用户的手机上。苹果将 Bitcode
储存在其远端服务器上,并在需要的时候才会去使用它。换句话说,只用苹果能访问到该 Bitcode
,用户不会体验到是否嵌入 Bitcode
前后 App 的区别,而且 Bitcode
从来没有离开过苹果的服务器。这是极其安全的。