iOS開發(fā)進(jìn)階六:lipo指令和XCFramework

背景:XCFramework之前的多架構(gòu)合并

我們生成一個(gè)庫(kù)文件蓝撇,可能有模擬器的架構(gòu)墙贱,也可能有真機(jī)的架構(gòu)檐盟。但我們通常給別人提供SDK的時(shí)候都是將各種平臺(tái)架構(gòu)的庫(kù)合在一起梯投。引入一個(gè)庫(kù)文件,就可以支持調(diào)試和在真機(jī)上運(yùn)行沟涨。這種格式的庫(kù)我們通常叫他Fat Binary(胖二進(jìn)制)恤批。

xcodebuild指令

xcodebuild -- build Xcode projects and workspaces,Xcode中自帶的打包工具裹赴,平時(shí)我們用xcode打包就是用的這個(gè)玩意喜庞。

xcodebuild archive     #打包操作     
           -archivePath <archivePath>  #打包后的輸出路徑
           -project <projectName>  #項(xiàng)目名稱
           -workspace <workspaceName> #項(xiàng)目空間名稱
           -scheme <schemeName>    #指定是項(xiàng)目中哪個(gè)scheme,可以從-list命令中獲取
           -configuration <Debug|Release>   #哪種環(huán)境棋返,Debug還是Release
           -destination <DESTINATIONSPECIFIER>  #分發(fā)的平臺(tái)

編譯一個(gè)模擬器架構(gòu)的庫(kù)

xcodebuild archive -project 'SYTimer.xcodeproj' \
-scheme 'SYTimer' \
-configuration Release \
-destination 'generic/platform=iOS Simulator' \
-archivePath '../archives/SYTimer.framework-iphonesimulator.xcarchive' \
SKIP_INSTALL=NO

執(zhí)行完后會(huì)在項(xiàng)目同級(jí)目錄生成一個(gè)archives文件夾延都,里面包含iphonesimulator.xcarchive文件,右鍵顯示包內(nèi)容睛竣,會(huì)看到Products->Library->Frameworks晰房,Frameworks存在一個(gè)叫SYTimer.framework的庫(kù),這個(gè)庫(kù)就是我們編譯好的framework

xcodebuild打包指令.png

從圖中可以看到多了一個(gè)參數(shù):

SKIP_INSTALL=NO

設(shè)置這個(gè)參數(shù)的意義在于:是否將編譯好的庫(kù)拷貝到Products目錄下殊者,如果SKIP_INSTALL=YES与境,則Products目錄下為空。我們做庫(kù)合并時(shí)幽污,需要用到Framework,所以必須加上這個(gè)參數(shù)簿姨。

編譯一個(gè)真機(jī)架構(gòu)的庫(kù)

修改xcodebuild指令中的分發(fā)平臺(tái)輸出路徑參數(shù):

-destination 'generic/platform=iOS' \
-archivePath '../archives/SYTimer.framework-iphoneos.xcarchive' \

lipo指令將模擬器和真機(jī)架構(gòu)合并

使用file SYTimer命令可以查看庫(kù)文件包含的架構(gòu)距误。

打包命令中,并沒有指定架構(gòu)扁位。但打包后SYTimer可執(zhí)行文件中准潭,包含了arm_v7arm64兩種架構(gòu)。這個(gè)和SYTimer項(xiàng)目中的Build Settings設(shè)置有關(guān)域仇,在打包時(shí)也執(zhí)行了Build Settings中的設(shè)置刑然。

架構(gòu)合并需要使用lipo命令。將不同的架構(gòu)合并到一起暇务,生成一個(gè)胖二進(jìn)制泼掠。但lipo命令卻不能將包含相同架構(gòu)的庫(kù)進(jìn)行合并。在上面生成的兩個(gè)庫(kù)文件中均包含了arm64垦细,無法進(jìn)行合并择镇。

lipo -output SYTimer -create ../archives/SYTimer.framework-iphoneos.xcarchive/Products/Library/Frameworks/SYTimer.framework/SYTimer ../archives/SYTimer.framework-iphonesimulator.xcarchive/Products/Library/Frameworks/SYTimer.framework/SYTimer
lipo指令合并相同架構(gòu)發(fā)生錯(cuò)誤.png

lipo指令無法合并的解決辦法

使用lipo命令,最大的問題就是包含相同架構(gòu)括改,無法合并Fat Binary腻豌。這種情況只能將所需的架構(gòu)提取出來,再進(jìn)行合并嘱能。

