1. 使用New Build System
蘋果 在 Xcode 9 中推出了New Build System,New Build System完全用 Swift 編寫,旨在改進整體性能和依賴項管理,但剛推出時候有些未知Bug,蘋果也意識到了這點, 所以Xcode9默認不采用New Build System。從 Xcode 10 開始,Xcode10默認采用New Build System, 可以通過Xcode Files-> Project/Workspace Settings打開和關閉

命令行使用:
xcodebuild -UseNewBuildSystem = YES
2. 增加 Xcode 線程數(shù)
Xcode在編譯時 默認使用與 CPU 內核相同數(shù)量的線程。增加 Xcode 編譯使用的線程數(shù)數(shù)量一定程度上可以提升編譯速度,但是維護線程數(shù)量同樣有性能開銷,開辟線程數(shù)量過多反而會導致編譯速度變慢,所以重點在合適的數(shù)量上,一般情況下使用內核數(shù)就會達到最佳效果,這也是Xcode默認線程數(shù)量。
獲取當前內核數(shù):
sysctl -n hw.ncpu
查看Xcode當前設置
defaults read com.apple.dt.xcodebuild
defaults read com.apple.dt.Xcode
設置編譯線程數(shù)量
defaults write com.apple.dt.xcodebuild PBXNumberOfParallelBuildSubtaskssysctl -n hw.ncpu
defaults write com.apple.dt.xcodebuild IDEBuildOperationMaxNumberOfConcurrentCompileTaskssysctl -n hw.ncpu
defaults write com.apple.dt.Xcode PBXNumberOfParallelBuildSubtaskssysctl -n hw.ncpu
defaults write com.apple.dt.Xcode IDEBuildOperationMaxNumberOfConcurrentCompileTaskssysctl -n hw.ncpu
其中
IDEBuildOperationMaxNumberOfConcurrentCompileTasks --最大編譯任務數(shù)
PBXNumberOfParallelBuildSubtasks -- 最大并行子任務數(shù)
3. 刪除部分無用的Run Script
從編譯日志中可以看到部分Run Script耗時還是比較長的,所以我們應當盡可能的移除非必要的Run Script,比如Swift Lint等

4. 修改Build Setting
4.1 設置Build Active Architecture Only
開啟時,xcode 只會對當為當前 CPU 架構創(chuàng)建二進制文件,在開發(fā)階段,我們只在真機或模擬器(Active Architecture)編譯工程。在 Release 的編譯中,應該包含所有支持的 CPU 架構,因為該二進制文件將通過 App Store 下發(fā)到用戶各種各樣的設備上。確保在 Debug 配置下設置為 YES,在 Release 配置下設置為 NO

4.2 Compilation Mode
Compilation Mode (SWIFT_COMPILATION_MODE)
此設置決定了 swift 源文件被重新編譯的策略。在 Debug 配置下設置為 Incremental, 只重新編譯 “過期” 的 swift 源文件。在 Release 配置下設置為 Whole Module, 編譯所有 swift 源文件以應用某些代碼優(yōu)化。

4.3 Optimization Level (SWIFT_OPTIMIZATION_LEVEL)
優(yōu)化級別設置定義了優(yōu)化構建的方式。由于優(yōu)化過程涉及額外的工作,因此代碼優(yōu)化會導致構建時間變慢。Debug 配置想應設置為“No Optimization”,因為我們需要快速的編譯時間。在Release 配置下,將其設置為“Optimize for Speed”。

4.4 Debug Information Format (DEBUG_INFORMATION_FORMAT)
DWARF:是一種廣泛使用的標準化調試數(shù)據(jù)格式。DWARF 最初是與可執(zhí)行和可鏈接格式 (ELF) 一起設計的,盡管它獨立于目標文件格式。
調試符號 (dSYM):默認情況下,應用程序的調試版本將調試符號存儲在已編譯的二進制文件中,而應用程序的發(fā)布版本將調試符號存儲在配套的 dSYM 文件中以減小二進制文件的大小。
在編譯階段生成dsym文件是比較耗時的操作,所以在debug階段,因為Xcode已經包含了調試信息,我們無需生成dsym文件,在release環(huán)境中,則盡量需要生成dsym文件,以便后續(xù)排查crash信息

4.5 避免工程 Header Search Paths 設置了路徑遞歸引用

Xcode 編譯源文件時,會根據(jù) Header Search Paths 自動添加 -I 參數(shù),如果遞歸引用的路徑下子目錄越多,-I 參數(shù)也越多,編譯器預處理頭文件效率就越低,所以不能簡單的設置路徑遞歸引用。同樣 Framework Search Paths 也類似處理。
4.6 Enable Index-While-Building Functionality設置為NO
默認開啟,Xcode 編譯時會建立代碼索引,影響編譯速度;關閉后,在編譯時就不會進行索引,而是在空閑時間建立代碼索引(自動補全Code、查找定義)
5. 代碼層面
5.1 刪除xib
xib文件的編譯是很耗時的,

以我們的項目為例,在一次全量編譯中,編譯較慢的文件中頻頻出現(xiàn)各種xib,這些xib都是之前遺留的,目前大部分都已廢棄不用,在刪除部分xib文件后,重新測試十次, 大約節(jié)約了數(shù)十秒的時間