iOS 指令集架構Architectures armv6、armv7、armv7s、arm64、arm64e、x86_64、i386

1. ARM架構

ARM架構過去稱作進階精簡指令集機器(Advanced RISC Machine,更早稱作:Acorn RISC Machine),是一個32位精簡指令集(RISC)處理器架構,ARM處理器非常適用於移動通訊領域,符合其主要設計目標爲低耗電的特性。

ARM和Intel處理器的第一個區別是,前者使用精簡指令集(RISC),而後者使用複雜指令集(CISC)。

2. ARM處理器指令集

ARM指令集是指計算機ARM操作指令系統。

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

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

i386通常被用來作爲對Intel 32位微處理器的統稱。X86-64可在同一時間內處理64位的整數運算,併兼容X86-32架構,x86_64是針對x86架構的64位處理器。當使用iOS模擬器的時候會遇到i386|x86_64,iOS模擬器沒有運行arm指令集,編譯運行的是x86指令集,所以,只有在iOS設備上,纔會執行設備對應的arm指令集。
在這裏插入圖片描述
這裏是設備對應的Achitectures指令集:

ARM CPU的不同指令集 對應設備
armv7 iPhone 3GS,iPhone4,iPhone 4s,iPad,iPad2,iPad3(The New iPad),iPad mini,iPod Touch 3G,iPod Touch4
armv7s iPhone5, iPhone5C,iPad4,iPod5
arm64 iPhone5s,iPhone6、7、8,iPhone6、7、8 Plus,iPhone X,iPad Air,iPad mini2(iPad mini with Retina Display),
arm64e XS/XS Max/XR/ iPhone 11, iPhone 11 pro
x86_64 模擬器64位處理器
i386 模擬器32位處理器測試

3. 關於Architectures 淺談

iOS項目打包,或者只是在項目裏面調用第三方靜態庫抑或是自己新建一個靜態庫,就要無可避免的和Architectures打交道。

  • 什麼是Architectures?
      architectures:n. 建築;架構(architecture的複數)。

  • 關於Xcode中的Architectures 和 Valid Architectures

Architectures
指定工程支持的指令集的集合,如果設置多個architecture,則生成的二進制數據包會包含多個指令集代碼,體積會變大。

Valid Architectures
有效的指令集集合,Architectures與Valid Architectures 的交集來確定最終的數據包包含的指令集代碼。
Xcode9.1創建的工程,Valid Architectures默認有這幾個:armv7 armv7s arm64,說明目前默認最低支持到iPhone5,也就是iOS8(iPhone5才能使用iOS8)

二者的區別和聯繫:
  Valid Architectures表示的是你的項目所支持的處理器架構列表,是一個大的集合,而Architectures表示的是你的項目編譯的時候最終生成的二進制文件包含的處理器架構集合。

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

  • ARM處理器指令集

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

i386|x86_64 是Mac處理器的指令集,i386是針對intel通用微處理器32架構的. x86_64是針對x86架構的64位處理器. 所以當使用iOS模擬器的時候會遇到i386|x86_64, ios模擬器沒有arm指令集.

4. Build Active Architectures Only配置

該編譯項用於設置是否只編譯當前使用的設備對應的arm指令集

  1. 設置成YES時,你連上一個armv7指令集的設備,就算你的Valid Architectures和Architectures都設置成armv7/armv7s/arm64,還是依然只會生成一個armv7指令集的二進制包.(該選項起作用的前提是你的Xcode必須成功連接了調試設備! 如果你沒有任何活躍設備,即Xcode沒有成功連接調試設備,就算該設置項設置成YES依然還會編譯Valid Architectures和Architectures指定的二進制包.)
  2. 通常情況下,該編譯選項在Debug模式都設成YES,Release模式都設成NO
    在這裏插入圖片描述
    Debug和Release下的設置:
      這個屬性主要用在Debug的時候。根據字面意思,就是說只編譯你當前連接設備(活躍狀態)的處理器版本。這個屬性不需要修改,Xcode的默認設置就是Debug爲Yes,Release 爲No。
      Debug模式設置爲Yes,編譯的時候只編譯成當前連接設備的處理器版本,會大大縮短編譯時間。
    Release模式設置爲No,你要適配市面上大部分手機,如果Release你還設置成Yes,那麼你生成的安裝包只能安裝在你當前連接設備的編譯類型的手機上。當然,這也是你Release編譯所花的時間要大大超過Debug的原因。

5. Supported Platform 配置

指定支持的設備平臺
在這裏插入圖片描述

6. Base SDK配置

Base SDK–>指的是當前編譯所用的SDK 版本
  Base SDK設置會引導編譯器使用該版本的SDK編譯和構建應用,也就是說,它會直接控制應用使用哪些API. 默認情況下,Xcode中創建的新工程總是使用最新版本的SDK,而蘋果會處理API的廢棄,如下圖:
  在這裏插入圖片描述

7. 總結

iOS項目打包,或者只是在項目裏面調用第三方靜態庫抑或是自己新建一個靜態庫,就要無可避免的和Architectures打交道。

  • standard architectures
       使用 standard architectures (including 64-bit)(armv7,arm64, arm64e) 參數,則打的包裏面有32位、64位兩份代碼,在iPhone5s( iPhone5s的cpu是64位的 )下,會首選運行64位代碼包, 其餘的iPhone( 其餘iPhone都是32位的,iPhone5c也是32位 ),只能運行32位包,但是包含兩種架構的代碼包,只有運行在ios6以上的系統上。
       使用 standard architectures (armv7,armv7s) 參數, 則打的包裏只有32位代碼, iPhone5s的cpu是64位,但是可以兼容32位代碼,即可以運行32位代碼。但是這會降低iPhone5s的性能。 其餘的iPhone對32位代碼包更沒問題, 而32位代碼包,對系統也幾乎也沒什麼限制。
       所以:
       要發揮iPhone5s的64位性能,就要包含64位包,那麼系統最低要求爲ios6。 如果要兼容ios5以及更低的系統,只能打32位的包,系統都能通用,但是會喪失iPhone5s的性能。當然這樣做會使部分設備出現性能損失,當然在普通應用中這點體現幾乎感覺不到,至少不會威脅到用戶體檢。

  • 靜態庫的製作
       製作靜態庫.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。

參考

https://www.cnblogs.com/lxlx1798/p/10147065.html

https://www.cnblogs.com/lulushen/p/8135269.html

https://stackoverflow.com/questions/52624308/xcode-arm64-vs-arm64e

發佈了147 篇原創文章 · 獲贊 13 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章