iOS armv7, armv7s, arm64區(qū)別與應用32位、64位配置

iOS armv7, armv7s, arm64區(qū)別與應用32位请契、64位配置

歷程

  1. 2015年2月1日不允許不支持arm64的應用的提交胳赌;
  2. iOS10發(fā)布后,如果你的應用中使用到了32位的類匙隔、庫疑苫,沒有相應支持64位機型的庫,則首次啟動后會彈窗式提示:“ xxx可能使iPhone變慢...”;
  3. iOS10.3公測版發(fā)布:封殺32位應用捍掺;
  4. 蘋果系統(tǒng)(iOS7/iOS8-iOS9),32位的framework和64位的framework是共存的撼短,所以如果所有的應用都是64位的話,系統(tǒng)就自動不加載32位的framework挺勿,這樣可以少占用資源曲横,另外對運行的速度是有好處的,也就是說不瓶,你會感覺手機運行的快了一點禾嫉。應用在兼容64位系統(tǒng)后,內(nèi)存的占用肯定會變多一點蚊丐,不過性能也有相應的提升熙参。

下面了解下64與32位的區(qū)別:

數(shù)據(jù)類型的變化:
  1. 在32位的年代,使用的是IPL32的規(guī)范麦备,到了64位之后孽椰,改成了LP64規(guī)范。
  2. 數(shù)據(jù)類型里面凛篙,NSInteger在32位時等同于int黍匾,在64位時等同于long,而這個數(shù)據(jù)結(jié)構(gòu)使用很廣呛梆,很多不規(guī)范的時候會直接和int替換使用锐涯,在32位是毫無問題,但在64位時削彬,這就是隱患了全庸。CGFloat也有同樣的問題
  3. 如果使用了偏移量來訪問struct的項,那么需要認真仔細的檢查融痛,其余的還算好壶笼,當然如果你用了malloc,那么也請檢查一下分配的內(nèi)存大小雁刷,建議是多使用sizeof來幫助計算覆劈。
  4. 方法調(diào)用上的變化:在64位系統(tǒng)在運行時調(diào)用函數(shù)和32位系統(tǒng)是不同的。主要的區(qū)別在于傳遞具有可變參數(shù)個數(shù)的函數(shù)的參數(shù)時沛励,我們來看下面的代碼:
    int fixedFunction(int a, int b);  
    int variadicFunction(int a, ...); 
       int main  
    {  
    int value2 = fixedFunction(5,5);  
    int value1 = variadicFunction(5,5);  
    }
    
    第一個函數(shù)是固定傳入2個參數(shù)责语,第二個函數(shù)是參數(shù)個數(shù)不定的,在使用中,也
    傳入了2個參數(shù)目派。在32位系統(tǒng)下坤候,這兩個函數(shù)的參數(shù)傳遞是非常類似的,在64
    位系統(tǒng)下企蹭,這兩者就是截然不同了白筹。
  5. 項目中使用的第三方庫肯定需要支持64位系統(tǒng)智末,否則還是白搭。大家需要檢查自己使用的第三方的庫徒河,看是否支持64位的版本系馆。蘋果系統(tǒng)中(iOS7/iOS8-iOS9),32位的framework和64位的framework是共存的,所以如果所有的應用都是64位的話顽照,系統(tǒng)就自動不加載32位的framework由蘑,這樣可以少占用資源,另外對運行的速度是有好處的代兵,也就是說尼酿,你會感覺手機運行的快了一點。應用在兼容64位系統(tǒng)后奢人,內(nèi)存的占用肯定會變多一點谓媒,不過性能也有相應的提升。

增加應用對64位的支持:

一何乎、配置前確認工作:

如果你不能確定庫是否支持了arm64句惯,可以在cmd模式下用file命令來檢查一下庫文件:

$lipo -info /Users/xxx/NHPushStreamSDK/FFmpeg-iOS/lib/libavcodec.a
//指令說明:lipo -info 靜態(tài)庫(動態(tài)庫)文件完整路徑

armv7,armv7s和arm64,i386,x86_64這些都代表什么支救?

  • armv7|armv7s|arm64都是ARM處理器的指令集
  • i386|x86_64 是Mac處理器的指令集

