版本记录
版本号 | 时间 |
---|---|
V1.0 | 2017.05.09 |
前言
xcode有很多基础配置,这里很杂很细,需要大家很细心的注意,并不难,但是这里的基础配置的设置无疑又非常重要。下面我们说一下Architecture的配置。
详述
Architecture的配置
我们先看一下要配置的地方,先看一下下面这个图示,下面会深入的讲解这些参数的配置情况。
架构介绍
大家已经知道了架构涉及到armv7,armv7s,i386, x86_64, arm64这些配置,下面我们先说一下这些参数都是做什么的。这些都是架构,是ARM处理器的指令集,那么什么是ARM?ARM其实就是硬件结构,用于相关处理和计算,类似电脑主板上的cpu。手机的操作系统能运行就是因为有ARM做支持。但是ARM也有很多型号,工艺也不同,运行速率也有差别。这里面armv7.armv7s,arm64都是ARM处理器的指令集,i386,x86_64是mac的指令集。
支持的设备
- 支持arm64:iphone6 | iphone6s | iphone 6 plus | iphone 6s plus | iphone5S | ipad Air | ipad nimi2 (ipad with Retina Dispaly)。
- 支持armv7s: iphone 5C | iphone5 | ipad4(iPad with Retina Dispaly)
- 支持armv7 : iphone4 | iphone 4S | ipad | ipad2 | ipad3 | ipad mini | ipad touch 3G | ipad Touch4
- 支持i386: 是针对intel微处理器的32位处理器。
- 支持x86_64 是针对x86架构的64位处理器。
需要说明的是:
- 模拟器32位处理器测试需要i386架构。
- 模拟器64位处理器测试需要x86_64架构。
- 真机32位处理器需要armv7或者armv7s架构。
- 真机64位处理器需要arm64架构。
配置参数说明
1. Architectures
指定工程被编译成支持哪些指令集类型,而支持的指令集越多,就会编译出很多个指令集代码的数据包,对应生成二进制包就越大,也就是ipa包越大。
2. Valid Architectures
限制可能被支持指令集的范围,就是xcode编译出来的二进制包类型最终从这些类型产生,而编译出哪些指令集的包,将由Architectures与Valid Architectures这些交集来确定。
3. Build Active Architecture Only
指定是都只对当前连接设备所支持的指令集编译,当设置为YES时,是为了debug编译的速度更快,它只会编译当前的architecture版本,当设置为NO时,会编译所有的版本,所以一般debug设置为YES,release设置为NO,以适应不同设备。
配置参数举例
例1:
比如 Valid Architectures设置的支持arm指令集版本有:armv7/armv7s/arm64,对应的Architectures设置的支持arm指令集版本有:armv7s,这时Xcode只会生成一个armv7s指令集的二进制包。
例2:
将Architectures支持arm指令集设置为:armv7,armv7s,对应的Valid Architectures的支持的指令集设置为:armv7s,arm64,那么此时,XCode生成二进制包所支持的指令集只有armv7s
例3:
Architectures: armv7, armv7s, arm64
ValidArchitectures: armv6, armv7s, arm64
生成二进制包支持的指令集: arm64
例4:
Architectures: armv6, armv7, armv7s
Valid Architectures: armv6, armv7s, arm64
生成二进制包支持的指令集: armv7s
例5:
Architectures: armv7, armv7s, arm64
Valid Architectures: armv7,armv7s
这种情况是报错的,因为允许使用指令集中没有arm64。
结论:使用 standard architectures (including 64-bit)(armv7,arm64) 参数,则打的包里面有32位、64位两份代码,在iPhone5s( iPhone5s的cpu是64位的 )下,会首选运行64位代码包, 其余的iPhone( 其余iPhone都是32位的,iPhone5c也是32位 ),只能运行32位包,但是包含两种架构的代码包,只有运行在ios6以上的系统上。
而使用 standard architectures (armv7,armv7s) 参数, 则打的包里只有32位代码, iPhone5s的cpu是64位,但是可以兼容32位代码,即可以运行32位代码。但是这会降低iPhone5s的性能。 其余的iPhone对32位代码包更没问题, 而32位代码包,对系统也几乎也没什么限制。
所以:
要发挥iPhone5s的64位性能,就要包含64位包,那么系统最低要求为ios6。 如果要兼容ios5以及更低的系统,只能打32位的包,系统都能通用,但是会丧失iPhone5s的性能。当然这样做会使部分设备出现性能损失,当然在普通应用中这点体现几乎感觉不到,至少不会威胁到用户体检。
静态库的制作
制作静态库.a是指令集选择。如何制作一个“没有问题”的.a静态库,通过以上信息了解到,当我们做App的时候,为了追求高效率,并且减小包的大小,Build Active Architecture Only设置成YES,Architectures按Xcode默认配置就可以,因为arm64向前兼容。但制作.a静态库就不同了,因为要保证兼容性,包括不同iOS设备以及模拟器运行不出错,所以结合当前行业情况,要做到最大的兼容性。
ValidArchitectures设置为:armv7|armv7s|arm64|i386|x86_64
Architectures设置不变(或根据你需要): armv7|arm64
然后分别选择iOS设备和模拟器进行编译,最后找到相关的.a进行合包,使用lipo -create 真机库.a的路径 模拟器库.a的的路径 -output 合成库的名字.a。
参考文章
1.iOS 中的 armv7,armv7s,arm64,i386,x86_64 都是什么
2.iOS开发~制作同时支持armv7,armv7s,arm64,i386,x86_64的静态库.a
后记
已经很晚了,休息,明晚不见不散~~~