lipo -output SYTimer-x86_64 -extract x86_64 ../archives/SYTimer.framework-iphonesimulator.xcarchive/Products/Library/Frameworks/SYTimer.framework/SYTimer

從模擬器中提取x86_64架構(gòu)吝梅,輸出到當(dāng)前目錄生成SYTimer-x86_64文件。再與真機(jī)庫(kù)進(jìn)行合并惹骂,因?yàn)?code>arm64只有真機(jī)存在苏携,所以可以執(zhí)行合并成功了。

lipo -output SYTimer -create ../archives/SYTimer.framework-iphoneos.xcarchive/Products/Library/Frameworks/SYTimer.framework/SYTimer  SYTimer-x86_64
lipo指令合并成功.png

生成XCFramework

  • XCFramework:是蘋果官方推薦的对粪、支持的兜叨,可以更方便的表示一個(gè)多個(gè)平臺(tái)和架構(gòu)的分發(fā)進(jìn)制庫(kù)的格式。
  • 需要Xcode11以上支持衩侥。
  • 是為更好的支持Mac Catalyst和ARM芯片的macOS国旷。
  • 專門在2019年提出的Framework的另一種先進(jìn)格式。

和傳統(tǒng)的Framework相?:

  • 可以?單個(gè).xcframework?件提供多個(gè)平臺(tái)的分發(fā)?進(jìn)制?件
  • Fat Header相?茫死,可以按照平臺(tái)劃分跪但,可以包含相同架構(gòu)的不同平臺(tái)的?件
  • 在使?時(shí),不需要再通過腳本去剝離不需要的架構(gòu)體系

將兩個(gè)架構(gòu)的Framework合并成XCFramework

使用xcodebuild命令,將模擬器和真機(jī)兩個(gè)平臺(tái)的Framework合并成XCFramework

xcodebuild -create-xcframework \
-framework '../archives/SYTimer.framework-iphoneos.xcarchive/Products/Library/Frameworks/SYTimer.framework' \
-framework '../archives/SYTimer.framework-iphonesimulator.xcarchive/Products/Library/Frameworks/SYTimer.framework' \
-output 'SYTimer.xcframework'
xcodebuild將兩個(gè)架構(gòu)Framework編譯成XCFramework.png

一般XCFramework需要包含BitCode和dSYMs方便崩潰時(shí)恢復(fù)調(diào)用棧屡久,那么修改創(chuàng)建XCFramework的命令如下:

xcodebuild -create-xcframework \
-framework '../archives/SYTimer.framework-iphoneos.xcarchive/Products/Library/Frameworks/SYTimer.framework' \
-debug-symbols '/Users/chenshuangchao/Desktop/archives/SYTimer.framework-iphoneos.xcarchive/BCSymbolMaps/618E16C1-20B9-39A5-98A1-42E947A26ADB.bcsymbolmap' \
-debug-symbols '/Users/chenshuangchao/Desktop/archives/SYTimer.framework-iphoneos.xcarchive/BCSymbolMaps/6E502109-851C-3FA9-A5B9-8A1373F73FE5.bcsymbolmap' \
-debug-symbols '/Users/chenshuangchao/Desktop/archives/SYTimer.framework-iphoneos.xcarchive/dSYMs/SYTimer.framework.dSYM' \
-framework '../archives/SYTimer.framework-iphonesimulator.xcarchive/Products/Library/Frameworks/SYTimer.framework' \
-debug-symbols '/Users/chenshuangchao/Desktop/archives/SYTimer.framework-iphonesimulator.xcarchive/dSYMs/SYTimer.framework.dSYM' \
-output 'SYTimer.xcframework'
  • 只有真機(jī)才有BitCode忆首。
  • BitCode和dSYMs的文件路徑必須傳絕對(duì)路徑,否則會(huì)出現(xiàn)錯(cuò)誤the path does not point to a valid debug symbols file被环。

上面指令也可以用腳本實(shí)現(xiàn)

