天天看點

armv7、arm64、Valid Architectures是什麼東西,有啥差別

iOS 中的 armv7,armv7s,arm64,i386,x86_64 都是什麼

在做靜态庫的時候以及引用靜态庫的時候經常會遇到一些關于真機模拟器不通用的情況,會報錯找不到相應庫導緻編譯失敗,

這裡簡單記錄一下各種裝置支援的架構。

iOS測試分為模拟器測試和真機測試,處理器分為32位處理器,和64位處理器,

模拟器32位處理器測試需要i386架構,(iphone5,iphone5s以下的模拟器)

模拟器64位處理器測試需要x86_64架構,(iphone6以上的模拟器)

真機32位處理器需要armv7,或者armv7s架構,(iphone4真機/armv7, ipnone5,iphone5s真機/armv7s)

真機64位處理器需要arm64架構。(iphone6,iphone6p以上的真機)

project -> target -> building setting -> Arhitectures 設定

debug屬性設定為no的時候,會編譯支援所有架構的版本,編譯的速度會變慢,設定為yes 的時候,隻編譯目前的architecture版本,編譯速度快。

一般情況下,debug 設定為yes,release為no,這樣發行版本能适應不同裝置。

現在先說說不同型号的iPhone都使用的是什麼指令集:

ARMv8/ARM64 = iPhone 5s, iPad Air, Retina iPad Mini

ARMv7s = iPhone 5, iPhone 5c, iPad 4

ARMv7 = iPhone 3GS, iPhone 4, iPhone 4S, iPod 3G/4G/5G, iPad, iPad 2, iPad 3, iPad Mini

ARMv6 = iPhone, iPhone 3G, iPod 1G/2G

設定你想支援的指令集

Xcode中關于生成二進制包指令集相關的設定項有以下三個:

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.

該編譯選項指定了工程将被編譯成支援哪些指令集,支援指令集是通過編譯生成對應的二進制資料包實作的,如果支援的指令集數目有多個,就會編譯出包含多個指令集代碼的資料包,造成最終編譯的包很大。

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.

該編譯項指定可能支援的指令集,該清單和Architectures清單的交集,将是Xcode最終生成二進制包所支援的指令集。

比如,你的Valid Architectures設定的支援arm指令集版本有:armv7/armv7s/arm64,對應的Architectures設定的支援arm指令集版本有:armv7s,這時Xcode隻會生成一個armv7s指令集的二進制包。

Build Active Architecture Only

官方文檔說明:

Boolean value. Specifies whether the product includes only object code for the native architecture.

該編譯項用于設定是否隻編譯目前使用的裝置對應的arm指令集。

當該選項設定成YES時,你連上一個armv7指令集的裝置,就算你的Valid Architectures和Architectures都設定成armv7/armv7s/arm64,還是依然隻會生成一個armv7指令集的二進制包。

當然該選項起作用的前提是你的Xcode必須成功連接配接了調試裝置。如果你沒有任何活躍裝置,即Xcode沒有成功連接配接調試裝置,就算該設定項設定成YES依然還會編譯Valid Architectures和Architectures指定的二進制包。

通常情況下,該編譯選項在Debug模式都設成YES,Release模式都設成NO。

說明

指令集都是可以向下相容的

比如,你的裝置是armv7s指令集,那麼它也可以相容運作比armv7s版本低的指令集:armv7、armv6

xcode對armv6指令集的支援

Xcode4.5起不再支援armv6,Xcode4.5的release notes中明确指出:

Changes

General: iOS

This version of Xcode does not generate armv6 binaries. 12282156

The minimum deployment target is iOS 4.3. 12282166

如何選擇支援的指令集

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

我們的項目之前支援的指令集是armv7/armv7s,後來改成隻支援armv7後,比原來小了10MB左右。目前AppStore上的一些知名應用,比如百度地圖、騰訊地圖通過反彙編工具檢視後,也都隻支援armv7指令集。

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

不過對于armv7s/arm64指令集裝置來說,使用運作armv7應用是會有一定的性能損失,不過這種損失有多大缺乏權威統計資料,個人認為是不會影響使用者體驗的。