我们在xcode工程Build Settings中的Architectures一栏可以看到诸如armv7,arm64字样的配置信息,这类配置信息在我们日常开发过程中究竟起到什么作用,查阅了相关资料后在此整理一下。
指令集
指令集是存储在CPU内部,对CPU运算进行指导和优化的硬程序。拥有这些指令集,CPU就可以更高效地运行。Intel主要有x86,EM64T,MMX,SSE,SSE2,SSE3,SSSE3 (Super SSE3),SSE4A,SSE4.1,SSE4.2,AVX,AVX2,AVX-512,VMX等指令集。AMD主要是x86,x86-64,3D-Now!指令集。
简单粗暴地理解下来就是指令集可以帮助CPU更高效地运行。
ARM处理器
上面没有提到的armv6|armv7|armv7s|arm64就属于ARM处理器的指令集。
ARM处理器是英国Acorn有限公司设计的低功耗成本的第一款RISC微处理器。全称为Acorn RISC Machine。ARM处理器本身是32位设计,但也配备16位指令集,一般来讲比等价32位代码节省达35%,却能保留32位系统的所有优势。
ARM处理器主要有这几个特点:
- 体积小、低功耗、低成本、高性能
- 支持Thumb(16位)/ARM(32位)双指令集,能很好的兼容8位/16位器件
- 大量使用寄存器,指令执行速度更快
- 大多数数据操作都在寄存器中完成
- 寻址方式灵活简单,执行效率高
- 指令长度固定
因此几乎所有手机处理器都基于ARM,当然我们使用的iPhone系列手机就是使用的ARM处理器,也就是为什么我们xcode中要配置应用使用的指令集。
armv6|armv7|armv7s|arm64都是ARM处理器的指令集,这些指令集都是向下兼容的,例如armv7指令集兼容armv6,只是使用armv6的时候无法发挥出其性能,无法使用armv7的新特性,从而会导致程序执行效率没那么高。
那么i386 | x86_64又是干嘛用的呢?
- i386:是针对intel通用微处理器32架构的
- x86_64:是针对x86架构的64位处理器
我们在mac上运行模拟器,由于模拟器没有指令集,它使用的是mac的处理器,所以i386|x86_64 是Mac处理器的指令集。
iOS设备所使用的指令集
指令集 | 设备型号 |
---|---|
arm64 | iPhone7,iPhone6s,iphone6s plus,iPhone6,iPhone6 plus,iPhone5S,iPad Air,iPad mini2(iPad mini with Retina Display) |
armv7s | iPhone5,iPhone5C,iPad4(iPad with Retina Display) |
armv7 | iPhone4,iPhone4S,iPad,iPad2,iPad3(The New iPad),iPad mini,iPod Touch 3G,iPod Touch4 |
armv6 | iPhone, iPhone2, iPhone3G, 第一代、第二代 iPod Touch(一般不需要去支持) |
指令集相关选项说明
打开xcode->Buiding Setting->Architectures可以对应用支持的指令集进行配置。
Architectures
指定工程被编译成可支持哪些指令集类型,而支持的指令集越多,就会编译出包含多个指令集代码的数据包,对应生成二进制包就越大,也就是ipa包会变大。
Valid Architectures
限制可能被支持的指令集的范围,也就是Xcode编译出来的二进制包类型最终从这些类型产生,而编译出支持哪种指令集的包,将由
Architectures
与Valid Architectures
的交集来确定。
比如Architectures设置为arm64 | armv7s | armv7,Valid Architectures设置为arm64 | armv7s,那么它最终生成的二进制包只支持armv7s指令集。
Build Active Architecture Only
设置是否只对当前连接设备所支持的指令集进行编译。当为YES时,只对当前连接设备所支持的指令集进行编译。当为NO时,会编译所有支持的指令集。
一般为了在debug环境能够编译的速度加快,可以设置为NO,当要release的时候设置为YES来适配不同的设备。
总结
- armv7s,armv7打包出来的代码是32位的,arm64打包出来的代码64位的。
- iPhone5s以前的机型(不包含5s)的cpu是32位的,之后的机型都是64位的。
- 设备会择优去选择更匹配的包,比如当工程配置为armv7,arm64,则包中会包含32位和64位两份代码,那么在iPhone5s设备下安装,会首选64位的代码包。
- 若工程配置为armv7打包出来的包是32位的,iPhone5s安装也会兼容,但是会降低性能。
- 支持arm64的系统版本最低为iOS6,如果要兼容更低版本的系统,需要配置armv7 | armv7s生成32位的包来适配。
- 我们在开发SDK打包成.a或.framework提供给他人用时,最好做到最大化的兼容,
ValidArchitectures
设置为:armv7|armv7s|arm64|i386|x86_64Architectures
设置为(可根据需要调整): armv7|arm64。