Xcode7新特性之bitcode


    起因:原本正常编译运行的iOS工程,当升级为Xcode7之后编译通不过了,产生如下的链接错误:


         


    原来是OpenCV库出了问题,等等,bitcode是什么鬼?以前咋没听过,在经过与度娘多次交涉之后终于有点明白了。

    我们知道,计算机软件必须要经过编译和链接过程,生成可执行代码之后才能够在设备上运行,要想弄明白bitcode是什么,就需要从编译器入手。

    传统的静态编译器工作过程可分为三个阶段:前端、优化和后端。


         


    而iOS代码使用的编译器是LLVM(关于LLVM后面会有专门的文章详细介绍),LLVM的三个阶段如下图所示:


          

 

    由上图可以看出,LLVM编译生成中间码IR(Intermediate Representation),而非目标代码,这里所说的中间码IR就是我们想要知道的bitcode。


    使用中间码有以下三个优点:


    1. 如果需要支持一种新的编程语言,只需要实现一种新的前端;
    2. 如果需要支持一种新的硬件,只需要实现一种新的后端;
    3. 无论增加对新语言的支持,还是增加对新硬件的支持,中间的优化阶段都不需要改变;


    这样就实现了前后端的分离。


    由于上述优点,中间码已经被越来越多的编译器所采用,传统的编译器多采用汇编语言作为自己的中间语言,而现在大一些的编译器都有了自己专属的中间码。


    弄明白了bitcode是何方神圣之后,错误原因就不难找出:
    Xcode 7要求提交到AppStore的代码必须包含中间码(bitcode),而OpenCV属于第三方库,是之前从官网下     载的,在编译时并没有生成bitcode,所以链接时候找不到OpenCV的bitcode,因而报错。


    So,原因找到了,解决方法就比较容易想到:


    1. 从OpenCV官网下载源码,重新编译OpenCV,编译时开启bitcode支持;
    2. 从官网下载最新版的OpenCV的Framework,看是否已经支持了bitcode;
    3. 直接关闭Xcode中的bitcode项(打开Xcode,将BuildSettings->Build Options->Enable Bitcode的值设置为No);


    很显然,方法3最为简单,直接关闭bitcode,即提交应用到AppStore时不提交该应用的bitcode


    庆幸的是,关于bitcode,目前,Apple对三个平台的要求是不同的:


    1. Mac OS X 不支持bitcode
    2. watchOS 必须支持bitcode
    3. iOS 对于bitcode的支持是可选的


    也就是说,对于iOS应用来说,至少目前,可以提交bitbode也可以不提交。


    到此,问题已经解决,然而,从问题的背后,我们 又能看出些什么呢?Apple为什么要求开发者提交bitcode呢?动机何在?


    Bitcode本质上是一种中间语言,这种中间语言无法在任何平台上运行,但是却可以转化成任何被支持的 CPU 架构,包括在应用提交到应用商店之前还没有推出的架构。根据这一特性,bitcdoe支持Apple对已经提交到AppStore的应用进行编译优化,也支持AppStore增加支持新的CPU架构而无需用户重新提交应用,由此可以看出,bitcode能够让苹果更加容易选择他们想要使用的CPU架构,不管是ARM或者其他架构,证明未来在产品的开发上苹果会坚持自主开发的芯片组,包括 Apple Watch 中使用的芯片。虽然目前 Apple Watch 中使用的S1芯片可能不是最好的 CPU,但是已经足够在目前的 Apple Watch 上使用了。自然苹果是会推出 S1 的升级产品,但是即使新的平台出现,目前Watch已经支持的应用也不会受到影响,开发者不需要就苹果的新硬件重新提交应用。如果我们看得更远一些,未来即使S3 CPU变得“更加疯狂”,苹果编译工程需要做的就是在 App Store 中安装新的 LLVM 后端,剩下的就让 Bitcode 来解决。同样,iOS 也会获得支持,这就意味着对开发者来说 iPhone CPU 和应用的未来变得更加光明,未来即使苹果发布新的硬件产品,他们需要针对新设备做的工作变得更好。


    字节码(也是一种中间码)使得Java程序可以不加修改的在多种平台上运行,然而Java虚拟机边解释边执行的特性降低了程序运行的速度,虽然提高了跨平台性,却也牺牲了速度。

    而Apple的bitcode将“解释”的工作交给了AppStore,AppStore将bitcode优化并转化成各个支持的平台的可执行代码,设备从AppStore下载到的就是自己能够执行的App代码,能够直接运行。而对于开发者而言,对于LLVM前端而言,这些工作都是不可见的,他们看到是一个跨平台的App,是一个没有被降低执行速度和性能的App。


    关于Bitcode更多的信息,可以查询LLVM官方文档《LLVM Bitcode File Format》。



参考:

    1. LLVM每日谈之二LLVM IR

    2. 苹果Bitcode将能够预测公司未来CPU计划






  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
为了实现自动化配置Xcode工程的签名证书和bitcode开关,我们可以使用Python语言和XcodeProject库。以下是一个简单的示例程序,可以自动配置Xcode工程的签名证书和bitcode开关: ```python import XcodeProject #设置文件路径和签名证书信息 project_path = '/path/to/project' signing_identity = 'iPhone Distribution: Company Name' provisioning_profile = '/path/to/provisioning/profile.mobileprovision' #读取工程文件 project = XcodeProject.load(project_path) #修改签名证书信息 for target in project.targets: for configuration in target.buildConfigurations: configuration.buildSettings['CODE_SIGN_IDENTITY'] = signing_identity configuration.buildSettings['PROVISIONING_PROFILE_SPECIFIER'] = provisioning_profile #修改bitcode开关 for target in project.targets: for configuration in target.buildConfigurations: configuration.buildSettings['ENABLE_BITCODE'] = 'NO' #保存修改后的工程文件 project.save() ``` 这段程序首先设置了Xcode工程文件的路径和签名证书信息。然后使用XcodeProject库读取了Xcode工程文件,遍历每个target和build configuration,查找并修改了签名证书和bitcode开关。最后,将修改后的工程文件保存回原始文件中。 请注意,这仅是一个示例程序,实际的自动化配置功能可能需要更多的细节处理和错误处理。此外,由于Xcode project的配置文件格式较为复杂,需要进行一定的了解和研究才能进行自动化配置。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值