iOS開發~製作同時支持armv7,armv7s,arm64,i386,x86_64的靜態庫.a

来源:http://www.cnblogs.com/lurenq/archive/2017/06/23/7068468.html
-Advertisement-
Play Games

armv7,armv7s,arm64,i386,x86_64 詳解 一、概要 平時項目開發中,可能使用第三方提供的靜態庫.a,如果.a提供方技術不成熟,使用的時候就會出現問題,例如: 在真機上編譯報錯:No architectures to compile for (ONLY_ACTIVE_ARCH ...


 

armv7,armv7s,arm64,i386,x86_64 詳解

一、概要

平時項目開發中,可能使用第三方提供的靜態庫.a,如果.a提供方技術不成熟,使用的時候就會出現問題,例如:

在真機上編譯報錯: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移動設備處理器指令集相關的一些細節知識。

 

二、幾個重要概念

1、ARM

ARM處理器,特點是體積小、低功耗、低成本、高性能,所以幾乎所有手機處理器都基於ARM,在嵌入式系統中應用廣泛。

 

2、ARM處理器指令集

armv6|armv7|armv7s|arm64都是ARM處理器的指令集,這些指令集都是向下相容的,例如armv7指令集相容armv6,只是使用armv6的時候無法發揮出其性能,無法使用armv7的新特性,從而會導致程式執行效率沒那麼高。

還有兩個我們也很熟悉的指令集: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. 

指定工程被編譯成可支持哪些指令集類型,而支持的指令集越多,就會編譯出包含多個指令集代碼的數據包,對應生成二進位包就越大,也就是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編譯出來的二進位包類型最終從這些類型產生,而編譯出哪種指令集的包,將由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) 參數,則打的包裡面有32位、64位兩份代碼,在iPhone5s( iPhone5s的cpu是64位的 )下,會首選運行64位代碼包, 其餘的iPhone( 其餘iPhone都是32位的,iPhone5c也是32位 ),只能運行32位包,但是包含兩種架構的代碼包,只有運行在ios6,ios7系統上。 
這也就是說,這種打包方式,對手機幾乎沒要求,但是對系統有要求,即ios6以上。 
而使用 standard architectures (armv7,armv7s) 參數, 則打的包里只有32位代碼, iPhone5s的cpu是64位,但是可以相容32位代碼,即可以運行32位代碼。但是這會降低iPhone5s的性能。 其餘的iPhone對32位代碼包更沒問題, 而32位代碼包,對系統也幾乎也沒什麼限制。 
所以總結如下:  

要發揮iPhone5s的64位性能,就要包含64位包,那麼系統最低要求為ios6。 如果要相容ios5以及更低的系統,只能打32位的包,系統都能通用,但是會喪失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安裝包大小有要求,可以減少安裝包的指令集的數量,這樣就可以儘可能的減少包的大小。當然這樣做會使部分設備出現性能損失,當然在普通應用中這點體現幾乎感覺不到,至少不會威脅到用戶體檢。

 

三、製作靜態庫.a是指令集選擇

現在回歸到正題,如何製作一個“沒有問題”的.a靜態庫,通過以上信息瞭解到,當我們做App的時候,為了追求高效率,並且減小包的大小,Build Active Architecture Only設置成YES,Architectures按Xcode預設配置就可以,因為arm64向前相容。但製作.a靜態庫就不同了,因為要保證相容性,包括不同iOS設備以及模擬器運行不出錯,所以結合當前行業情況,要做到最大的相容性。

ValidArchitectures設置為:armv7|armv7s|arm64|i386|x86_64 

Architectures設置不變(或根據你需要):  armv7|arm64

然後分別選擇iOS設備和模擬器進行編譯,最後找到相關的.a進行合包,使用lipo -create 真機庫.a的路徑 模擬器庫.a的的路徑 -output 合成庫的名字.a(詳情可以參考http://blog.csdn.NET/lizhongfu2013/article/details/12648633)

這樣就製作了一個通用的靜態庫.a

 

 二 .a 與 FrameWork 合併技巧 查看.a 和 FrameWork 的適配機型     lipo -create Debug-iphoneos/libMJRefresh.a Debug-iphonesimulator/libMJRefresh.a -output libMJRefresh.a
lipo -create /Users/harvey/Library/Developer/Xcode/DerivedData/FMDB-ctegiztcjikewoeprxxtmryzetfa/Build/Products/Release-iphoneos/libFMDB.a /Users/harvey/Library/Developer/Xcode/DerivedData/FMDB-ctegiztcjikewoeprxxtmryzetfa/Build/Products/Release-iphonesimulator/libFMDB.a -output /Users/harvey/Desktop/libFMDB.a
lipo -create /Users/harvey/Library/Developer/Xcode/DerivedData/FMDB-clvayfrjgytqrbdkyqrtcjkxfeuz/Build/Products/Release-iphonesimulator/FMDB.framework/FMDB /Users/harvey/Library/Developer/Xcode/DerivedData/FMDB-clvayfrjgytqrbdkyqrtcjkxfeuz/Build/Products/Release-iphoneos/Release-iphoneos.framework/FMDB -output /Users/harvey/Desktop/FMDB
Architectures in the fat file: /Users/kunkkaqi/Desktop/TestFrameWork.framework/TestFrameWork.lipo are: i386 armv7 armv7s x86_64 arm64         
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...