如何選擇性地鏈接動態(tài)庫

故事背景

沒有無緣無故的重構,也沒有無緣無故的優(yōu)化玉控。故事的開始要追溯到我們的項目加了某個新功能。

在此之前座每,項目的編譯鏈接速度算是比較快前鹅,加上IDE編譯緩存的作用,不完全編譯的話峭梳,一般在10秒內就可以看到你修改的代碼的效果舰绘。但為了這項新功能,我們使用了某個第三方SDK葱椭,這個SDK是以framework的形式提供的捂寿。從此之后link階段的時間大大加長,大概需要五分鐘挫以。就算改一行代碼者蠕,也需要等三分鐘,喝上一杯茶之后才能看到代碼改動的效果掐松,大大影響了開發(fā)效率。產品的功能模塊較多粪小,很多其他模塊的開發(fā)者也深受荼毒大磺。

來看一下系統(tǒng)本身的一些framework的大小,系統(tǒng)相冊Photos.framework是115KB探膊,通訊錄動態(tài)庫AddressBook.framework是111KB杠愧,底層網絡處理庫CFNetwork.framework是295KB,等等逞壁。而我們使用的這個SDK流济,足足有400多MB!腌闯!所以鏈接速度巨慢也就不足為奇了绳瘟。下文將用slow.framework表示此SDK。

因為這項新功能是重點核心功能姿骏,而這個SDK也是我們調研比較之后最能滿足我們需求的服務提供方糖声,因此去除或者更換SDK都不太現實。

兼顧產品需求和開發(fā)效率分瘦,只能想辦法縮短編譯鏈接時間蘸泻。最直觀的想法是,只有真正開發(fā)該新功能模塊的才去link slow.framework嘲玫,而其他模塊的開發(fā)則不link它悦施,這樣大部分情況下的修改可以不受其影響。

因此我們的核心問題就是去团,如何選擇性地鏈接動態(tài)庫抡诞。

實踐

選擇性編譯

假設我們不鏈接slow.framework了穷蛹,那么使用到SDK中的接口的代碼,肯定是編譯不過的沐绒。因此在考慮怎樣選擇性鏈接framework之前俩莽,需要先修改代碼,使得用到slow.framework的接口的地方都能有選擇地被編譯乔遮。

添加一個Build Configuration扮超,叫Debug_Fast

Paste_Image.png

這個Debug_Fast選項表示不使用slow.framework,為其添加一個預定義宏蹋肮,叫DEBUG_FAST


Paste_Image.png

原來使用SDK的代碼都修改成這樣:

#ifndef DEBUG_FAST
// use slow.framework
#else
// balabala
#endif

這樣只有在定義了DEBUG_FAST之后出刷,我們就不再使用slow.framework中的代碼。

選擇性鏈接

在這個問題上坯辩,我們嘗試過兩種做法馁龟。

多scheme多target

具體步驟如下:

  1. 當前的項目只有一個target,可以duplicate出另一個target漆魔,我們暫且稱之為target_fast
  2. 修改target_fast中的Linked Frameworks and Libraries坷檩,將該slow.framework移除。
  3. 創(chuàng)建一個scheme改抡,這個scheme對應到的Executable是target_fast矢炼,并且對應的Build Configuration是我們之前添加好的Debug_Fast,我們稱之為scheme_fast阿纤。
Paste_Image.png

這樣我們調試的時候句灌,選擇這個scheme_fast,就可以不鏈接slow.framework欠拾。

多scheme單target

上述的方法已經可以解決我們的問題胰锌,但是仍有一些副作用:

  • 使用了多個target之后,以后我們每添加一個新文件藐窄,都需要將其加到兩個target中资昧,雖然Xcode會記住你的選擇,但還是很丑陋枷邪。
  • 多個target對于以后的維護并不友好榛搔,要改一項配置也需要同步到兩個target中

因此我們最后采用了另外一種做法:多scheme單target,具體步驟如下:

  1. 先將slow.framework從Linked framework中移除
  2. 修改Other Linker Flags东揣,配置Debug和Release -link slow.framework践惑,而Debug_Fast則不鏈接


    Paste_Image.png
  3. 同上創(chuàng)建多個scheme,其中scheme_fast對應到Debug_Fast這個Build Configuration嘶卧。

這種解決方案更加簡單輕量尔觉,對原有項目的入侵也更少,更好維護芥吟。

<b>遇到難題不要抱怨侦铜,方法總比困難多专甩;解決了問題也不要輕易滿足,可能存在更優(yōu)雅的解決方案钉稍。</b>

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末涤躲,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子贡未,更是在濱河造成了極大的恐慌种樱,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,576評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件俊卤,死亡現場離奇詭異嫩挤,居然都是意外死亡,警方通過查閱死者的電腦和手機消恍,發(fā)現死者居然都...
    沈念sama閱讀 94,515評論 3 399
  • 文/潘曉璐 我一進店門岂昭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人狠怨,你說我怎么就攤上這事约啊。” “怎么了佣赖?”我有些...
    開封第一講書人閱讀 168,017評論 0 360
  • 文/不壞的土叔 我叫張陵棍苹,是天一觀的道長。 經常有香客問我茵汰,道長,這世上最難降的妖魔是什么孽鸡? 我笑而不...
    開封第一講書人閱讀 59,626評論 1 296
  • 正文 為了忘掉前任蹂午,我火速辦了婚禮,結果婚禮上彬碱,老公的妹妹穿的比我還像新娘豆胸。我一直安慰自己,他們只是感情好巷疼,可當我...
    茶點故事閱讀 68,625評論 6 397
  • 文/花漫 我一把揭開白布晚胡。 她就那樣靜靜地躺著,像睡著了一般嚼沿。 火紅的嫁衣襯著肌膚如雪估盘。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,255評論 1 308
  • 那天骡尽,我揣著相機與錄音遣妥,去河邊找鬼。 笑死攀细,一個胖子當著我的面吹牛箫踩,可吹牛的內容都是我干的爱态。 我是一名探鬼主播,決...
    沈念sama閱讀 40,825評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼境钟,長吁一口氣:“原來是場噩夢啊……” “哼锦担!你這毒婦竟也來了?” 一聲冷哼從身側響起慨削,我...
    開封第一講書人閱讀 39,729評論 0 276
  • 序言:老撾萬榮一對情侶失蹤洞渔,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后理盆,有當地人在樹林里發(fā)現了一具尸體痘煤,經...
    沈念sama閱讀 46,271評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,363評論 3 340
  • 正文 我和宋清朗相戀三年猿规,在試婚紗的時候發(fā)現自己被綠了衷快。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,498評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡姨俩,死狀恐怖蘸拔,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情环葵,我是刑警寧澤调窍,帶...
    沈念sama閱讀 36,183評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站张遭,受9級特大地震影響邓萨,放射性物質發(fā)生泄漏。R本人自食惡果不足惜菊卷,卻給世界環(huán)境...
    茶點故事閱讀 41,867評論 3 333
  • 文/蒙蒙 一缔恳、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧洁闰,春花似錦歉甚、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,338評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至腰素,卻和暖如春聘裁,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背耸弄。 一陣腳步聲響...
    開封第一講書人閱讀 33,458評論 1 272
  • 我被黑心中介騙來泰國打工咧虎, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人计呈。 一個月前我還...
    沈念sama閱讀 48,906評論 3 376
  • 正文 我出身青樓砰诵,卻偏偏與公主長得像征唬,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子茁彭,可洞房花燭夜當晚...
    茶點故事閱讀 45,507評論 2 359

推薦閱讀更多精彩內容