聊一聊 Bitcode

2,231 阅读3分钟

2015 年起,苹果允许你可以选择是否在你的 iOS 应用或 SDK 上是否包含 Bitcode。为了消除大家对 Bitcode 的疑惑,我们来讨论以下几点:

什么是 Bitcode

想知道什么是 Bitcode,我们先来回顾下编译过程。编译器会在编译时将可读代码转为计算机或手机可执行的机器码。 编译过程有下面三个不同的步骤:

  1. 编译器前端将源代码转换成某种中间产物 Intermediate representation (IR)
  2. 优化器执行一个优化队列来对中间产物 (IR) 进行优化,使它变得更小更高效:移除冗余代码、对结果进行预先计算、内联代码等等。编译过程中的这个关键步骤使用的就是中间产物 (IR),而不是源代码或机器码,因为它更容易的被优化器来解释*(这句话我的意思可能表达的不太对,欢迎指正)*;
  3. 编译器后端会根据优化后的中间产物生成机器码。

所以当我们聊到 Bitcode,实际上是在说这种由 Clang 编译器使用的中间产物(或者更准确的来说,是这种编译器的中间产物在磁盘中的表现形式)。Clang 广泛使用在基于 LLVM 框架的 C/C++/Objective-C 语言家族的编译器上,它同样被苹果在 Xcode 中用来编译 iOSmacOS 应用。所以 Bitcode 并不是什么新奇的东西,因为它一直存在于 LLVM 框架的编译器中。

构建你的 Bitcode-enable 项目:

2015 年,苹果添加了是否在你的应用编译过程中嵌入 Bitcode 的选项。当禁用这个选项的时候,编译器只会生成包含机器码的可执行文件。 但如果选中了这个选项,Bitcode 会连同机器码一起被包含在可执行文件中。

当执行嵌入了 Bitcode 的应用,Bitcode 会被忽略,应用程序会以和运行普通可执行文件相同的方式来运行机器码。

苹果在嵌入 Bitcode 的时候做了什么?

为什么苹果会提供嵌入 Bitcode 的选项呢?答案是显而易见的。将 Bitcode 嵌入进可执行文件,苹果能在不通过开发者交互的情况下重编译应用。优点如下:

  1. 苹果在不断加强 Clang 编译器的优化,以便进一步提高 iOS 应用的性能。通过嵌入 Bitcode,苹果能使用最新的、升级过的编译器重编译应用。这将简化开发者更新他们的开发环境、重编译再到上传应用到 App Store 的这这一套流程。
  2. 嵌入 Bitcode,开发者能自动迁移他们的 App 到最新的设备上。嵌入 Bitcode 使苹果能够重新编译现有的应用程序,并使它们与新设备的芯片组兼容。

嵌入 Bitcode 安全么?是否有安全隐患?

嵌入 Bitcode 过程中的关键信息永远不会被发送到用户的手机上。苹果将 Bitcode 储存在其远端服务器上,并在需要的时候才会去使用它。换句话说,只用苹果能访问到该 Bitcode,用户不会体验到是否嵌入 Bitcode 前后 App 的区别,而且 Bitcode 从来没有离开过苹果的服务器。这是极其安全的。