iOS技术征服iOSIOS学习揽收

xcode基础配置详解之Architecture(一)

2017-05-10  本文已影响1989人  刀客传奇

版本记录

版本号 时间
V1.0 2017.05.09

前言

xcode有很多基础配置,这里很杂很细,需要大家很细心的注意,并不难,但是这里的基础配置的设置无疑又非常重要。下面我们说一下Architecture的配置。

详述

Architecture的配置

我们先看一下要配置的地方,先看一下下面这个图示,下面会深入的讲解这些参数的配置情况。

Architecture的配置

架构介绍

大家已经知道了架构涉及到armv7,armv7s,i386, x86_64, arm64这些配置,下面我们先说一下这些参数都是做什么的。这些都是架构,是ARM处理器的指令集,那么什么是ARM?ARM其实就是硬件结构,用于相关处理和计算,类似电脑主板上的cpu。手机的操作系统能运行就是因为有ARM做支持。但是ARM也有很多型号,工艺也不同,运行速率也有差别。这里面armv7.armv7s,arm64都是ARM处理器的指令集,i386,x86_64是mac的指令集。

支持的设备

需要说明的是:

配置参数说明

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

后记

已经很晚了,休息,明晚不见不散~~~

椰林海风
上一篇下一篇

猜你喜欢

热点阅读