检测.a是否支持bitcode
| otool -l yourlib.a | grep bitcode
检测.framework是否支持bitcode
| otool -l yourlib.framework/yourdata | grep bitcode
返回结果有__bitcode字段说明是支持bitcode的
返回结果
| sectname __bitcode | sectname __bitcode | sectname __bitcode
检测对应架构是否支持bitcode
| otool -arch armv7 -l yourlib.a | grep bitcode
打印不为0都支持bitcode
| otool -arch arm64 -l test_arm64 | grep __bitcode | wc -l
是否支持LLVM
| otool -l yourlib.a | grep LLVM
理解LLVM
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.
bitcode 是被编译程序的一种中间形式的代码
。包含 bitcode 配置的程序将会在 App store 上被编译和链接。bitcode 允许苹果在后期重新优化我们程序的二进制文件,而不需要我们重新提交一个新的版本到 App store 上。
当我们提交程序到 App store 上时,Xcode 会将程序编译为一个中间表现形式(bitcode)。然后 App store 会再将这个 botcode 编译为可执行的64位或32位程序
。
Xcode 7 之后,我们新建一个 iOS 程序时,bitcode 选项默认是设置为 YES 的。我们可以在 ”Build Settings” -> ”Enable Bitcode” 选项中看到这个设置。
bitcode好处
可以为目标安装App的设备进行优化二进制,减小安装包的下载大小。以后新设计了新指令集的新CPU,可以继续从这份bitcode开始编译出新CPU上执行的可执行文件,以供用户下载安装.
bitcode不足
当应用程序奔溃后,开发者可以根据获取的的奔溃日志再配上上传到苹果服务器的二进制文件的调试符号表信息可以还原程序运行过程到奔溃时后调用栈信息,对问题进行定位排查.但是用了bitcode之后,用户安装的二进制不是开发者这边生成的,而是苹果服务器经过优化后生成的,其对应的调试符号信息丢失了,也就无法进行前面说的还原奔溃现场找原因了.