一、ARM架構(gòu)
ARM架構(gòu)過(guò)去稱作進(jìn)階精簡(jiǎn)指令集機(jī)器(Advanced RISC Machine挽霉,更早稱作:Acorn RISC Machine)防嗡,是一個(gè)32位精簡(jiǎn)指令集(RISC)處理器架構(gòu),ARM處理器非常適用于移動(dòng)通訊領(lǐng)域侠坎,符合其主要設(shè)計(jì)目標(biāo)為低耗電的特性蚁趁。
ARM和Intel處理器的第一個(gè)區(qū)別是,前者使用精簡(jiǎn)指令集(RISC)实胸,而后者使用復(fù)雜指令集(CISC)他嫡。
二、ARM處理器指令集
ARM指令集是指計(jì)算機(jī)ARM操作指令系統(tǒng)童芹。
armv6涮瞻、armv7、armv7s假褪、arm64署咽、arm64e都是arm處理器的指令集,所有指令集原則上都是向下兼容的生音。比如宁否,你的設(shè)備是armv7s指令集,那么它也可以兼容運(yùn)行比armv7s版本低的指令集:armv7缀遍、armv6慕匠。Xcode4.5起不再支持armv6。
蘋(píng)果A7處理器支持兩個(gè)不同的指令集:32位ARM指令集(armv6|armv7|armv7s)和64位ARM指令集(arm64)域醇。
i386|x86_64 是Mac處理器的指令集台谊。
i386通常被用來(lái)作為對(duì)Intel 32位微處理器的統(tǒng)稱蓉媳。X86-64可在同一時(shí)間內(nèi)處理64位的整數(shù)運(yùn)算,并兼容X86-32架構(gòu),x86_64是針對(duì)x86架構(gòu)的64位處理器锅铅。當(dāng)使用iOS模擬器的時(shí)候會(huì)遇到i386|x86_64执桌,iOS模擬器沒(méi)有運(yùn)行arm指令集蝉绷,編譯運(yùn)行的是x86指令集,所以摧莽,只有在iOS設(shè)備上顷锰,才會(huì)執(zhí)行設(shè)備對(duì)應(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
指定工程被編譯成支持哪些指令集類型统舀,而支持的指令集越多堂飞,就會(huì)編譯出很多個(gè)指令集代碼的數(shù)據(jù)包,對(duì)應(yīng)生成二進(jìn)制包就越大绑咱,也就是ipa包越大。
現(xiàn)在XCode->build setting 中Architectures的默認(rèn)值是Standard architectures-
地址:https://pewpewthespells.com/blog/buildsettings.html#current_arch
2描融、Valid Architectures
該編譯項(xiàng)指定可能支持的指令集,該列表和Architectures列表的交集衡蚂,將是Xcode最終生成二進(jìn)制包所支持的指令集窿克。
比如,你的Valid Architectures設(shè)置的支持arm指令集版本有:armv7/armv7s/arm64毛甲,對(duì)應(yīng)的Architectures設(shè)置的支持arm指令集版本有:arm64年叮,這時(shí)Xcode只會(huì)生成一個(gè)arm64指令集的二進(jìn)制包。
減少安裝包中的指令集數(shù)據(jù)包可以減小打包ipa的大小玻募。
3只损、Build Active Architecture Only:
指明是否只編譯當(dāng)前連接設(shè)備所支持的指令集。
默認(rèn)Debug的時(shí)候設(shè)置為YES七咧,Release的時(shí)候設(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, 否則編譯會(huì)報(bào)錯(cuò)(報(bào)錯(cuò)的內(nèi)容在下面常見(jiàn)問(wèn)題中)曾棕。
五、常見(jiàn)錯(cuò)誤
1. 編譯報(bào)錯(cuò) No architectures to compile for (ONLY_ACTIVE_ARCH=YES, active arch=x86_64, VALID_ARCHS=i386).
問(wèn)題起因:active architecture(當(dāng)前連接設(shè)備的指令集)為64位指令集霉翔,但是valid architecture只包含32位指令集
解決方法:valid architecture增加arm64 (常見(jiàn)的一些帖子的解決方案是把Build Active Architecture Only設(shè)置為NO睁蕾,這是個(gè)簡(jiǎn)單粗暴的解決辦法,在Debug過(guò)程中也會(huì)生成包含所有指令集的代碼债朵,更何況現(xiàn)在官方強(qiáng)制必須支持64位子眶,故不建議采納)
2. No architectures to compile for (ONLY_ACTIVE_ARCH=YES, active arch=i386, VALID_ARCHS=x86_64).
問(wèn)題起因:跟上個(gè)問(wèn)題同理,只不過(guò)連接的設(shè)備指令集是32位指令集序芦,但是valid architecture只包含64位指令集
解決辦法:valid architecture增加armv7
3. 導(dǎo)入靜態(tài)庫(kù)后編譯報(bào)錯(cuò)為
問(wèn)題起因:
1:可能是靜態(tài)庫(kù)中不包含這個(gè)類臭杰。
2:靜態(tài)庫(kù)工程可能沒(méi)有鏈接到應(yīng)用。
3:可能是因?yàn)殪o態(tài)庫(kù)(.a)為真機(jī)版本谚中,不包含模擬器版本(i386)渴杆。
解決辦法:
1:查看靜態(tài)庫(kù)里面是否存在這個(gè)類。
2:Build Phases中沒(méi)有添加Link Binary With Libraries 中添加此靜態(tài)庫(kù)宪塔。
3:把調(diào)試目標(biāo)換成真機(jī) 或者 導(dǎo)入一個(gè)模擬器版本跟真機(jī)版本合并的版本
同理如果導(dǎo)入的庫(kù)是模擬器版本而用真機(jī)調(diào)試也會(huì)報(bào)錯(cuò)磁奖,所以導(dǎo)入一個(gè)通用的版本是目前來(lái)講最好的辦法。
4某筐、No architectures to compile for (ONLY_ACTIVE_ARCH=YES, active arch=arm64, VALID_ARCHS=armv7 armv7s)
當(dāng)Build Active Architecture Only起作用時(shí):連接的手機(jī)指令集匹配是由高到低(arm64 > armv7s > armv7)依次匹配的比搭。
5、No architectures to compile for (ONLY_ACTIVE_ARCH=YES, active arch=armv7s, VALID_ARCHS=armv7 arm64)
同樣的南誊,若Architectures列表為armv7身诺,則會(huì)選取armv7作為目標(biāo)指令集,若Valid Architectures列表中包含了armv7指令集抄囚,則能夠成功生成二進(jìn)制包霉赡,其支持的指令集只有armv7,若Valid Architectures列表中不包含armv7幔托,則編譯失敗穴亏。