iOS中指令集

iOS设备指令集

iOS使用了arm处理器,并根据设备的硬件性能开发了不同的指令集.arm处理器下的指令集有:

  • armv6:主要是用在早期的iOS上,如iPhone, iPhone2, iPhone3G, 第一代、第二代 iPod Touch;
  • armv7:iPhone3GS, iPhone4, iPhone4S,iPad, iPad2, iPad3(The New iPad), iPad mini, iPod Touch 3G, iPod Touch4;
  • armv7s:iPhone5, iPhone5C, iPad4(iPad with Retina Display)
  • arm64:iPhone5S, iPad Air, iPad mini2(iPad mini with Retina Display)
  • arm64e:在iPhone XR, iPhone XS等,在arm64指令集基础上引入了新的PAC机制

所有的指令集原则上向下兼容,新的指令集会兼容原来的指令集,只是不能充分利用硬件的优势无法发挥更好的性能.如iPhone4S的CPU默认使用armv7指令集,但是也同时兼容armv6指令集,之前使用armv6架构打包的软件依然可以在iPhone4s上使用,只是会慢一点.而且arm指令集出现在真机设备上,模拟器使用X86架构,没有arm指令集.

Xcode编译指令集设置

在Xcode中,与指令集有关的设置主要有三个:

  • Architectures:指明选定的Target生成二进制文件时需要支持的指令集.支持的指令集是通过生成对应的二进制文件实现的,所以需要支持的指令集越多,生成的二进制文件的体积越大. 一般情况下,Xcode会默认一个标准的支持指令集,如果有需要可以手动进行添加.但是需要注意的是,生成的二进制文件所支持的指令集并不一定包含该设置中的所有指令集,因为这是你想要的,并不一定是Xcode支持的,还需要看Valid Architectures是否支持;
  • Valid Architectures:限定了该版本Xcode支持的打包指令集,即限制可能被支持的指令集的范围,只有在指令集被支持的情况下,Architectures中指定的指令集才会出现在生成的二进制文件中.因此生成二进制文件所支持的指令集只可能是Architectures和Valid Architectures的交集.
  • Build Active Architechture Only:指明是否只编译当前连接设备所支持的指令集.为了方便开发,避免重复生成无用指令集对应的二进制文件,Xcode出现了是否只生成目前设备指令集二进制文件的设置.默认情况下,在Debug模式Xcode只会生成当前设备指令集所对应的二进制文件,由于只有一个指令集需要支持,所以生成的速度会快很多,而且避免了生成无用的指令集对应的二进制文件减少了内存占用提升了开发效率;而在Release模式下,会使用Architectures和Valid Architectures的交集来生成二进制文件,此时为了尽可能多地支持老设备,生成的二进制文件会支持多个指令集.可以实际根据需要更改默认设置.

指令集的合并与拆分

为了尽可能多地支持多种设备,打包时需要根据需要生成支持多种指令集的二进制文件,习惯上称为通用二进制文件(Fat Binary 或者Universal Binary).如果拥有了所有源代码的访问权限,可以通过设置Xcode来打包支持对应指令集集合的二进制文件,但是实际开发中,多数情况你只能拿到打包好的文件,而实际上并不需要那么多指令集,如果全部打包在应用里就会导致应用包体积增大,这时就需要根据需要进行二进制文件的拆分组合.拆分组合二进制文件可以使用mac自带的lipo工具.

  • 拆分

对于包含多种指令集的通用二进制文件,如果只需要其所支持指令集的子集,则可以使用

lipo source_binary_file -thin armxx -output arm_armxx

其中:
source_binary_file:原始二进制文件
armxx:需要分离的指令集,如armv7,armv7s,arm64,arm64e
arm_armxx:分离之后的二进制文件名

进行拆分.例如,只需要arm64指令集:

lipo source_binary_file -thin arm64 -output arm_arm64
  • 合并

合并不同指令集集合的二进制文件,可以使用

lipo -create armxx armyy ... -output arm_destination_file

其中:

armxx, armyy:为支持固定指令集的二进制文件;
... : 原文件的数目可以为多个
arm_destination_file: 最终合成的支持多指令集机构的通用二进制文件

这里有一个注意点就是:

合并之后的通用二进制文件体积会比合并之前各个文件的体积之和大.

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值