ARCHIVES=/Users/chenshuangchao/Desktop/archives
# -debug-symbols:必須使用絕對(duì)路徑
# Shell變量必須放在""中
xcodebuild -create-xcframework \
-framework '../archives/SYTimer.framework-iphoneos.xcarchive/Products/Library/Frameworks/SYTimer.framework' \
-debug-symbols "${ARCHIVES}/SYTimer.framework-iphoneos.xcarchive/BCSymbolMaps/9D87CD30-46F3-302A-ADCF-BF46F07578D4.bcsymbolmap" \
-debug-symbols "${ARCHIVES}/SYTimer.framework-iphoneos.xcarchive/BCSymbolMaps/ACA28AC6-6E0E-3F6F-8105-BC1175739A0B.bcsymbolmap" \
-debug-symbols "${ARCHIVES}/SYTimer.framework-iphoneos.xcarchive/dSYMs/SYTimer.framework.dSYM" \
-framework '../archives/SYTimer.framework-iphonesimulator.xcarchive/Products/Library/Frameworks/SYTimer.framework' \
-debug-symbols "${ARCHIVES}/SYTimer.framework-iphonesimulator.xcarchive/dSYMs/SYTimer.framework.dSYM" \
-output 'SYTimer.xcframework'
給XCFramework添加debug-symbols成功.png

xcframework文件和普通Framework文件的使用別無二致糙及。xcframework中打包了多個(gè)平臺(tái)的Framework,比普通Framework文件更大筛欢。但在實(shí)際使用中浸锨,xcframework會(huì)根據(jù)當(dāng)前鏈接的平臺(tái)架構(gòu),僅鏈接相應(yīng)的庫(kù)文件版姑,不會(huì)將整個(gè)xcframework全部鏈接柱搜。

XCFramework的結(jié)構(gòu).png

xcframework的優(yōu)勢(shì):

  1. 不用手動(dòng)處理頭文件、資源文件等內(nèi)容(lipo合并后需要鏈接)
  2. 重復(fù)架構(gòu)可自行處理剥险,(免去lipo指令重復(fù)時(shí)需要提取指定架構(gòu)的步驟)
  3. 更方便的導(dǎo)入調(diào)式符號(hào)聪蘸,直接在指令中完成
  4. 自動(dòng)鏈接相應(yīng)平臺(tái)架構(gòu)的庫(kù)文件,將不需要的架構(gòu)去掉(上線時(shí)自動(dòng)去掉模擬器架構(gòu))
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末表制,一起剝皮案震驚了整個(gè)濱河市健爬,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌么介,老刑警劉巖浑劳,帶你破解...
    沈念sama閱讀 206,126評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異夭拌,居然都是意外死亡魔熏,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門鸽扁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蒜绽,“玉大人,你說我怎么就攤上這事桶现《阊牛” “怎么了?”我有些...
    開封第一講書人閱讀 152,445評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵骡和,是天一觀的道長(zhǎng)相赁。 經(jīng)常有香客問我,道長(zhǎng)慰于,這世上最難降的妖魔是什么钮科? 我笑而不...
    開封第一講書人閱讀 55,185評(píng)論 1 278
  • 正文 為了忘掉前任,我火速辦了婚禮婆赠,結(jié)果婚禮上绵脯,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好蛆挫,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評(píng)論 5 371
  • 文/花漫 我一把揭開白布赃承。 她就那樣靜靜地躺著,像睡著了一般悴侵。 火紅的嫁衣襯著肌膚如雪瞧剖。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 48,970評(píng)論 1 284
  • 那天可免,我揣著相機(jī)與錄音抓于,去河邊找鬼。 笑死巴元,一個(gè)胖子當(dāng)著我的面吹牛毡咏,可吹牛的內(nèi)容都是我干的驮宴。 我是一名探鬼主播逮刨,決...
    沈念sama閱讀 38,276評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼堵泽!你這毒婦竟也來了修己?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,927評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤迎罗,失蹤者是張志新(化名)和其女友劉穎睬愤,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體纹安,經(jīng)...
    沈念sama閱讀 43,400評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡尤辱,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了厢岂。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片光督。...
    茶點(diǎn)故事閱讀 37,997評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖塔粒,靈堂內(nèi)的尸體忽然破棺而出结借,到底是詐尸還是另有隱情,我是刑警寧澤卒茬,帶...
    沈念sama閱讀 33,646評(píng)論 4 322
  • 正文 年R本政府宣布船老,位于F島的核電站,受9級(jí)特大地震影響圃酵,放射性物質(zhì)發(fā)生泄漏柳畔。R本人自食惡果不足惜惫搏,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評(píng)論 3 307
  • 文/蒙蒙 一琼腔、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧阅束,春花似錦、人聲如沸躬存。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽岭洲。三九已至宛逗,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間盾剩,已是汗流浹背雷激。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評(píng)論 1 260
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留告私,地道東北人屎暇。 一個(gè)月前我還...
    沈念sama閱讀 45,423評(píng)論 2 352
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像驻粟,于是被迫代替她去往敵國(guó)和親根悼。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評(píng)論 2 345

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