美文网首页iOS 深度好文iOS底层原理
Xcode Architecture 选项属性理解

Xcode Architecture 选项属性理解

作者: 54番茄 | 来源:发表于2018-04-17 14:07 被阅读411次

    这里是设备对应的Achitectures指令集:

    ARM CPU的不同指令集 对应设备
    armv7 iPhone 3GS,iPhone4,iPhone 4s,iPad,iPad2,iPad3(The New iPad),iPad mini,iPod Touch 3G,iPod Touch4
    armv7s iPhone5, iPhone5C,iPad4,iPod5
    arm64 iPhone5s,iPhone6、7、8,iPhone6、7、8 Plus,iPhone X,iPad Air,iPad mini2(iPad mini with Retina Display),
    x86_64架构 模拟器64位处理器测试(Xcode 9目前IPhone类型编译出来的都是x86_64)
    i386架构 模拟器32位处理器测试

    Xcode的Achitectures设置

    Architectures:

    该编译选项指定了工程将被编译成支持哪些指令集,支持指令集是通过编译生成对应的二进制数据包实现的,如果支持的指令集数目有多个,就会编译出包含多个指令集代码的数据包,也就是最终编译的ipa包会变大。

    • “Build Setting”中将 “Architectures” 改成 “Standard Architectures ” 。使用 “standard architectures ” 参数 (最新版Xcode默认选项,可以写自己想要的指令集 ) , 则打的包里面有32位、64位两份代码, 在iPhone5s上(iPhone5s以及以上的iphone的cpu都是64位),会首选运行64位代码包, 其余的iPhone(其余iPhone都是32位的,iPhone5c也是32位), 只能运行32位包, 但是包含两种架构的代码包,只有在ios6以上系统运行。

    查看 Development Document:Architecture Types包含

    enum : unsigned int {
        kCFBundleExecutableArchitectureI386 = 0x00000007,   //Specifies the 32-bit Intel architecture.
        kCFBundleExecutableArchitecturePPC = 0x00000012,  //Specifies the 32-bit PowerPC architecture.
        kCFBundleExecutableArchitectureX86_64 = 0x01000007, //Specifies the 64-bit Intel architecture.
        kCFBundleExecutableArchitecturePPC64 = 0x01000012 //Specifies the 64-bit PowerPC architecture.
    };
    

    所以说:
    要发挥iPhone5s的64位性能,就要包含64位包,且系统最低要求ios6以上。 如果要兼容ios5以及更低的系统,只能打32位的包,系统都能通用,但是会丧失iPhone5s的性能。

    Valid Architectures:

    Valid Architectures 限制可能被支持的指令集范围。(Valid architectures 和 Architecture两个集合的交集为最终编译生成的版本)。
    例如:
    将Architectures支持arm指令集设置为:armv7、armv7s、arm64,对应的Valid Architectures的支持的指令集设置为:armv7s,那么此时,XCode生成二进制包所支持的指令集只有armv7s。

    大部分人都会被Architectures和Valid Architectures搞混淆。Valid Architectures表示的是你的项目所支持的处理器架构列表,是一个大的集合,而Architectures表示的是你的项目编译的时候最终生成的二进制文件包含的处理器架构集合。当然如果你的Architectures超出了Valid Architectures的范围,只能取Architectures和Valid Architectures的交集。

    根据向下兼容原则,目前市面上大部分32位iOS设备都支持armv7,而64位设备都支持arm64, 对样做即保证了高性能手机的运行性能不受影响,同时减小了生成包的大小,一举两得。

    Build Active Architecture Only:

    官方解释就是:是否只编译当前连接设备所支持的指令集。

          其实这个属性主要用在Debug的时候。根据字面意思,就是说只编译你当前连接设备(活跃状态)的处理器版本。这个属性不需要修改,Xcode的默认设置就是Debug为Yes,Release 为No。
          Debug模式设置为Yes,编译的时候只编译成当前连接设备的处理器版本,会大大缩短编译时间。Release的时候,需要设置成No,你要适配市面上大部分手机,如果Release你还设置成Yes,就要呵呵了,你生成的安装包只能安装在你当前连接设备的编译类型的手机上。当然,这也是你Release编译所花的时间要大大超过Debug的原因。

    向下兼容的概念:

    编译出的版本是向下兼容的,连接的设备的指令集匹配是由高到低(arm64 > armv7s > armv7)依次匹配的。
    例如:
          你设置此值为yes,用iphone4编译出来的是armv7版本的,iphone5也可以运行,但是armv6的设备就不能运行。 所以,一般debug的时候可以选择设置为yes,release的时候要改为no,以适应不同设备。
    (因为armv7s是在armv7后面,armv7可以了,armv7s也就同时可以了)

    总结:

    Build Active Architecture Only设置为NO的时候,会编译支持的所有的版本
    Build Active Architecture Only设置为YES的时候,是为在debug环境下速度更快,它只编译当前的architecture 版本。
    最新Xcode默认设置本就是debug为YES,release为NO,所以不要盲目更改默认配置。

    如何选择支持的指令集?

    如果你的软件对安装包大小非常敏感,可以减少安装包中的指令集数据包(arm64 > armv7s > armv7),而且这能达到立竿见影的效果。比如项目支持的指令集是armv7、armv7s、arm64,后来改成只支持armv7后,会比原来小了变小。

    自言:
    在我们开发过程中,应该好好了解一下Xcode中我们常用的配置作用,了解其作用才能更好的提高开发效率。

    相关文章

      网友评论

        本文标题:Xcode Architecture 选项属性理解

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