各個(gè)Architecture參數(shù)的含義
Architectures
當(dāng)前設(shè)備環(huán)境下支持的指令架構(gòu)。真機(jī)環(huán)境下是armV7、arm64。模擬器環(huán)境下是X86_64、i386、arm64(m1-m3設(shè)備)。
Build Active Architecture Only
是否只編譯當(dāng)前設(shè)備的指令架構(gòu)。值是YES或者NO。一般Debug環(huán)境下,為了提高編譯速度,會選擇YES,表示只編譯當(dāng)前設(shè)備的指令架構(gòu)。Release環(huán)境下,選擇NO,編譯所有類型設(shè)備的指令架構(gòu)。
Excluded Architecture
排除的架構(gòu)。排除的架構(gòu)將不參與編譯。例如:這里選擇了arm64,編譯產(chǎn)物將不會包含arm64指令架構(gòu)。
VALID_ARCHS
用戶自己設(shè)置的可用架構(gòu)。這個(gè)選項(xiàng)在User-Defind里面,它的優(yōu)先級是最高的。如果Architectures支持了很多架構(gòu),但是VALID_ARCHS只填寫了一小部分,那么實(shí)際上支持的架構(gòu)也是這一小部分。所以VALID_ARCHS的值一般和Architectures保持一致。
EXCLUDED_ARCHS
在Xcode12的release note中,VALID_ARCHS已經(jīng)不推薦使用了(deprecate),我們應(yīng)該使用EXCLUDED_ARCHS:
這個(gè)EXCLUDED_ARCHS和Excluded Architecture是同一個(gè)意思,所以我們使用Excluded Architecture就好了。
當(dāng)然,你繼續(xù)使用VALID_ARCHS也沒有什么問題。測試發(fā)現(xiàn),修改VALID_ARCHS仍然會影響編譯結(jié)果。
iOS設(shè)備支持的指令架構(gòu)
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及以上新機(jī)型
x86_64
對應(yīng)64位電腦處理器的模擬器
i386
對應(yīng)32位電腦處理器的模擬器
注意??:
1、從Xcode12開始,如果你是m1設(shè)備,模擬器也支持arm64指令集。
2、不管是arm64還是arm64e,這些稱呼都是ABI(Application Binary Interface),編譯后對應(yīng)的指令集架構(gòu)(Instruction Set Architecture)都是armV8.X系列。
如何分離SDK指令架構(gòu)
有些第三方SDK包,除了包含真機(jī)的arm架構(gòu)外,還包含了模擬器的架構(gòu),對于這種類型的SDK包,是不允許提交AppStore的:

要解決這個(gè)問題,我們需要將SDK里的模擬器指令架構(gòu)剝離。
下面列舉了操作.a文件指令集的常用命令:
查看.a文件支持的指令集:
lipo -info xxx.a
合并兩個(gè).a文件:
lipo -create xxx.a ooo.a -output hebing.a
移除某個(gè)指令集:
lipo -remove i386 xxx.a -output noi386.a
抽取某個(gè)指令集:
lipo -thin arm64 xxx.a -output onlyArm64.a
假設(shè)AipBase.a文件包含了i386 x86_64 armv7 armv7s arm64指令架構(gòu),我們需要將其中的armv7、arm7s、arm64架構(gòu)分離:
1、新建三個(gè)文件夾
mkdir armv7
mkdir armv7s
mkdir arm64
2、單獨(dú)抽離指令架構(gòu)
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、將多個(gè)指令架構(gòu)合并
lipo -create ../armv7/AipBase ../armv7s/AipBase ../arm64/AipBase -output ../AipBase.framework/AipBase
4、再次檢查合并后的指令架構(gòu)是否符合你的要求
lipo -info ../AipBase.framework/AipBase
總結(jié)
再次回到開始說的問題:Could not find module 'xxxxxxx' for target 'arm64-apple-ios-simulator。
1、如果你此時(shí)準(zhǔn)備在arm64模擬器上運(yùn)行,這說明你的編譯產(chǎn)物沒有arm64指令集支持,檢查Buind Setting中Excluded Architecture是否把 arm64 的支持去掉了。
2、如果你并沒有在arm64模擬器上運(yùn)行,你只是在運(yùn)行某些檢測工具,這說明工具在幫你使用arm64模擬器環(huán)境測試你的代碼。鑒于你不想在arm64模擬器上運(yùn)行代碼,你可以取消模擬器的arm64支持。