美文网首页iOS开发
Bitcode 在 Xcode 中的深入浅出(一)

Bitcode 在 Xcode 中的深入浅出(一)

作者: 简书_show | 来源:发表于2018-01-28 22:57 被阅读0次

    首先,bitcode 是什么呀?

    它其实是被编译程序的一种中间形式代码,而且是跟 iOS、Xcode 脱离不了关系的一种二进制表示形式。它通过 LLVM 编译器(LLVM 是目前苹果采用的编译器工具链)将 C/C++/OC/Swift 等前端编程语言编译成多种不同芯片上的机器指令过程中的中间代码,而且与 CPU 无关。

    虽然 bitcode 仅仅只是一个中间码,它不能在任何平台上运行,但是它可以转化为任何被支持的 CPU 架构。任何被支持的,包括未被发明的 CPU 架构,打开 bitcode 提交到 App Store 的 App,若苹果将 CPU 全新设计的、新出的一款手机,在苹果后台服务器一样可以从该 App 的 bitcode 开始编译转化为新 CPU 上的可执行程序,供新手机用户下载运行。

    在 Xcode 中,相对 iOS,bitcode是可选的;相对 watchOS 和 tvOS,bitcode 是必须的;而 Mac OS,则是不支持 bitcode 的。

    很显然,WatchOS 和 Mac OS 苹果没有给你选择的权利,为什么苹果要这么做呢?因为把 bitcode 上传到苹果的中心服务器后,原本包含多种支持 CPU 架构代码的 App,苹果可以动态生成相应 CPU 的 App 版本,为安装 App 的设备进行优化二进制,减小安装包的下载大小。最重要的是允许苹果可以在后台服务器对应用程序进行签名,而不用导出任何密钥到终端开发者那。

    另外,最大的好处就是,以后设计了新指令集的新 CPU,可以继续从这份 bitcode 开始编译出新CPU 上执行的可执行文件,来供用户下载安装。

    而 bitcode 对开发者的工作也有一定的影响,bitcode 为 NO 时,应用程序奔溃后,可以根据获取的的奔溃日志,再加上上传到苹果服务器的二进制文件的调试符号表信息,可以来还原程序运行过程到奔溃后调用栈的信息,相对问题的定位排查有一定帮助。而 bitcode 设置为 YES 后,用户安装的二进制是苹果服务器经过优化后生成的,信息丢失了,也就无法排障了。

    所以在 iOS 开发时,工程是否需要支持 bitcode 还是要权衡的。经常使用各种第三方的人,若工程需要支持 bitcode,则必须要求所有引入的第三方库都支持 bitcode。而在开发第三方的开发者则需要决定 bitcode 的属性,从而决定是否影响使用者。

    不知道大家是否有遇到过关于 bitcode 的问题,今天列举一个如下图中的问题例子,简单阐述下这类问题的解决方案。

    报错信息

    第一步: 重启 Xcode 的,打开后再 clean 下 Xcode,以防奇怪报错;

    第二步:修改 Build Settings -> Enable Bitcode 选项的属性值 YES/NO;

    第三步:修改 Build Settings -> Build Active Active Architecture Only 设置 Debug 或 Release 的 YES/NO;

    第四部:打开 Xcode 找到 Products 文件夹里的 .app 文件,点击 show in Finder 选择三栏显示模式 -> 往前滑找到 DerivedData 文件夹, 删除 ;

    第五步:在 Build Settings -> Custom Compiler Flags,加 -fembed-bitcode

    如果还是没有解决,只能使用第六步了。

    第六步:再编译下,看看是不是其他的问题吧,应该不关 bitcode 的事~

    Bitcode 在 Xcode 中的深入浅出(二),继续聊聊关于 bitcode 的故事吧。

    参考文章:

    1)http://www.cnblogs.com/rayshen/p/5646182.html

    2)http://blog.csdn.net/helloworld183/article/details/78249127

    3)https://www.jianshu.com/p/e9729a78d1f1

    相关文章

      网友评论

        本文标题:Bitcode 在 Xcode 中的深入浅出(一)

        本文链接:https://www.haomeiwen.com/subject/enebaxtx.html