Xcode的Architecture设置?armv6、armv7

作者: 随心吧 | 来源:发表于2017-04-06 19:03 被阅读1319次
    ARM处理器指令集
    • 苹果模拟器指令集:

    |指令集|分析|
    |---|----|---|
    |i386|针对intel通用微处理器32架构的|
    |x86_64|针对x86架构的64位处理器|
    i386x86_64 是Mac处理器的指令集,i386是针对intel通用微处理器32架构的。x86_64是针对x86架构的64位处理器。

    模拟器并不运行arm代码,软件会被编译成x86可以运行的指令。所以生成静态库时都是会先生成两个.a,一个是i386的用于在模拟器运行,另一个是在真实设备上运行的,然后再用命令将两个.a合并成一个(1+1=1)。

    • 苹果设备指令集相关
    位数 指令集
    32ARM armv6armv7armv7s
    64ARM arm64armv8
    苹果A7处理器支持两个不同的指令集:32位ARM指令集(armv6|armv7|armv7s)和64位ARM指令集(`arm64 armv8`)。
    指令集 支持设备
    armv6 设备 iPhone, iPhone2, iPhone3G; <br /> <br />第一代、第二代 iPod Touch
    armv7 设备 iPhone3GS, iPhone4, iPhone4S; <br /> </br> iPad, iPad2, iPad3(The New iPad), iPad mini; </br> iPod Touch 3G, iPod Touch4
    armv7s设备 iPhone5, iPhone5C, <br /><br />iPad4(iPad with Retina Display)
    ARMv8/arm64设备 iPhone5S,iPhone6s(plus)iPhoneSEiPhone7(plus)<br /><br /> iPad Air, iPad mini2(iPad mini with Retina Display)
    • 苹果模拟器设备指令集总结
    模拟器 设备
    x86 <br />(i386x86_64 arm<br />(armv6armv7armv7sarmv8armv64

    当使用iOS模拟器的时候会遇到i386x86_64,iOS模拟器没有arm指令集,编译运行的是x86指令集,所以,只有在iOS设备上,才会执行设备对应的arm指令集

    XCode中与指令集相关

    XCode中关于生成二进制包指令集相关的设置项有以下个:

    图.xcode设置
    Xcode设置项 定义 注意事项
    Architecture 指你支持的指令集<br /><br /> 该选项指定了工程将被编译成支持哪些指令集。<br /><br />如果支持的指令集数目有多个,就会编译出包含多个指令集代码的数据包,从而会造成最终编译生成的包很大
    Valid architectures 即将编译的指令集 该选项指定可能支持的指令集,该Valid architectures列表Architectures列表交集,将是Xcode最终生成二进制包所支持的指令集<br /><br />限制可能被支持的指令集的范围<br /><br />例如:<br />Valid Architectures设置的支持arm指令集有:armv7/armv7s/arm64,对应的Architectures设置的支持arm指令集有:armv7s,这时Xcode只会生成一个armv7s指令集的二进制包
    Build Active Architecture Only 该编译项用于设置是否只编译当前使用的设备对应的arm指令集 使用条件:<br />①其值设置为YES;<br />②XCode成功连接调试设备;<br />(必须同时满足才会起作用)<br /><br />Xcode中设置:<br />①设置为Yes, 编译速度更,它只编译当前的architecture版本;<br />②设置为No,编译速度更会编译所有的版本<br />例如:<br />当该选项设置成YES时,你连上一个armv7指令集的设备(iPhone5、5c),就算你的Valid ArchitecturesArchitectures都设置成armv7/armv7s/arm64,还是依然只会生成一个armv7指令集的二进制包。
    假定:我们将Build Active Architecture Only值设置为YES,同时Xcode连接上手机iPhone5S匹配指令集arm64)。如下五种情况总结如下表:
    情况 Architectures ValidArchitectures 结果 分析
    情况① armv7、
    armv7s
    arm64
    armv6、
    armv7s
    arm64
    arm64 因为:<br />取交集arm64armv7s,但iPhone5S匹配指令集arm64,<br /><br />所以:<br />为arm64
    情况② armv6
    armv7、
    armv7s
    armv6
    armv7s
    arm64
    armv7s <br />因为:<br />取交集armv6armv7s,但iPhone5S匹配指令集arm64,但同时支持armv7s,同时XCode4.5开始,就再支持armv6指令集<br /><br />所以:<br />为arm64
    情况③ armv6
    armv7
    armv6、
    armv7s、
    arm64
    armv7 无交集。<br /><br />但是因为:ValidArchitectures支持armv7s则必然支持armv7,Architectures支持armv7,从XCode4.5开始,就再支持armv6指令集。<br /> <br />所以:<br />最终生成二进制指令集armv7
    情况④ armv6 armv6、
    armv7s、
    arm64
    <br />无响应 虽然编译成功了,但是并没有任何目标生成。<br /> 因为从XCode4.5开始,就再支持armv6指令集,所以列表中写了也是白写。
    情况⑤ armv7、
    armv7s、
    arm64
    armv7、
    armv7s
    error报错 生成二进制包支持的指令集编译出错error信息:

    No architectures to compile for (ONLY_ACTIVE_ARCH=YES, active arch=arm64, VALID_ARCHS=armv7
    • 分析
    • Build Active Architecture Only起作用时:连接的手机指令集匹配是由高到低(arm64 > armv7s > armv7)依次匹配的。
    • 指令集都是可以向下兼容
      比如,你的设备是armv7s指令集,那么它也可以兼容运行比armv7s版本低的指令集:armv7、armv6
      xcodearmv6指令集的支持
    • Xcode4.5再支持armv6
    如何选择支持的指令集

    如果你的软件对安装包大小非常敏感,你可以减少安装包中的指令集数据包,而且这能达到立竿见影的效果。

    很久前xcode支持的指令集是armv7/armv7s,后来改成只支持armv7后,比原来小了10MB左右。目前AppStore上的一些知名应用,比如百度地图、腾讯地图通过反汇编工具查看后,也都只支持armv7指令集。

    根据向下兼容原则,armv7指令集的应用是可以正常在支持armv7s/arm64指令集的机器上运行的。

    不过对于armv7s/arm64指令集设备来说,使用运行armv7应用是会有一定的性能损失,不过这种损失有多大缺乏权威统计数据,不会影响用户体验的。

    建议:Valid Architectures通常Debug模式设置值为YesRelease模式设置为No
    参考链接:

    1.armv6, armv7, armv7s的区别
    2.Apple移动设备处理器指令集 armv6、armv7、armv7s及arm64
    3.Xcode设置项之Architectures和Valid Architectures
    4.iOS工程如何支持64-bit

    相关文章

      网友评论

        本文标题:Xcode的Architecture设置?armv6、armv7

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