Xcode设置 Architectures和Valid Architectures

iPhone指令集

本文所讲的内容都是围绕iPhone的指令集(想了解ARM指令集的同学请点击这里),现在先说说不同型号的iPhone都使用的是什么指令集:

ARMv8/ARM64=iPhone5s,iPadAir,RetinaiPadMiniARMv7s=iPhone5,iPhone5c,iPad4ARMv7=iPhone3GS,iPhone4,iPhone4S,iPod3G/4G/5G,iPad,iPad2,iPad3,iPadMiniARMv6=iPhone,iPhone3G,iPod1G/2G

设置你想支持的指令集

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

Architectures

官方文档说明:

Space-separatedlistofidentifiers.Specifiesthearchitectures(ABIs,processormodels)towhichthebinaryistargeted.Whenthisbuildsettingspecifiesmorethanonearchitecture,thegeneratedbinarymaycontainobjectcodeforeachofthespecifiedarchitectures.

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

ValidArchitectures

官方文档说明:

Space-separatedlistofidentifiers.Specifiesthearchitecturesforwhichthebinarymaybebuilt.Duringthebuild,thislistisintersectedwiththevalueofARCHSbuildsetting;theresultinglistspecifiesthearchitecturesthebinarycanrunon.Iftheresultingarchitecturelistisempty,thetargetgeneratesnobinary.

该编译项指定可能支持的指令集,该列表和Architectures列表的交集,将是Xcode最终生成二进制包所支持的指令集。

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

BuildActiveArchitectureOnly

官方文档说明:

Booleanvalue.Specifieswhethertheproductincludesonlyobjectcodeforthenativearchitecture.

该编译项用于设置是否只编译当前使用的设备对应的arm指令集。

当该选项设置成YES时,你连上一个armv7指令集的设备,就算你的ValidArchitectures和Architectures都设置成armv7/armv7s/arm64,还是依然只会生成一个armv7指令集的二进制包。

当然该选项起作用的前提是你的Xcode必须成功连接了调试设备。如果你没有任何活跃设备,即Xcode没有成功连接调试设备,就算该设置项设置成YES依然还会编译ValidArchitectures和Architectures指定的二进制包。

通常情况下,该编译选项在Debug模式都设成YES,Release模式都设成NO。

说明

指令集都是可以向下兼容的

比如,你的设备是armv7s指令集,那么它也可以兼容运行比armv7s版本低的指令集:armv7、armv6

xcode对armv6指令集的支持

Xcode4.5起不再支持armv6,Xcode4.5的releasenotes中明确指出:

ChangesGeneral:iOSThisversionofXcodedoesnotgeneratearmv6binaries.12282156TheminimumdeploymenttargetisiOS4.3.12282166

如何选择支持的指令集

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

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

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

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

参考文档

目前ios的指令集有以下几种:

1,armv6,支持的机器iPhone,iPhone2,iPhone3G及对应的iTouch

2,armv7,支持的机器iPhone4,iPhone4S

3,armv7s,支持的机器iPhone5,iPhone5C

4,arm64,支持的机器:iPhone5S

机器对指令集的支持是向下兼容的,因此armv7的指令集是可以运行在iphone5S的,只是效率没那么高而已~

========================

Architecture:指你想支持的指令集。

Validarchitectures:指即将编译的指令集。

BuildActiveArchitectureOnly:只是否只编译当前适用的指令集。

========

现在是2014年初,其实4和4S的用户还是蛮多的,而iphone3之类的机器几乎没有了,所以我们的指令集最低必须基于armv7.

因此,Architecture的值选择:armv7armv7sarm64(选arm64时需要最低支持5.1.1,这块不太明白)

1,如果想自己的app在各个机器都能够最高效率的运行,则需要将BuildActiveArchitectureOnly改为NO,Validarchitectures选择对应的指令集:armv7armv7sarm64。这个会为各个指令集编译对应的代码,因此最后的ipa体积基本翻了3倍。(如果不在乎app大小的话,应该这样做)

2,如果想让app体积保持最小,则现阶段应该选择Validarchitectures为armv7,这样BuildActiveArchitectureOnly选YES或NO就无所谓了。

相关推荐