ARM架构过去称作进阶精简指令集机器(Advanced RISC Machine,更早称作:Acorn RISC Machine),是一个32位精简指令集(RISC)处理器架构,ARM处理器非常适用于移动通讯领域,符合其主要设计目标为低耗电的特性。
ARM和Intel处理器的第一个区别是,前者使用精简指令集(RISC),而后者使用复杂指令集(CISC)。
ARM指令集是指计算机ARM操作指令系统。
armv6、armv7、armv7s、arm64、arm64e都是arm处理器的指令集,所有指令集原则上都是向下兼容的。比如,你的设备是armv7s指令集,那么它也可以兼容运行比armv7s版本低的指令集:armv7、armv6。Xcode4.5起不再支持armv6。
苹果A7处理器支持两个不同的指令集:32位ARM指令集(armv6|armv7|armv7s)和64位ARM指令集(arm64)。
i386|x86_64 是Mac处理器的指令集。
i386通常被用来作为对Intel 32位微处理器的统称。X86-64可在同一时间内处理64位的整数运算,并兼容X86-32架构,x86_64是针对x86架构的64位处理器。当使用iOS模拟器的时候会遇到i386|x86_64,iOS模拟器没有运行arm指令集,编译运行的是x86指令集,所以,只有在iOS设备上,才会执行设备对应的arm指令集。
这里是设备对应的Achitectures指令集:
ARM CPU的不同指令集 | 对应设备 |
---|---|
armv7 | iPhone 3GS,iPhone4,iPhone 4s,iPad,iPad2,iPad3(The New iPad),iPad mini,iPod Touch 3G,iPod Touch4 |
armv7s | iPhone5, iPhone5C,iPad4,iPod5 |
arm64 | iPhone5s,iPhone6、7、8,iPhone6、7、8 Plus,iPhone X,iPad Air,iPad mini2(iPad mini with Retina Display), |
arm64e | XS/XS Max/XR/ iPhone 11, iPhone 11 pro |
x86_64 | 模拟器64位处理器 |
i386 | 模拟器32位处理器测试 |
iOS项目打包,或者只是在项目里面调用第三方静态库抑或是自己新建一个静态库,就要无可避免的和Architectures打交道。
什么是Architectures?
architectures:n. 建筑;架构(architecture的复数)。
关于Xcode中的Architectures 和 Valid Architectures
Architectures
指定工程支持的指令集的集合,如果设置多个architecture,则生成的二进制数据包会包含多个指令集代码,体积会变大。
Valid Architectures
有效的指令集集合,Architectures与Valid Architectures 的交集来确定最终的数据包包含的指令集代码。
Xcode9.1创建的工程,Valid Architectures默认有这几个:armv7 armv7s arm64,说明目前默认最低支持到iPhone5,也就是iOS8(iPhone5才能使用iOS8)
二者的区别和联系:
Valid Architectures表示的是你的项目所支持的处理器架构列表,是一个大的集合,而Architectures表示的是你的项目编译的时候最终生成的二进制文件包含的处理器架构集合。
ARM
ARM处理器,特点是体积小、低功耗、低成本、高性能, 所以几乎所有手机处理器都基于ARM,在嵌入式系统中应用广泛
ARM处理器指令集
armv6|armv7|armv7s|arm64 | arm64e 都是ARM处理器的指令集,这些指令集都是向下兼容的,例如armv7指令集兼容armv6,只是使用armv6的时候无法发挥出其性能,无法使用armv7的新特性,从而会导致程序执行效率没那么高。
i386|x86_64 是Mac处理器的指令集,i386是针对intel通用微处理器32架构的. x86_64是针对x86架构的64位处理器. 所以当使用iOS模拟器的时候会遇到i386|x86_64, ios模拟器没有arm指令集.
该编译项用于设置是否只编译当前使用的设备对应的arm指令集
Base SDK–>指的是当前编译所用的SDK 版本
Base SDK设置会引导编译器使用该版本的SDK编译和构建应用,也就是说,它会直接控制应用使用哪些API. 默认情况下,Xcode中创建的新工程总是使用最新版本的SDK,而苹果会处理API的废弃,如下图:
iOS项目打包,或者只是在项目里面调用第三方静态库抑或是自己新建一个静态库,就要无可避免的和Architectures打交道。
standard architectures
使用 standard architectures (including 64-bit)(armv7,arm64, arm64e)
参数,则打的包里面有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。
https://www.cnblogs.com/lxlx1798/p/10147065.html
https://www.cnblogs.com/lulushen/p/8135269.html
https://stackoverflow.com/questions/52624308/xcode-arm64-vs-arm64e