了解ARM

__Arm處理器抢野,因為其低功耗和小尺寸而聞名,幾乎所有的手機處理器都基于arm各墨,其在嵌入式系統(tǒng)中的應用非常廣泛指孤,它的性能在同等功耗產(chǎn)品中也很出色。

Armv6贬堵、armv7恃轩、armv7s、arm64都是arm處理器的指令集黎做,所有指令集原則上都是向下兼容的叉跛,如iPhone4S的CPU默認指令集為armv7指令集,但它同時也兼容armv6指令集蒸殿,只是使用armv6指令集時無法充分發(fā)揮其性能筷厘,即無法使用armv7指令集中的新特性,同理宏所,iPhone5的處理器標配armv7s指令集酥艳,同時也支持armv7指令集,只是無法進行相關(guān)的性能優(yōu)化爬骤,從而導致程序的執(zhí)行效率沒那么高充石。

這些指令集在哪些設(shè)備中有用到呢?

arm64 armv7s armv7
iPhone6s iPhone5 iPhone4
iphone6s plus iPhone5C iPhone4S
iphone6 iPad4(iPad with Retina Display) iPad
iphone6 plus iPad2
iphone5s iPad3(The New iPad)
iPad Air iPad mini
iPad mini2 (iPad mini with Retina Display) iPod Touch 3G
iPod Touch4

i386是針對intel通用微處理器32位處理器
x86_64是針對x86架構(gòu)的64位處理器

模擬器32位處理器測試需要i386架構(gòu)霞玄,
模擬器64位處理器測試需要x86_64架構(gòu)赫冬,
真機32位處理器需要armv7,或者armv7s架構(gòu)浓镜,
真機64位處理器需要arm64架構(gòu)。

Xcode Build Setting中指令集相關(guān)選項釋義
  1. Architectures
    指定工程被編譯成可支持哪些指令集類型劲厌,而支持的指令集越多,就會編譯出包含多個指令集代碼的數(shù)據(jù)包听隐,對應生成二進制包就越大补鼻,也就是ipa包會變大(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. )。

  2. Valid Architectures
    限制可能被支持的指令集的范圍雅任,也就是Xcode編譯出來的二進制包類型最終從這些類型產(chǎn)生风范,而編譯出哪種指令集的包,將由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.)沪么。

  3. Build Active Architecture Only
    指定是否只對當前連接設(shè)備所支持的指令集編譯
    當其值設(shè)置為YES硼婿,這個屬性設(shè)置為yes,是為了debug的時候編譯速度更快禽车,它只編譯當前的architecture版本寇漫,而設(shè)置為no時,會編譯所有的版本殉摔。 所以州胳,一般debug的時候可以選擇設(shè)置為yes,release的時候要改為no逸月,以適應不同設(shè)備栓撞。



二、工程配置碗硬,增加64位的支持

note:在Xcode6.1.1及以上 Valid Architectures 設(shè)置里瓤湘, 默認為 Standard architectures(armv7,arm64),如果你想改的話,自己在other中更改恩尾。

  • 使用 standard architectures (including 64-bit)(armv7,arm64) 參數(shù)弛说,則打的包里面有32位、64位兩份代碼特笋,在iPhone5s( iPhone5s的cpu是64位的 )下剃浇,會首選運行64位代碼包, 其余的iPhone( 其余iPhone都是32位的,iPhone5c也是32位 )猎物,只能運行32位包虎囚,但是包含兩種架構(gòu)的代碼包,只有運行在ios6蔫磨,ios7系統(tǒng)上淘讥。 這也就是說,這種打包方式堤如,對手機幾乎沒要求蒲列,但是對系統(tǒng)有要求窒朋,即ios6以上。
  • 使用 standard architectures (armv7,armv7s) 參數(shù)蝗岖, 則打的包里只有32位代碼侥猩, iPhone5s的cpu是64位,但是可以兼容32位代碼抵赢,即可以運行32位代碼欺劳。但是這會降低iPhone5s的性能。 其余的iPhone對32位代碼包更沒問題铅鲤, 而32位代碼包划提,對系統(tǒng)也幾乎也沒什么限制。
  • 要發(fā)揮iPhone5s及以上的64位機型性能邢享,就要包含64位包鹏往,那么系統(tǒng)最低要求為ios6。 如果要兼容ios5以及更低的系統(tǒng)骇塘,只能打32位的包伊履,系統(tǒng)都能通用,但是會喪失iPhone5s的性能绪爸。

