提高iOS項目的編譯速度

項目結構

  • CocoaPods做業務劃分,每條業務線一個工程,每個工程依賴基礎框架,業務線之間解耦依賴基礎模塊
  • 純Objective-C代碼,沒有引入Swift代碼
  • 獨立服務器安裝Xcode通過Jenkins打包,發布到fir.im
  • 2C端目前代碼量33W左右,2B端28W左右

打包時間

隨著項目的逐漸增大打包時間越來越久。代碼打包是放在獨立的服務器上,因為只是用來做項目打包使用,因此性能配置較低。為了保證每次打包的代碼的完整性,每次都會進行全量的更新(包含Pods私有庫和公共庫的更新)。代碼更新和Pos更新的時間加上編譯時間安裝包上傳時間,2C端項目完整的打包時間基本在800s左右,2B端項目在1200s左右。長久的等待實在讓人有些崩潰。

解決方案

ccache

ccache is a compiler cache. It speeds up recompilation by caching previous compilations and detecting when the same compilation is being done again. Supported languages are C, C++, Objective-C and Objective-C++.

ccache是一個可以把編譯中間產物緩存起來的工具,目前可以支持C、C++、Objective-C、Objective-C++,滿足目前需求

安裝ccache

如果已經安裝過homebrew(Mac OSX上的軟件包管理工具),可以通過以下命令直接安裝:

brew install ccache

如果沒有安裝homebrew,需要先安裝homebrew

ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

創建ccache編譯腳本

安裝完ccache之后我們需要讓它介入到整個編譯過程,如果發現ccache就用ccache編譯,如果沒有就走原有的clang
新建一個空白文本文件

touch ccache-clang

保存如下內容:

#!/bin/sh
if type -p ccache >/dev/null 2>&1; then
    export CCACHE_MAXSIZE=10G
    export CCACHE_CPP2=true
    export CCACHE_HARDLINK=true
    export CCACHE_SLOPPINESS=file_macro,time_macros,include_file_mtime,include_file_ctime,file_stat_matches
    exec ccache /usr/bin/clang "$@"
else 
    exec clang "$@"
fi

腳本比較容易理解,先判斷ccache的執行路徑是否存在,如果存在設置ccache的參數,并啟動ccache編譯,如果不存在走原有clang編譯

修改touch ccache-clang的權限為可執行

chmod 755 ccache-clang

Xcode項目修改

定義CC常量

在項目構建設置(Build Settings)中,添加一個常量CC,Xcode編譯時會調用該路徑下的編譯器

image

如果ccache-clang跟工程文件平級,CC常量值可以設置為

$(SRCROOT)/ccache-clang

關閉Clang Modules

因為ccache不支持Clang Modules,所以需要把Enable Modules關閉

image

關閉Enable Modules后需要修改@import 為 #import,如果用到了系統框架還需要在Target 的 Build Phrase -> Link Binary With Libraries手動引入

CocoaPods處理

CocoaPods會把項目打包成靜態庫或者動態Framework,也需要把 Enable Modules選項關閉,這個操作需要在Podfile文件中完成
在Podfile文件中增加如下配置

require 'fileutils'
post_install do |installer_representation|
    installer_representation.pods_project.targets.each do |target|
        target.build_configurations.each do |config|
        #關閉 Enable Modules
        config.build_settings['CLANG_ENABLE_MODULES'] = 'NO'

        # 在生成的 Pods 項目文件中加入 CC 參數
        config.build_settings['CC'] = '$(SRCROOT)/ccache-clang'
        end
    end
    # 拷貝主工程的ccache-clang文件到Pods下面
    FileUtils.cp('ccache-clang', 'Pods/ccache-clang')
end

查看編譯結果

在第一次啟動ccache編譯時因為所有文件都沒有做過編譯緩存,因此是沒有任何提升效果的,反而由于ccache自己的緩存策略會降低編譯速度,從第二次開始編譯速度就會有所提升

ccache -s

cache directory                     /Users/ecotech/.ccache
primary config                      /Users/ecotech/.ccache/ccache.conf
secondary config      (readonly)    /usr/local/Cellar/ccache/3.2.3/etc/ccache.conf
cache hit (direct)                  5484
cache hit (preprocessed)               0
cache miss                          3436
called for link                       10
called for preprocessing              30
can't use precompiled header        1896
no input file                         10
files in cache                     15504
cache size                           2.8 GB
max cache size                      10.0 GB

2C項目 優化前:615s 優化后:266s 提升:56.7%

2B項目 優化前:902s 優化后:403s 提升:55.3%

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,117評論 6 537
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,860評論 3 423
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,128評論 0 381
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,291評論 1 315
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,025評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,421評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,477評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,642評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,177評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,970評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,157評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,717評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,410評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,821評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,053評論 1 289
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,896評論 3 395
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,157評論 2 375

推薦閱讀更多精彩內容