1. 程式人生 > >iOS armv7,armv7s, arm64

iOS armv7,armv7s, arm64

目前ios的指令集有以下幾種:

  • armv6
    • iPhone
    • iPhone2
    • iPhone3G
    • 第一代和第二代iPod Touch
  • armv7
    • iPhone4
    • iPhone4S
  • armv7s
    • iPhone5
    • iPhone5C
  • arm64
    • iPhone5S
    • iPhone6
    • iPhone6+

================================================

Architecture : 指你想支援的指令集。

Valid architectures : 指即將編譯的指令集。

Build Active Architecture Only : 只是否只編譯當前適用的指令集。

================================================

新增後執行無反應

可能導致這個問題的原因有以下幾種:

TARGETS 的 iOS Deployment Target 版本比 PROJECT 的 iOS Deployment Target 版本低,例: TARGETS 用 5.0 而 PROJECT 用 6.0舊版程式Valid Architectures 需要使用 armv6,但是專案預設使用armv7 ; 專案名稱有奇怪的符號,例如經銷商資料空白等

解決方法
而解決以上問題的方法可以嘗試以下幾種方式:

  1. 在PROJECT 的 Info頁籤內的iOS Deployment Target與TARGETS 的 Summary頁籤內的部署目標兩個屬性設定使用一樣版本的SDK。
  2. 修改 PROJECT 的 Build Settings“頁籤及TARGETS 的 Build Settings頁籤內的Valid Architectures屬性為armv6 armv7體系。
  3. 點選到左方目錄區塊(Navigator View)的最上層後,在右方工具區塊((Utilities View)的 Identity > Project Name 屬性修改專案名稱, Product 210(3) 改成 Product,點選到專案資料夾目錄後修改右方工具區塊的Group Name跟專案名稱一樣,點選到 TARGETS 的 Summary 頁籤內的Bundle Identifier 屬性,專案名稱改成
    (TARGETNAME):com.yourcompany.
    (TARGET_NAME),在Xcode 工具列上找到 Product > Clean清除專案一次後再重新Build。
    4。建立一個新專案,將舊專案的程式,資源及參考重新加入新專案內。

ARMv6/7/7s & ARM64

在瞭解Architecture之前,先來認識這幾個名字。armv6, armv7, armv7s, arm64是ARM CPU的不同指令集,就像CPU內潛入的軟體版本。其在iPhone處理器型號為A4, A8…

arm 晶片 iPhone 機型
armv6 iPhone, iPhone2, iPhone 3G
armv7 iPhone 3GS, iPhone 4, iPhone 4S
armv7s iPhone 5
arm64 iPhone 5s

指令是向下相容的,如iPhone5s CPU支援arm64, 但它同時相容armv7s,只是如果程式使用armv7s指令進行編譯,可能無法充分發揮它的64位特性。

Architecture是指該程式編譯時的目標裝置(就是ARM指令集,如armv7,armv7s…),編譯期會為不同的指令集(裝置)生成專有的安裝包。不同裝置上會執行該裝置對應的指令集,如iPhone5s會優執行arm64(如果有)

XCode配置

在Target的Architectures設定項內,可以手工分別新增以上的這幾個值,從而新增或刪除特性指令集。為了更方便的使用指令組合,XCode中定義了一些變數,然而這些變數在不同的XCode版本下又有著不同的值。

  • $(ARCHS_STANDARD)
    這個為XCode中Architecture的預設值,XCode5中,該值為armv7, armv7s,在XCode 5.1時,強制加入了對arm64的編譯,於是該值為armv7, armv7s, arm64。
  • $(ARCHS_STANDARD_32_BIT)
    XCode 5和5.1中都為armv7, armv7s,舊一點的版本中應該對應的就只有armv7。
  • $(ARCHS_STANDARD_INCLUDING_64_BIT)
    XCode 5和5.1中都為armv7, armv7s, arm64

如果程式中設定的Architecture為armv7,當使用iPhone 5真機debug時,就會出現“xxxx does not contain a(n) armv7s slice:xxxxx for architecture armv7s”的編譯錯誤,想要解決這個問題,在Architecture中加上armv7s即可。這種情況更常見於第三方開源庫上。

XCode 5.1後強制加上了對arm64的支援,但很多很三方庫沒有進行更新,就導致會產生編譯錯誤。這個解決辦法就是刪掉XCode 5.1中的預設Architecture,然後分別加上armv7, armv7s,clean後重新build就可以了。等第三方庫都支援arm64後,再把該值改回來即可。

同時開啟arm64支援後,就不能對iOS 5.1.1之前版本進行開發,要強制將deployment target 設定為5.1.1或之後。

XCode 4.5中移除了對arm6的支援,如果想開發對arm6支援的應用,就要保持用老的XCode了。

檢視.a庫支援的指令集

可以通過該lipo命令檢視.a庫所支援的指令集。

~/Library/Developer/Xcode/DerivedData/xxxx/Build/Products/Debug-iphoneos
$ lipo -info *.a
Architectures in the fat file: libPods-AFNetworking.a are: armv7 armv7s
Architectures in the fat file: libPods.a are: armv7 armv7s

Active Architecture

Architectures下有一個Bool型的配置項,叫作Build Active Architecture Only。

YES,表示會針對目標裝置進行編譯,只會編譯對應指令集的包,此時的安裝包比較小,但只針對於該指令集裝置;
NO,編譯器會整合兩個指令集到一起,生成的安裝包比較大,但是能在不同的裝置上安裝執行。
一般都是Debug時“Build Active Architecture Only”選擇YES,用當前的架構看程式碼邏輯是否有問題;而在Release時選擇NO,來適配不同的裝置。

此外,模擬器並不執行arm程式碼,軟體會被編譯成x86可以執行的指令。所以生成靜態庫時都是會先生成兩個.a,一個是i386的用於在模擬器執行,另一個是在真實裝置上執行的,然後再用命令將兩個.a進行合併成。

CocoaPods與Architecture

CocoaPods中所生成Pod專案時,會根據當前Project中的配置來為Pod包的Target Architecture配置。結束後,會有下面的文字提示。

[!] Found multiple values (‘armv7’, ‘armv7s’) for the architectures (‘ARCHS’) build setting for the ‘Pods’ target definition. Using the first.

也就是所如果有多個配置的話,它只會統一的給所有的包target設定為第一個(舉例,在Origin Projectg下配置的Architecture為armv7 & armv7s 兩個項時,pod生成的專案的所有target中都只預設新增armv7一個項)。

對於XCode 5.1中64位的Error,用(ARCHSSTANDARD32BIT)(ARCHS_STANDARD)可以避免這樣的問題。