Leon’s Blog

Dreams don't work unless you do.

armv6,armv7,armv7s,arm64,i386,x86_64

我们在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编译出来的二进制包类型最终从这些类型产生,而编译出支持哪种指令集的包,将由ArchitecturesValid 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_64 Architectures设置为(可根据需要调整): armv7|arm64。