Valid Architectures與Architectures指令集交集表:

Valid Architectures設(shè)置 Architectures設(shè)置 生成二進制包支持的指令集(取交集)
armv7, armv7s, arm64 armv7s armv7s
armv7, armv7s armv7s,arm64 armv7s
armv7, armv7s, arm64 armv6, armv7s, arm64 armv7s, arm64
armv6, armv7, armv7s armv6, armv7s, arm64 armv6, armv7s
armv7, arm64 ,armv7s armv7, arm64 ,armv7s armv7, arm64 ,armv7s
armv7, armv7s, arm64 armv7湾碎,armv7s armv7s, armv7
  1. 比如 Valid Architectures設(shè)置的支持arm指令集版本有:armv7/armv7s/arm64,對應的Architectures設(shè)置的支持arm指令集版本有:armv7s奠货,這時Xcode只會生成一個armv7s指令集的二進制包介褥。
  2. xcode默認的設(shè)置:
    Architectures : Strandard architectures - $(ARCHS_STANDARD) //相當于arm64 armv7s armv7
    Valid Architectures : arm64 armv7s armv7
  3. 如果你對ipa安裝包大小有要求,可以減少安裝包的指令集的數(shù)量递惋,這樣就可以盡可能的減少包的大小柔滔。
自定設(shè)置

系統(tǒng)默認設(shè)置


制作靜態(tài)庫.a是指令集選擇

現(xiàn)在回歸到正題,如何制作一個“沒有問題”的.a靜態(tài)庫萍虽,通過以上信息了解到睛廊,當我們做App的時候,為了追求高效率杉编,并且減小包的大小超全,Build Active Architecture Only設(shè)置成YES,Architectures按Xcode默認配置就可以邓馒,因為arm64向前兼容嘶朱。但制作.a靜態(tài)庫就不同了,因為要保證兼容性光酣,包括不同iOS設(shè)備以及模擬器運行不出錯疏遏,所以結(jié)合當前行業(yè)情況,要做到最大的兼容性。
ValidArchitectures設(shè)置為:armv7|armv7s|arm64|i386|x86_64
Architectures設(shè)置不變(或根據(jù)你需要): armv7|arm64
然后分別選擇iOS設(shè)備和模擬器進行編譯财异,最后找到相關(guān)的.a進行合包:

  • 合并兩個不同構(gòu)架的庫文件
$ lipo -create /Users/xxxxxx/lib/libv7.a  /Users/xxxxxx/lib/lib64.a  -output /Users/xxxxxx/lib/lib.a
//指令說明: lipo -create 庫文件1一完整路徑  庫文件2完整路徑  -output 輸出的文件名路徑
  • 從某個庫文件中提起出指定構(gòu)架的庫文件
Desktop$ lipo -thin arm64 debugserver -output debugserver2
//指令說明:lipo -thin 對應構(gòu)架指令 對應文件 -output 輸出的文件名路徑

使用lipo -create 真機庫.a的路徑 模擬器庫.a的的路徑 -output 合成庫的名字.a 倘零,這樣就制作了一個通用的靜態(tài)庫.a。
制作動態(tài)戳寸、靜態(tài)庫詳情可以參考【鏈接】


