各個Architecture參數(shù)的含義
Architectures
當(dāng)前設(shè)備環(huán)境下支持的指令架構(gòu)。真機環(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)妄呕。這個選項在User-Defind里面陶舞,它的優(yōu)先級是最高的。如果Architectures支持了很多架構(gòu)绪励,但是VALID_ARCHS只填寫了一小部分肿孵,那么實際上支持的架構(gòu)也是這一小部分唠粥。所以VALID_ARCHS的值一般和Architectures保持一致。
EXCLUDED_ARCHS
在Xcode12的release note中停做,VALID_ARCHS已經(jīng)不推薦使用了(deprecate)晤愧,我們應(yīng)該使用EXCLUDED_ARCHS:
這個EXCLUDED_ARCHS和Excluded Architecture是同一個意思,所以我們使用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及以上新機型
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包,除了包含真機的arm架構(gòu)外喂很,還包含了模擬器的架構(gòu)惜颇,對于這種類型的SDK包,是不允許提交AppStore的:
要解決這個問題少辣,我們需要將SDK里的模擬器指令架構(gòu)剝離凌摄。
下面列舉了操作.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
假設(shè)AipBase.a文件包含了i386 x86_64 armv7 armv7s arm64指令架構(gòu),我們需要將其中的armv7漓帅、arm7s锨亏、arm64架構(gòu)分離:
1、新建三個文件夾
mkdir armv7
mkdir armv7s
mkdir arm64
2忙干、單獨抽離指令架構(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ò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、如果你此時準(zhǔn)備在arm64模擬器上運行珠移,這說明你的編譯產(chǎn)物沒有arm64指令集支持弓乙,檢查Buind Setting中Excluded Architecture是否把 arm64 的支持去掉了末融。
2、如果你并沒有在arm64模擬器上運行暇韧,你只是在運行某些檢測工具勾习,這說明工具在幫你使用arm64模擬器環(huán)境測試你的代碼。鑒于你不想在arm64模擬器上運行代碼懈玻,你可以取消模擬器的arm64支持巧婶。