相关概念:
-
ARM
ARM处理器,特点是体积小、低功耗、低成本、高性能,所以几乎所有手机处理器都基于ARM,在嵌入式系统中应用广泛。 -
ARM处理器指令集
armv6|armv7|armv7s|arm64都是ARM处理器的指令集,这些指令集都是向下兼容的,例如armv7指令集兼容armv6,只是使用armv6的时候无法发挥出其性能,无法使用armv7的新特性,从而会导致程序执行效率没那么高。这也是armv7的指令集是可以运行在iphone5S的原因
还有两个我们也很熟悉的指令集:i386|x86_64 是Mac处理器的指令集,i386是针对intel通用微处理器32架构的。x86_64是针对x86架构的64位处理器。所以当使用iOS模拟器的时候会遇到i386|x86_64,iOS模拟器没有arm指令集。
ios的常用指令集:
- armv6 支持的机器iPhone,iPhone2,iPhone3G及对应的iTouch
- armv7 支持的机器iPhone4,iPhone4S
- armv7s 支持的机器iPhone5,iPhone5C
- arm64 支持的机器iPhone5S
- armv8 支持机器 iPhone5S ,iPad5(iPad Air), iPad Mini 2(iPad Mini Retina)
- i386 ,x86_64 Mac处理器指令集,适用于模拟器
相关设置说明:
Architecture : 指你想支持的指令集。表示我们想让自己的程序支持的处理器类型,考虑到生成的包的大小,我们可能要选择几个支持的类型,而不是全部都支持。
Valid architectures : 指即将编译的指令集。表示我们的工程支持的处理器类型,因为有的时候工程可能依赖于外界因素导致程序不是所有的处理器都支持,比如使用了非开源的库,而那个库只支持部分处理器类型。
Build Active Architecture Only : 是否只编译当前适用的指令集。这个属性设置为yes,是为了debug的时候编译速度更快,它只编译当前的architecture版本,而设置为no时,会编译所有的版本。 编译出的版本是向下兼容的,连接的设备的指令集匹配是由高到低(arm64 > armv7s > armv7)依次匹配的。比如你设置此值为yes,用iphone4编译出来的是armv7版本的,iphone5也可以运行,但是armv6的设备就不能运行。 所以,一般debug的时候可以选择设置为yes,release的时候要改为no,以适应不同设备。
Architectures
当我们Archive准备发布应用的时候,Xcode会取Valid Architectures和Architectures的交集,生成最后的包。支持的指令集越多,就会编译出包含多个指令集代码的数据包,对应生成二进制包就越大,也就是ipa包会变大
Standard Architectures
使用standard architectures (including 64-bit)(armv7,armv7s,arm64)参数,
则打的包里面有32位、64位两份代码,
在iPhone5s(iPhone5s的cpu是64位的)下,会首选运行64位代码包, 其余的iPhone(其余iPhone都是32位的,iPhone5c也是32位), 只能运行32位包,
但是包含两种架构的代码包,只能运行在ios6,ios7系统上。
这也就是说,这种打包方式,对手机几乎没啥要求,但是对系统有要求,即ios6以上。
而使用standard architectures (armv7,armv7s)参数,
则打的包里只有32位代码,
iPhone5s的cpu是64位,但是可以兼容32位代码,即可以运行32位代码。但是这会降低iPhone5s的性能
所以总结如下:
要发挥iPhone5s的64位性能,就要包含64位包,那么系统最低要求为ios6。
如果要兼容ios5以及更低的系统,只能打32位的包,系统都能通用,但是会丧失iPhone5s的性能。
参考文章:
iOS开发~制作同时支持armv7,armv7s,arm64,i386,x86_64的静态库.a
https://blog.csdn.net/unicodeXinYi/article/details/40784663
网友评论