關(guān)于architecture以及xcode編譯
目前市面上的蘋(píng)果手機(jī)主要cpu架構(gòu)有armv7稻据,arm7s,arm64买喧,iPhone5是armv7s捻悯,之前的3GS/4/4S都是armv7,之后5s/6/6S/7/7S就都是arm64淤毛。
xcode編譯選項(xiàng)中今缚,有幾個(gè)關(guān)于architecture的選項(xiàng),xcode要編譯的目標(biāo)架構(gòu)是valid architecture和active architecture的交集低淡。xcode會(huì)對(duì)所有支持的架構(gòu)進(jìn)行編譯姓言,生成所有的.o文件鏈接成.a。不同架構(gòu)的.a最后再合在一起蔗蹋,形成最后的.a 或二進(jìn)制文件脓诡。
所以如果你的工程支持armv7/7S/64凝垛,編譯器是要編譯鏈接三次的,最后包的大小也是3倍。目前流行的兩種架構(gòu)是armv7和arm64意荤,主流的app都只支持這兩個(gè)琉雳。armv7s因?yàn)橹挥衖Phone5益缠,所以現(xiàn)在xcode默認(rèn)的standard architecture已經(jīng)沒(méi)有這個(gè)架構(gòu)了蒂胞。iPhone5降級(jí)運(yùn)行armv7的代碼,執(zhí)行效率差別不大涮较。
值得一提的是稠鼻,我們國(guó)人一直在使用,一直在抱怨的購(gòu)票app 12306狂票,我拆開(kāi)包研究了下候齿,竟然只支持armv7架構(gòu)。所以在搶票這個(gè)環(huán)節(jié),你用iPhone4S和iPhone7慌盯,CPU執(zhí)行的效率是一樣的周霉,體現(xiàn)了大國(guó)的公平精神。
分析處理二進(jìn)制文件的神器 lipo
lipo是一個(gè)分析處理二進(jìn)制文件的工具亚皂,你可以把多種架構(gòu)的.a合并成一個(gè).a俱箱,也可以把一個(gè)混合的.a中提取某一種架構(gòu)的.a,或者去掉某一種灭必。通常如果拿到第三方庫(kù)調(diào)試狞谱,如果遇到找不到某個(gè)architecture的錯(cuò)誤,可以使用這個(gè)工具來(lái)查看定位禁漓。
lipo -info lib1.a
lipo -detailed_info lib1.a
顯示.a中包含所有的arch type
lipo -create lib1.a lib2.a lib3.a -output liball.a
把三個(gè)lib a, b, c合并成一個(gè)lib
lipo -thin arm64 lib1.a -output libarm64.a
lipo -extract arm64 lib1.a -output libarm64.a
lipo -remove arm64 lib1.a -output libarm7.a
前兩個(gè)是把lib1.a中的arm64架構(gòu)從混合lib中提取出來(lái)跟衅,后一個(gè)是去掉arm64的架構(gòu)。前兩個(gè)有區(qū)別播歼,thin直接提取成non-fat文件伶跷,extract和remove則直接提取出對(duì)應(yīng)的.a,還是fat格式的文件秘狞。接下來(lái)使用ar命令的前提是non-fat文件叭莫,所以只能使用thin。
提取.o文件
lipo更多的是針對(duì)fat文件進(jìn)行的處理烁试,基于architecture級(jí)別的雇初。
如果要把一個(gè)二進(jìn)制文件里面的.o 文件全部提取出來(lái),可以使用ar工具减响,具體可以看man手冊(cè)抵皱。
值得注意的是,不管是從appstore下載的還是inhouse安裝的辩蛋,都是經(jīng)過(guò)加殼處理的,ar就無(wú)能為力了移盆。所以先去學(xué)習(xí)如何脫殼吧悼院,這是客戶端的另外一個(gè)方向 -- 逆向工程。我也不會(huì)咒循。据途。。找時(shí)間學(xué)習(xí)啦叙甸。颖医。。