最近一次的Xcode 6更新默認不再支持arm7s架構,究竟是要廢除不用呢還是僅僅只是一個疏忽?
目前的Xcode 6配置里定義${ARCHS_STANDARD}為armv7, arm64,當然這個定義前提是它會一再要求你刪除掉你原本設定的構建架構。如果你選擇按它所做的,你會發(fā)現你再也不能編譯任何armv7s架構的東西。
當前iPhone5的A6和iPad4的A6X兩款CPU都是armv7s架構,而之后在iPhone 5S、iPad Air以及iPad Mini Retina采用的A7處理器則是屬于64位的arm64架構。
之前蘋果為Xcode提供了armv7s架構支持的時候使得很多采用第三方庫的開發(fā)者感到困擾,比如想使用Google Analytics,為了構建一個App就要求鏈接器所鏈接的所有靜態(tài)庫都必須支持CPU的架構。當第三方庫競相更新以支持最新架構的同時開發(fā)者們不得令自己的App停止了對armv7s的支持。
這倒不是什么大問題,雖然或多或少存在一些瑕疵,A6一樣可以運行基于armv7架構的代碼。會讓人感到不爽的可能就是某天你的Xcode突然無法構建代碼然后告訴你一個關于丟失某架構鏈接庫的錯誤,其實不過就是因為你升級了你的Xcode而已。
想要消滅這個錯誤輕而易舉。作為一個開發(fā)者你應該知道怎么打開Xcode的recommendation然后刪除掉你在架構設置里寫過的東西。如果設置顯示為粗體,可用"Command+Backspace"組合鍵使其恢復為項目范圍內的設置。
如果你是提供組件而非開發(fā)的話,需要的方案可能會有所不同。你會讓開發(fā)者自行決定是否支持armv7s,因此你需要在你的靜態(tài)庫和框架內提供對armv7s架構的支持。
而后開發(fā)者的鏈接器會選擇出應用所需的架構,你會發(fā)現在"Build Active Architecture Only"設置為No的情況下會好有好幾種架構被囊括在內。調試版本的構建默認這一設置為Yes而且只會支持當期設備或者模擬器的架構,而發(fā)行版本則默認該項為No而且支持所有處理器架構。
在靜態(tài)庫構建日志里面你會發(fā)現一行有關所有庫及架構的,緊隨其后的一行則是關于將所有獨立庫整合進一個"碩大"的通用庫中去的。
另一查看某一架構是否支持的方法是使用file命令:
file libBarCodeKit.a libBarCodeKit.a: Mach-O universal binary with 3 architectures libBarCodeKit.a (for architecture armv7):current ar archive random library libBarCodeKit.a (for architecture arm64):current ar archive random library libBarCodeKit.a (for architecture armv7s):current ar archive random library這個庫支持了目前所有移動架構。如果你構建的是包括了模擬器架構的可運行版本的靜態(tài)庫或者靜態(tài)架構的話,那么應該是會像下面這樣:
file DTRichTextEditor DTRichTextEditor: Mach-O universal binary with 5 architectures DTRichTextEditor (for architecture armv7):current ar archive random library DTRichTextEditor (for architecture armv7s):current ar archive random library DTRichTextEditor (for architecture arm64):current ar archive random library DTRichTextEditor (for architecture i386):current ar archive random library DTRichTextEditor (for architecture x86_64):current ar archive random library總結一下:蘋果又在此迫使我們做出新選擇:放棄對armv7s的支持,這一架構已經隨著兩代64位產品的出現而遭報銷。不過作為一個組件開發(fā)人員我認為仍然應該包括armv7s然后讓開發(fā)者去決定支不支持。