iOS開發(fā)之--Architectures詳解

各個(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支持。

參考

整理一下腦子里混亂的Architectures - 掘金

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容