xcode編譯設置
1. 如何加快xcode編譯速度
1. 增加XCode執行的線程數
可以根據自己Mac的性能,更改線程數設置5:defaults write com.apple.Xcode 5
另外也有一個設置可以開啟:defaults write com.apple.dt.Xcode ShowBuildOperationDuration YES
XCode默認使用與CPU核數相同的線程來進行編譯,但由於編譯過程中的IO操作往往比CPU運算要多,因此適當的提升線程數可以在一定程度上加快編譯速度。
2.將Debug Information Format改為DWARF
在工程對應Target的Build Settings中,找到Debug Information Format這一項,將Debug時的DWARF with dSYM file改為DWARF。
這一項設置的是是否將調試信息加入到可執行文件中,改為DWARF後,如果程序崩潰,將無法輸出崩潰位置對應的函數堆棧,但由於Debug模式下可以在XCode中查看調試信息,所以改為DWARF影響並不大。這一項更改完之後,可以大幅提升編譯速度。
比如在目前本人負責的項目中,由於依賴了多個Target,所以需要在每個Target的Debug Information Format設置為DWARF。順便提一下,如果通過Cocoapod引入第三方則Debug Information Format默認就是設置為DWARF的。
SDWebImage通過Cocoapod``Debug Information Format的默認設置
注意:將Debug Information Format改為DWARF之後,會導致在Debug窗口無法查看相關類類型的成員變數的值。當需要查看這些值時,可以將Debug Information Format改回DWARF with dSYM file,clean(必須)之後重新編譯即可。
3.將Build Active Architecture Only改為Yes
在工程對應Target的Build Settings中,找到Build Active Architecture Only這一項,將Debug時的NO改為Yes。
664334-fa1eb995c140ce0f.png
這一項設置的是是否僅編譯當前架構的版本,如果為NO,會編譯所有架構的版本。需要注意的是,此選項在Release模式下必須為NO`,否則發布的ipa在部分設備上將不能運行。這一項更改完之後,可以顯著提高編譯速度。
4.設計編譯優化等級
不要再項目中或者靜態庫中使用-O4,因為這會讓Clang鏈接Link Time Optimizations (LTO)使得編譯更慢,通常使用-O3。
注意:在設置編譯優化之後,XCode斷點和調試信息會不正常,所以一般靜態庫或者其他Target這樣設置。
4.資源整合
4.1 將常用的代碼及文件打包成靜態庫
4.2 添加預編譯文件,把常用的頭文件放到預編譯文件裡面
4.3 能用@class就用@class
2. Generate Debug Symbols編譯設置
Xcode工程中有個編譯設置 Generate Debug Symbols ,翻譯為'生成調試符號', 默認設置是為YES的。看到這個設置我們可能會思考🤔:如果設置release環境下為NO,不生成調試符號的話,包體積會不會更小呢?畢竟我們發布到App Store上的版本是不需要調試的。帶著這樣的出發點,於是去了解了一番。
首先 ,在項目的target下打斷點後,運行 ==》程序遇到斷點不會停。
然後 ,這個情況下在項目的pod庫子工程打斷點會不會停呢?
因為項目中使用Pod進行庫管理,並且 Podfile 中寫了 generate_multiple_pod_projects: true , 所以Pod庫會生成一個子工程。在Pod庫中打斷點,運行 ==> 程序遇到斷點會停住,底部調試台左邊的變數也會顯示,但是 po 命令列印時會有兩種情況:
最後 ,我們現在把子工程中的 Generate Debug Symbols , 改為NO,斷點也是不會停住的!!!
對於上述的結果,我們首先想到的是 動態庫在生成打包生成ipa時是會獨立生成 可執行文件 的,而靜態庫是直接打包進主工程二進制文件中的。
所以接下來,我們在 release模式 下運行一次,對比 Generate Debug Symbols 設置為YES和NO的區別:
本人的demo工程編譯到運行的對比:
YES時:42s左右
NO時 :38s左右
兩種設置下分別打開 Proct (這個需要 xcode中導入了pod庫才會生成,並且換設置時別忘了 clean 一下),對比發現, 設置為YES會多出dSYM文件:
Clang文檔對-g的描述是:
項目中我們一般是默認要生成調試符號的,即Generate Debug Symbols = YES。因為我我們需要dSYM才能定位Crash,其次是對於APP來說ipa的體積並沒有減小!
對於項目中集成了Bugly的同行們應該對於 dSYM 不陌生.
具體可以參看文章:
iOS dSYM詳解和分析crash,ips文件
dwarf格式
DWARF文件初探——提取輕量符號表