DATE: 2019-6-14 Friday


前言

    LLVM是目前苹果采用的编译器工具链,Bitcode是LLVM编译器的中间代码的一种编码,LLVM的前端可以理解为C/C++/OC/Swift等编程语言,LLVM的后端可以理解为各个芯片平台上的汇编指令或者可执行机器指令数据,那么,BitCode就是位于这两者直接的中间码. LLVM的编译工作原理是前端负责把项目程序源代码翻译成Bitcode中间码,然后再根据不同目标机器芯片平台转换为相应的汇编指令以及翻译为机器码.这样设计就可以让LLVM成为了一个编译器架构,可以轻而易举的在LLVM架构之上发明新的语言(前端),以及在LLVM架构下面支持新的CPU(后端)指令输出,虽然Bitcode仅仅只是一个中间码不能在任何平台上运行,但是它可以转化为任何被支持的CPU架构,包括现在还没被发明的CPU架构,也就是说现在打开Bitcode功能提交一个App到应用商店,以后如果苹果新出了一款手机并CPU也是全新设计的,在苹果后台服务器一样可以从这个App的Bitcode开始编译转化为新CPU上的可执行程序,可供新手机用户下载运行这个App。

1、参考

深入理解iOS开发中的BitCode功能Bitcode

2、Bitcode使用说明

Bitcode is an intermediate representation of a compiled program. Apps you upload to iTunes Connect that contain bitcode will be compiled and linked on the App Store. Including bitcode will allow Apple to re-optimize your app binary in the future without the need to submit a new version of your app to the store.

苹果官方对Bitcode的评价描述是,Bitcode是被编译程序的一种中间形式的代码。包含Bitcode配置的程序将会在App store上被编译和链接。目的是为了减少App的安装包大小,使用户不必下载不适合自己系统的那部分资源。
当我们提交程序到App store上时,Xcode会将程序编译为一个中间表现形式(Bitcode)。然后App store会再将这个Bitcode编译为可执行的64位或32位程序。

3、苹果对bitcode的要求

目前,watchOS和tvOS应用发布必须上传带bitcode版本的包.iOS应用发布对bitcode的要求是可选的,用户可以在Xcode的项目设置中关闭. 相当于在编译的时候加一个标记:embed-bitcode-marker(调试构建) embed-bitcode(打包/真机构建).这个在clang编译器的参数是-fembed-bitcode,swift编译器的参数是-embed-bitcode.

4、Bitcode配置方法

在实际开发中,需要考虑的是四个平台:iOS,Mac OS,watchOS和apple tvOS。

  • 对应iOS,Bitcode是可选的。
  • 对于watchOS和TV OS,Bitcode是必须的。
  • Mac OS不支持Bitcode。

方法一: 更新library包含Bitcode,

CFLAGS+=-fembed-bitcode

否则会出现以下中的警告;

(null): URGENT: all bitcode will be dropped because '/Users/myname/Library/Mobile Documents/com~apple~CloudDocs/foldername/appname/GoogleMobileAds.framework/GoogleMobileAds(GADSlot+AdEvents.o)'
 was built without bitcode. You must rebuild it with bitcode enabled (Xcode setting ENABLE_BITCODE), obtain an updated library from the vendor, or disable bitcode for this target. Note: This will be an error in the future.

方法二: 关闭Bitcode,在”Build Settings”->”Enable Bitcode”选项中看到这个设置。


THE END!

ios分析编译器 ios上的编译器_IOS