其它注意點:

  1. 因此如果一些程序中使用的靜態(tài)庫不支持armv7s呈驶,而你的工程支持armv7s時,就會出現(xiàn)“xxxx does not contain a(n) armv7s slice:xxxxx for architecture armv7s"的編譯錯誤庆揩,想要解決這個問題俐东,有兩個方法:
    1. 如果是開源的,能夠找到源代碼订晌,則可以用源代碼重新打一個支持armv7s的libaray, 或者在工程中直接使用源代碼,而不是靜態(tài)庫蚌吸。
    2. 如果不是開源的锈拨,要么就坐等第三方庫的支持,要么就暫時讓你的工程不支持armv7s羹唠。
  2. 此外奕枢,模擬器并不運行arm代碼,軟件會被編譯成x86可以運行的指令佩微。所以生成靜態(tài)庫時都是會先生成兩個.a缝彬,一個是i386的用于在模擬器運行,另一個是在真實設(shè)備上運行的哺眯,然后再用命令將兩個.a合并成一個谷浅。
  3. 需要注意的是iOS模擬器沒有運行arm指令集,編譯運行的是x86指令集奶卓,所以一疯,只有在iOS設(shè)備上,才會執(zhí)行設(shè)備對應的arm指令集夺姑。
  4. 連接的手機指令集匹配是由高到低(arm64 > armv7s > armv7)依次匹配的墩邀。

部份資源鏈接

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市盏浙,隨后出現(xiàn)的幾起案子眉睹,更是在濱河造成了極大的恐慌,老刑警劉巖废膘,帶你破解...
    沈念sama閱讀 217,509評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件竹海,死亡現(xiàn)場離奇詭異,居然都是意外死亡殖卑,警方通過查閱死者的電腦和手機站削,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評論 3 394
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來孵稽,“玉大人许起,你說我怎么就攤上這事十偶。” “怎么了园细?”我有些...
    開封第一講書人閱讀 163,875評論 0 354
  • 文/不壞的土叔 我叫張陵惦积,是天一觀的道長。 經(jīng)常有香客問我猛频,道長狮崩,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,441評論 1 293
  • 正文 為了忘掉前任鹿寻,我火速辦了婚禮睦柴,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘毡熏。我一直安慰自己坦敌,他們只是感情好,可當我...
    茶點故事閱讀 67,488評論 6 392
  • 文/花漫 我一把揭開白布痢法。 她就那樣靜靜地躺著狱窘,像睡著了一般。 火紅的嫁衣襯著肌膚如雪财搁。 梳的紋絲不亂的頭發(fā)上蘸炸,一...
    開封第一講書人閱讀 51,365評論 1 302
  • 那天,我揣著相機與錄音尖奔,去河邊找鬼搭儒。 笑死,一個胖子當著我的面吹牛越锈,可吹牛的內(nèi)容都是我干的仗嗦。 我是一名探鬼主播,決...
    沈念sama閱讀 40,190評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼甘凭,長吁一口氣:“原來是場噩夢啊……” “哼稀拐!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起丹弱,我...
    開封第一講書人閱讀 39,062評論 0 276
  • 序言:老撾萬榮一對情侶失蹤德撬,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后躲胳,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蜓洪,經(jīng)...
    沈念sama閱讀 45,500評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,706評論 3 335
  • 正文 我和宋清朗相戀三年坯苹,在試婚紗的時候發(fā)現(xiàn)自己被綠了隆檀。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,834評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖恐仑,靈堂內(nèi)的尸體忽然破棺而出泉坐,到底是詐尸還是另有隱情,我是刑警寧澤裳仆,帶...
    沈念sama閱讀 35,559評論 5 345
  • 正文 年R本政府宣布腕让,位于F島的核電站,受9級特大地震影響歧斟,放射性物質(zhì)發(fā)生泄漏纯丸。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,167評論 3 328
  • 文/蒙蒙 一静袖、第九天 我趴在偏房一處隱蔽的房頂上張望觉鼻。 院中可真熱鬧,春花似錦队橙、人聲如沸滑凉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至咒钟,卻和暖如春吹由,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背朱嘴。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評論 1 269
  • 我被黑心中介騙來泰國打工倾鲫, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人萍嬉。 一個月前我還...
    沈念sama閱讀 47,958評論 2 370
  • 正文 我出身青樓乌昔,卻偏偏與公主長得像,于是被迫代替她去往敵國和親壤追。 傳聞我的和親對象是個殘疾皇子磕道,可洞房花燭夜當晚...
    茶點故事閱讀 44,779評論 2 354

推薦閱讀更多精彩內(nèi)容