一言缤、概要
平時項目開發(fā)中,可能使用第三方提供的靜態(tài)庫.a禁灼,如果.a提供方技術不成熟管挟,使用的時候就會出現(xiàn)問題,例如:
在真機上編譯報錯:No architectures to compile for (ONLY_ACTIVE_ARCH=YES, active arch=x86_64, VALID_ARCHS=i386).
在模擬器上編譯報錯:No architectures to compile for (ONLY_ACTIVE_ARCH=YES, active arch=armv7s, VALID_ARCHS=armv7 armv6).
要解決以上問題弄捕,就要了解一下Apple移動設備處理器指令集相關的一些細節(jié)知識僻孝。
二、幾個重要概念
1守谓、ARM
ARM處理器穿铆,特點是體積小、低功耗斋荞、低成本荞雏、高性能,所以幾乎所有手機處理器都基于ARM平酿,在嵌入式系統(tǒng)中應用廣泛凤优。
2、ARM處理器指令集
armv6|armv7|armv7s|arm64都是ARM處理器的指令集蜈彼,這些指令集都是向下兼容的筑辨,例如armv7指令集兼容armv6,只是使用armv6的時候無法發(fā)揮出其性能幸逆,無法使用armv7的新特性挖垛,從而會導致程序執(zhí)行效率沒那么高。
還有兩個我們也很熟悉的指令集:i386|x86_64 是Mac處理器的指令集秉颗,i386是針對intel通用微處理器32架構的。x86_64是針對x86架構的64位處理器送矩。所以當使用iOS模擬器的時候會遇到i386|x86_64蚕甥,iOS模擬器沒有arm指令集。
3栋荸、目前iOS移動設備指令集
arm64:iPhone5S| iPad Air| iPad mini2(iPad mini with Retina Display)
armv7s:iPhone5|iPhone5C|iPad4(iPad with Retina Display)
armv7:iPhone3GS|iPhone4|iPhone4S|iPad|iPad2|iPad3(The New iPad)|iPad mini|iPod Touch 3G|iPod Touch4
armv6 設備: iPhone, iPhone2, iPhone3G, 第一代菇怀、第二代 iPod Touch(一般不需要去支持)
4、Xcode中指令集相關選項(Build Setting中)
(1)Architectures
Space-separated list of identifiers. Specifies the architectures (ABIs, processor models) to which the binary is targeted. When this build setting specifies more than one architecture, the generated binary may contain object code for each of the specified architectures.
指定工程被編譯成可支持哪些指令集類型晌块,而支持的指令集越多爱沟,就會編譯出包含多個指令集代碼的數(shù)據(jù)包,對應生成二進制包就越大匆背,也就是ipa包會變大呼伸。
(2)Valid Architectures
Space-separated list of identifiers. Specifies the architectures for which the binary may be built. During the build, this list is intersected with the value of ARCHS build setting; the resulting list specifies the architectures the binary can run on. If the resulting architecture list is empty, the target generates no binary.
限制可能被支持的指令集的范圍,也就是Xcode編譯出來的二進制包類型最終從這些類型產(chǎn)生,而編譯出哪種指令集的包括享,將由Architectures與Valid Architectures(因此這個不能為空)的交集來確定搂根,例如:
比如,你的Valid Architectures設置的支持arm指令集版本有:armv7/armv7s/arm64铃辖,對應的Architectures設置的支持arm指令集版本有:armv7s剩愧,這時Xcode只會生成一個armv7s指令集的二進制包。
再比如:將Architectures支持arm指令集設置為:armv7,armv7s娇斩,對應的Valid Architectures的支持的指令集設置為:armv7s,arm64仁卷,那么此時,XCode生成二進制包所支持的指令集只有armv7s
在Xcode6.1.1里的 Valid Architectures 設置里犬第, 默認為 Standard architectures(armv7,arm64),如果你想改的話锦积,自己在other中更改。
原因解釋如下:
使用 standard architectures (including 64-bit)(armv7,arm64) 參數(shù)瓶殃,則打的包里面有32位充包、64位兩份代碼,在iPhone5s( iPhone5s的cpu是64位的 )下遥椿,會首選運行64位代碼包基矮, 其余的iPhone( 其余iPhone都是32位的,iPhone5c也是32位 ),只能運行32位包冠场,但是包含兩種架構的代碼包家浇,只有運行在ios6,ios7系統(tǒng)上碴裙。
這也就是說钢悲,這種打包方式,對手機幾乎沒要求舔株,但是對系統(tǒng)有要求莺琳,即ios6以上。
而使用 standard architectures (armv7,armv7s) 參數(shù)载慈, 則打的包里只有32位代碼惭等, iPhone5s的cpu是64位,但是可以兼容32位代碼办铡,即可以運行32位代碼辞做。但是這會降低iPhone5s的性能。 其余的iPhone對32位代碼包更沒問題寡具, 而32位代碼包秤茅,對系統(tǒng)也幾乎也沒什么限制。
所以總結如下:
要發(fā)揮iPhone5s的64位性能童叠,就要包含64位包框喳,那么系統(tǒng)最低要求為ios6。 如果要兼容ios5以及更低的系統(tǒng),只能打32位的包帖努,系統(tǒng)都能通用撰豺,但是會喪失iPhone5s的性能。
(3)Build Active Architecture Only
指定是否只對當前連接設備所支持的指令集編譯
當其值設置為YES拼余,這個屬性設置為yes污桦,是為了debug的時候編譯速度更快,它只編譯當前的architecture版本匙监,而設置為no時凡橱,會編譯所有的版本。 編譯出的版本是向下兼容的亭姥,連接的設備的指令集匹配是由高到低(arm64 > armv7s > armv7)依次匹配的稼钩。比如你設置此值為yes,用iphone4編譯出來的是armv7版本的达罗,iphone5也可以運行坝撑,但是armv6的設備就不能運行。 所以粮揉,一般debug的時候可以選擇設置為yes巡李,release的時候要改為no,以適應不同設備扶认。
1)
Architectures: armv7, armv7s, arm64
ValidArchitectures: armv6, armv7s, arm64
生成二進制包支持的指令集: arm64
2)
Architectures: armv6, armv7, armv7s
Valid Architectures: armv6, armv7s, arm64
生成二進制包支持的指令集: armv7s
3)
Architectures: armv7, armv7s, arm64
Valid Architectures: armv7侨拦,armv7s
這種情況是報錯的,因為允許使用指令集中沒有arm64辐宾。
注:如果你對ipa安裝包大小有要求狱从,可以減少安裝包的指令集的數(shù)量,這樣就可以盡可能的減少包的大小叠纹。當然這樣做會使部分設備出現(xiàn)性能損失季研,當然在普通應用中這點體現(xiàn)幾乎感覺不到,至少不會威脅到用戶體檢誉察。
三与涡、制作靜態(tài)庫.a是指令集選擇
現(xiàn)在回歸到正題,如何制作一個“沒有問題”的.a靜態(tài)庫冒窍,通過以上信息了解到,當我們做App的時候豺鼻,為了追求高效率综液,并且減小包的大小,Build Active Architecture Only設置成YES儒飒,Architectures按Xcode默認配置就可以谬莹,因為arm64向前兼容。但制作.a靜態(tài)庫就不同了,因為要保證兼容性附帽,包括不同iOS設備以及模擬器運行不出錯埠戳,所以結合當前行業(yè)情況,要做到最大的兼容性蕉扮。
ValidArchitectures設置為:armv7|armv7s|arm64|i386|x86_64
Architectures設置不變(或根據(jù)你需要): armv7|arm64
然后分別選擇iOS設備和模擬器進行編譯整胃,最后找到相關的.a進行合包,使用lipo -create 真機庫.a的路徑 模擬器庫.a的的路徑 -output 合成庫的名字.a(詳情可以參考http://blog.csdn.net/lizhongfu2013/article/details/12648633)
這樣就制作了一個通用的靜態(tài)庫.a