armv6、armv7、armv7s、armv8、armv64及其i386、x86_64區別

ARM處理器指令集

一. 蘋果模擬器指令集:

指令集 分析
i386 針對intel通用微處理器32架構的
x86_64 針對x86架構的64位處理器
i386|x86_64 是Mac處理器的指令集,i386是針對intel通用微處理器32架構的。x86_64是針對x86架構的64位處理器。

    模擬器並不運行arm代碼,軟件會被編譯成x86可以運行的指令。所以生成靜態庫時都是會先生成兩個.a,一個是i386的用於在模擬器運行,另一個是在真實設備上運行的,然後再用命令將兩個.a合併成一個(1+1=1)。

二.蘋果設備指令集相關

位數 指令集
32ARM armv6armv7armv7s
64ARM arm64armv8
蘋果A7處理器支持兩個不同的指令集:32位ARM指令集(armv6|armv7|armv7s)和64位ARM指令集(`arm64 armv8`)。
指令集 支持設備
armv6 設備

iPhone, iPhone2, iPhone3G;

第一代、第二代 iPod Touch

armv7 設備

iPhone3GS, iPhone4, iPhone4S

iPad, iPad2, iPad3(The New iPad), iPad mini;

iPod Touch 3G, iPod Touch4

armv7s設備

iPhone5, iPhone5C,

iPad4(iPad with Retina Display)

ARMv8/arm64設備

iPhone5S,iPhone6s(plus)iPhoneSEiPhone7(plus)

iPad Air, iPad mini2(iPad mini with Retina Display)

三. 蘋果模擬器設備指令集總結

模擬器 設備

x86

(i386x86_64

arm

(armv6armv7armv7sarmv8armv64

當使用iOS模擬器的時候會遇到i386x86_64,iOS模擬器沒有arm指令集,編譯運行的是x86指令集,所以,只有在iOS設備上,纔會執行設備對應的arm指令集

四. XCode中與指令集相關

XCode中關於生成二進制包指令集相關的設置項有以下個:

圖.xcode設置

Xcode設置項 定義 注意事項
Architecture 指你支持的指令集

該選項指定了工程將被編譯成支持哪些指令集

如果支持的指令集數目有多個,就會編譯出包含多個指令集代碼的數據包,從而會造成最終編譯生成的包很大

Valid architectures 即將編譯的指令集

該選項指定可能支持的指令集,該Valid architectures列表Architectures列表交集,將是Xcode最終生成二進制包所支持的指令集

限制可能被支持的指令集的範圍

例如Valid Architectures設置的支持arm指令集有:armv7/armv7s/arm64,對應的Architectures設置的支持arm指令集有:armv7s,這時Xcode只會生成一個armv7s指令集的二進制包

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

使用條件:

①其值設置爲YES;

XCode成功連接調試設備;(必須同時滿足纔會起作用)Xcode中設置

①設置爲Yes, 編譯速度更,它只編譯當前的architecture版本;

②設置爲No,編譯速度更會編譯所有的版本

例如:當該選項設置成YES時,你連上一個armv7指令集的設備(iPhone5、5c),就算你的Valid ArchitecturesArchitectures都設置成armv7/armv7s/arm64,還是依然只會生成一個armv7指令集的二進制包。

假定:我們將Build Active Architecture Only值設置爲YES,同時Xcode連接上手機iPhone5S匹配指令集arm64)。如下五種情況總結如下表:

情況 Architectures ValidArchitectures 結果 分析
情況① armv7、
armv7s
arm64
armv6、
armv7s
arm64
arm64

因爲:取交集arm64armv7s,但iPhone5S匹配指令集arm64

所以:爲arm64

情況② armv6
armv7、
armv7s
armv6
armv7s
arm64
armv7s

因爲:取交集armv6armv7s,但iPhone5S匹配指令集arm64,但同時支持armv7s,同時XCode4.5開始,就再支持armv6指令集

所以:爲arm64

情況③ armv6
armv7
armv6、
armv7s、
arm64
armv7 無交集。但是因爲:ValidArchitectures支持armv7s則必然支持armv7,Architectures支持armv7,從XCode4.5開始,就再支持armv6指令集。所以:最終生成二進制指令集armv7
情況④ armv6 armv6、
armv7s、
arm64
<br />無響應

雖然編譯成功了,但是並沒有任何目標生成

因爲從XCode4.5開始,就再支持armv6指令集,所以列表中寫了也是白寫。

情況⑤ armv7、
armv7s、
arm64
armv7、
armv7s
error報錯 生成二進制包支持的指令集編譯出錯error信息:

No architectures to compile for (ONLY_ACTIVE_ARCH=YES, active arch=arm64, VALID_ARCHS=armv7
  • 分析
  • Build Active Architecture Only起作用時:連接的手機指令集匹配是由高到低(arm64 > armv7s > armv7)依次匹配的。
  • 指令集都是可以向下兼容
    比如,你的設備是armv7s指令集,那麼它也可以兼容運行比armv7s版本低的指令集:armv7、armv6
    xcodearmv6指令集的支持
  • Xcode4.5再支持armv6

如何選擇支持的指令集

如果你的軟件對安裝包大小非常敏感,你可以減少安裝包中的指令集數據包,而且這能達到立竿見影的效果。

很久前xcode支持的指令集是armv7/armv7s,後來改成只支持armv7後,比原來小了10MB左右。目前AppStore上的一些知名應用,比如百度地圖、騰訊地圖通過反彙編工具查看後,也都只支持armv7指令集。

根據向下兼容原則,armv7指令集的應用是可以正常在支持armv7s/arm64指令集的機器上運行的。

不過對於armv7s/arm64指令集設備來說,使用運行armv7應用是會有一定的性能損失,不過這種損失有多大缺乏權威統計數據,不會影響用戶體驗的。

建議:Valid Architectures通常Debug模式設置值爲YesRelease模式設置爲No

參考鏈接:

1.armv6, armv7, armv7s的區別
2.Apple移動設備處理器指令集 armv6、armv7、armv7s及arm64
3.Xcode設置項之Architectures和Valid Architectures
4.iOS工程如何支持64-bit

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章