iOS开发之--Architectures详解

各个Architecture参数的含义

Architectures

当前设备环境下支持的指令架构。真机环境下是armV7、arm64。模拟器环境下是X86_64、i386、arm64(m1-m3设备)。

Build Active Architecture Only

是否只编译当前设备的指令架构。值是YES或者NO。一般Debug环境下,为了提高编译速度,会选择YES,表示只编译当前设备的指令架构。Release环境下,选择NO,编译所有类型设备的指令架构。

Excluded Architecture

排除的架构。排除的架构将不参与编译。例如:这里选择了arm64,编译产物将不会包含arm64指令架构。

VALID_ARCHS

用户自己设置的可用架构。这个选项在User-Defind里面,它的优先级是最高的。如果Architectures支持了很多架构,但是VALID_ARCHS只填写了一小部分,那么实际上支持的架构也是这一小部分。所以VALID_ARCHS的值一般和Architectures保持一致。

EXCLUDED_ARCHS

在Xcode12的release note中,VALID_ARCHS已经不推荐使用了(deprecate),我们应该使用EXCLUDED_ARCHS:

这个EXCLUDED_ARCHS和Excluded Architecture是同一个意思,所以我们使用Excluded Architecture就好了。

当然,你继续使用VALID_ARCHS也没有什么问题。测试发现,修改VALID_ARCHS仍然会影响编译结果。

iOS设备支持的指令架构

armv6

iPhone, iPhone 3G, iPod 1G/2G

armv7

iPhone 3GS, iPhone 4, iPhone 4S, iPod 3G/4G/5G, iPad, iPad 2, iPad 3, iPad Mini

armv7s

iPhone 5, iPhone 5c, iPad 4

arm64

iPhone X,iPhone 8(Plus),iPhone 7(Plus),iPhone 6(Plus),iPhone 6s(Plus), iPhone 5s, iPad Air(2), Retina iPad Mini(2,3)

arm64e

iPhoneX及以上新机型

x86_64

对应64位电脑处理器的模拟器

i386

对应32位电脑处理器的模拟器

注意💡:

1、从Xcode12开始,如果你是m1设备,模拟器也支持arm64指令集。
2、不管是arm64还是arm64e,这些称呼都是ABI(Application Binary Interface),编译后对应的指令集架构(Instruction Set Architecture)都是armV8.X系列。

如何分离SDK指令架构

有些第三方SDK包,除了包含真机的arm架构外,还包含了模拟器的架构,对于这种类型的SDK包,是不允许提交AppStore的:



要解决这个问题,我们需要将SDK里的模拟器指令架构剥离。

下面列举了操作.a文件指令集的常用命令:

查看.a文件支持的指令集:

lipo -info xxx.a

合并两个.a文件:

lipo -create xxx.a ooo.a -output hebing.a

移除某个指令集:

lipo -remove i386 xxx.a -output noi386.a

抽取某个指令集:

lipo -thin arm64 xxx.a -output onlyArm64.a

假设AipBase.a文件包含了i386 x86_64 armv7 armv7s arm64指令架构,我们需要将其中的armv7、arm7s、arm64架构分离:

1、新建三个文件夹

mkdir armv7
 
mkdir armv7s
 
mkdir arm64

2、单独抽离指令架构

lipo ../AipBase.framework/AipBase -thin armv7 -output ./armv7/AipBase
 
lipo ../AipBase.framework/AipBase -thin armv7s -output ./armv7s/AipBase
 
lipo ../AipBase.framework/AipBase -thin arm64 -output ./arm64/AipBase

3、将多个指令架构合并

lipo -create ../armv7/AipBase ../armv7s/AipBase ../arm64/AipBase -output ../AipBase.framework/AipBase

4、再次检查合并后的指令架构是否符合你的要求

lipo -info ../AipBase.framework/AipBase

总结

再次回到开始说的问题:Could not find module 'xxxxxxx' for target 'arm64-apple-ios-simulator。

  • 1、如果你此时准备在arm64模拟器上运行,这说明你的编译产物没有arm64指令集支持,检查Buind Setting中Excluded Architecture是否把 arm64 的支持去掉了。

  • 2、如果你并没有在arm64模拟器上运行,你只是在运行某些检测工具,这说明工具在帮你使用arm64模拟器环境测试你的代码。鉴于你不想在arm64模拟器上运行代码,你可以取消模拟器的arm64支持。

参考

整理一下脑子里混乱的Architectures - 掘金

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容