美文网首页iOS技术征服iOSIOS学习揽收
xcode基础配置详解之Architecture(一)

xcode基础配置详解之Architecture(一)

作者: 刀客传奇 | 来源:发表于2017-05-10 00:53 被阅读1989次

    版本记录

    版本号 时间
    V1.0 2017.05.09

    前言

    xcode有很多基础配置,这里很杂很细,需要大家很细心的注意,并不难,但是这里的基础配置的设置无疑又非常重要。下面我们说一下Architecture的配置。

    详述

    Architecture的配置

    我们先看一下要配置的地方,先看一下下面这个图示,下面会深入的讲解这些参数的配置情况。

    Architecture的配置

    架构介绍

    大家已经知道了架构涉及到armv7,armv7s,i386, x86_64, arm64这些配置,下面我们先说一下这些参数都是做什么的。这些都是架构,是ARM处理器的指令集,那么什么是ARM?ARM其实就是硬件结构,用于相关处理和计算,类似电脑主板上的cpu。手机的操作系统能运行就是因为有ARM做支持。但是ARM也有很多型号,工艺也不同,运行速率也有差别。这里面armv7.armv7s,arm64都是ARM处理器的指令集,i386,x86_64是mac的指令集。

    支持的设备

    • 支持arm64:iphone6 | iphone6s | iphone 6 plus | iphone 6s plus | iphone5S | ipad Air | ipad nimi2 (ipad with Retina Dispaly)。
    • 支持armv7s: iphone 5C | iphone5 | ipad4(iPad with Retina Dispaly)
    • 支持armv7 : iphone4 | iphone 4S | ipad | ipad2 | ipad3 | ipad mini | ipad touch 3G | ipad Touch4
    • 支持i386: 是针对intel微处理器的32位处理器。
    • 支持x86_64 是针对x86架构的64位处理器。

    需要说明的是:

    • 模拟器32位处理器测试需要i386架构。
    • 模拟器64位处理器测试需要x86_64架构。
    • 真机32位处理器需要armv7或者armv7s架构。
    • 真机64位处理器需要arm64架构。

    配置参数说明

    1. Architectures

    指定工程被编译成支持哪些指令集类型,而支持的指令集越多,就会编译出很多个指令集代码的数据包,对应生成二进制包就越大,也就是ipa包越大。

    2. Valid Architectures

    限制可能被支持指令集的范围,就是xcode编译出来的二进制包类型最终从这些类型产生,而编译出哪些指令集的包,将由Architectures与Valid Architectures这些交集来确定。

    3. Build Active Architecture Only

    指定是都只对当前连接设备所支持的指令集编译,当设置为YES时,是为了debug编译的速度更快,它只会编译当前的architecture版本,当设置为NO时,会编译所有的版本,所以一般debug设置为YES,release设置为NO,以适应不同设备。

    配置参数举例

    例1:

    比如 Valid Architectures设置的支持arm指令集版本有:armv7/armv7s/arm64,对应的Architectures设置的支持arm指令集版本有:armv7s,这时Xcode只会生成一个armv7s指令集的二进制包。

    例2:

    将Architectures支持arm指令集设置为:armv7,armv7s,对应的Valid Architectures的支持的指令集设置为:armv7s,arm64,那么此时,XCode生成二进制包所支持的指令集只有armv7s

    例3:

    Architectures: armv7, armv7s, arm64
    ValidArchitectures: armv6, armv7s, arm64
    生成二进制包支持的指令集: arm64

    例4:

    Architectures: armv6, armv7, armv7s
    Valid Architectures: armv6, armv7s, arm64
    生成二进制包支持的指令集: armv7s

    例5:

    Architectures: armv7, armv7s, arm64
    Valid Architectures: armv7,armv7s

    这种情况是报错的,因为允许使用指令集中没有arm64。

    结论:使用 standard architectures (including 64-bit)(armv7,arm64) 参数,则打的包里面有32位、64位两份代码,在iPhone5s( iPhone5s的cpu是64位的 )下,会首选运行64位代码包, 其余的iPhone( 其余iPhone都是32位的,iPhone5c也是32位 ),只能运行32位包,但是包含两种架构的代码包,只有运行在ios6以上的系统上。

    而使用 standard architectures (armv7,armv7s) 参数, 则打的包里只有32位代码, iPhone5s的cpu是64位,但是可以兼容32位代码,即可以运行32位代码。但是这会降低iPhone5s的性能。 其余的iPhone对32位代码包更没问题, 而32位代码包,对系统也几乎也没什么限制。

    所以:

    要发挥iPhone5s的64位性能,就要包含64位包,那么系统最低要求为ios6。 如果要兼容ios5以及更低的系统,只能打32位的包,系统都能通用,但是会丧失iPhone5s的性能。当然这样做会使部分设备出现性能损失,当然在普通应用中这点体现几乎感觉不到,至少不会威胁到用户体检。

    静态库的制作

    制作静态库.a是指令集选择。如何制作一个“没有问题”的.a静态库,通过以上信息了解到,当我们做App的时候,为了追求高效率,并且减小包的大小,Build Active Architecture Only设置成YES,Architectures按Xcode默认配置就可以,因为arm64向前兼容。但制作.a静态库就不同了,因为要保证兼容性,包括不同iOS设备以及模拟器运行不出错,所以结合当前行业情况,要做到最大的兼容性。

    ValidArchitectures设置为:armv7|armv7s|arm64|i386|x86_64 
    Architectures设置不变(或根据你需要):  armv7|arm64
    
    

    然后分别选择iOS设备和模拟器进行编译,最后找到相关的.a进行合包,使用lipo -create 真机库.a的路径 模拟器库.a的的路径 -output 合成库的名字.a。

    参考文章

    1.iOS 中的 armv7,armv7s,arm64,i386,x86_64 都是什么

    2.iOS开发~制作同时支持armv7,armv7s,arm64,i386,x86_64的静态库.a

    后记

    已经很晚了,休息,明晚不见不散~~~

    椰林海风

    相关文章

      网友评论

      • 小_菜_鸟:楼主 我亲自测试发现实例3 4有问题
        应该就是交集 不是你写的某一个!
        刀客传奇:@小_菜_鸟 谢谢指正,晚点我修改下
      • David_fx:可以更新啦, 8,8p , X
      • 无星灬:你好,我有几点没看明白,不知lz能否解惑。Architecture(我就简写A了)Valid Architectures(我就简写VA了)
        1.“编译出哪些指令集的包,将由Architectures与Valid Architectures这些交集来确定。”那为啥在例子3,4中只包含一个arm7s,交集不止这一个啊。
        2.A与VA是什么关系,父子关系还是兄弟关系?父子关系很明显例子1,2,3,4不符合。兄弟关系的话为什么例子5会报错?
        希望lz能为我解惑。谢谢楼主大大~
        刀客传奇:@无星灬 交集要参考最高架构指令集,不是完全包含吧
        无星灬:@刀客传奇 那有关交集的问题呢,楼主你是咋理解的
        刀客传奇:按照我的理解就是A中的最高架构不允许在VA中不出现。

      本文标题:xcode基础配置详解之Architecture(一)

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