iOS 指令集架構(gòu) armv6、armv7、armv7s、arm64、arm64e、x86_64、i386

一、ARM架構(gòu)

ARM架構(gòu)過去稱作進(jìn)階精簡指令集機(jī)器(Advanced RISC Machine,更早稱作:Acorn RISC Machine),是一個32位精簡指令集(RISC)處理器架構(gòu),ARM處理器非常適用于移動通訊領(lǐng)域,符合其主要設(shè)計目標(biāo)為低耗電的特性。

ARM和Intel處理器的第一個區(qū)別是,前者使用精簡指令集(RISC),而后者使用復(fù)雜指令集(CISC)。

二、ARM處理器指令集

ARM指令集是指計算機(jī)ARM操作指令系統(tǒng)。

armv6、armv7、armv7s、arm64、arm64e都是arm處理器的指令集,所有指令集原則上都是向下兼容的。比如,你的設(shè)備是armv7s指令集,那么它也可以兼容運行比armv7s版本低的指令集:armv7、armv6。Xcode4.5起不再支持armv6。

蘋果A7處理器支持兩個不同的指令集:32位ARM指令集(armv6|armv7|armv7s)和64位ARM指令集(arm64)。
i386|x86_64 是Mac處理器的指令集。

i386通常被用來作為對Intel 32位微處理器的統(tǒng)稱。X86-64可在同一時間內(nèi)處理64位的整數(shù)運算,并兼容X86-32架構(gòu),x86_64是針對x86架構(gòu)的64位處理器。當(dāng)使用iOS模擬器的時候會遇到i386|x86_64,iOS模擬器沒有運行arm指令集,編譯運行的是x86指令集,所以,只有在iOS設(shè)備上,才會執(zhí)行設(shè)備對應(yīng)的arm指令集。

三、iOS設(shè)備支持的指令集

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:

iPhone XS\XR\XS Max

四、Xcode->Build setting

1. Architectures

指定工程被編譯成支持哪些指令集類型,而支持的指令集越多,就會編譯出很多個指令集代碼的數(shù)據(jù)包,對應(yīng)生成二進(jìn)制包就越大,也就是ipa包越大。

現(xiàn)在XCode->build setting 中Architectures的默認(rèn)值是Standard architectures-

(ARCHS-STANDARD),
(ARCHS-STANDARD)的值如下圖所示:

image

地址:https://pewpewthespells.com/blog/buildsettings.html#current_arch

2、Valid Architectures

該編譯項指定可能支持的指令集,該列表和Architectures列表的交集,將是Xcode最終生成二進(jìn)制包所支持的指令集。

比如,你的Valid Architectures設(shè)置的支持arm指令集版本有:armv7/armv7s/arm64,對應(yīng)的Architectures設(shè)置的支持arm指令集版本有:arm64,這時Xcode只會生成一個arm64指令集的二進(jìn)制包。

減少安裝包中的指令集數(shù)據(jù)包可以減小打包ipa的大小。

3、Build Active Architecture Only:

指明是否只編譯當(dāng)前連接設(shè)備所支持的指令集。

默認(rèn)Debug的時候設(shè)置為YES,Release的時候設(shè)置為NO。設(shè)置為YES是只編譯當(dāng)前的architecture版本,生成的包只包含當(dāng)前連接設(shè)備的指令集代碼。設(shè)置為NO,則生成的包包含所有的指令集代碼(上面的Valid Architectures跟Architectures的交集)。因此為了調(diào)試速度更快,則Debug應(yīng)該設(shè)置為YES。

特殊:設(shè)置此值為YES,如果連接的設(shè)備是arm64的( iPhone 5s,iPhone6(plus)等),則Valid Architecture 中必須包含arm64, 否則編譯會報錯(報錯的內(nèi)容在下面常見問題中)。

五、常見錯誤

1. 編譯報錯 No architectures to compile for (ONLY_ACTIVE_ARCH=YES, active arch=x86_64, VALID_ARCHS=i386).

問題起因:active architecture(當(dāng)前連接設(shè)備的指令集)為64位指令集,但是valid architecture只包含32位指令集
  解決方法:valid architecture增加arm64 (常見的一些帖子的解決方案是把Build Active Architecture Only設(shè)置為NO,這是個簡單粗暴的解決辦法,在Debug過程中也會生成包含所有指令集的代碼,更何況現(xiàn)在官方強(qiáng)制必須支持64位,故不建議采納)

2. No architectures to compile for (ONLY_ACTIVE_ARCH=YES, active arch=i386, VALID_ARCHS=x86_64).

問題起因:跟上個問題同理,只不過連接的設(shè)備指令集是32位指令集,但是valid architecture只包含64位指令集

解決辦法:valid architecture增加armv7

3. 導(dǎo)入靜態(tài)庫后編譯報錯為

問題起因:

1:可能是靜態(tài)庫中不包含這個類。
  2:靜態(tài)庫工程可能沒有鏈接到應(yīng)用。

3:可能是因為靜態(tài)庫(.a)為真機(jī)版本,不包含模擬器版本(i386)。

解決辦法:

1:查看靜態(tài)庫里面是否存在這個類。
  2:Build Phases中沒有添加Link Binary With Libraries 中添加此靜態(tài)庫。

3:把調(diào)試目標(biāo)換成真機(jī) 或者 導(dǎo)入一個模擬器版本跟真機(jī)版本合并的版本

同理如果導(dǎo)入的庫是模擬器版本而用真機(jī)調(diào)試也會報錯,所以導(dǎo)入一個通用的版本是目前來講最好的辦法。

4、No architectures to compile for (ONLY_ACTIVE_ARCH=YES, active arch=arm64, VALID_ARCHS=armv7 armv7s)

當(dāng)Build Active Architecture Only起作用時:連接的手機(jī)指令集匹配是由高到低(arm64 > armv7s > armv7)依次匹配的。

5、No architectures to compile for (ONLY_ACTIVE_ARCH=YES, active arch=armv7s, VALID_ARCHS=armv7 arm64)

同樣的,若Architectures列表為armv7,則會選取armv7作為目標(biāo)指令集,若Valid Architectures列表中包含了armv7指令集,則能夠成功生成二進(jìn)制包,其支持的指令集只有armv7,若Valid Architectures列表中不包含armv7,則編譯失敗。

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

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