一個(gè)按鈕點(diǎn)一下,就可以build出整個(gè)app智末;xcodebuild一行命令谅摄,就可以產(chǎn)生一個(gè)app;在這個(gè)過程中吹害,具體做了什么了螟凭?我們可以瞟一眼看看。
1. 編譯的過程是什么它呀?
如果又是 編譯 -> 匯編 -> 鏈接 這個(gè)螺男,不免感到有點(diǎn)無聊棒厘,我們可以從一個(gè)編譯的實(shí)例日志來看看,具體有什么下隧。我們做一個(gè)demo的工程奢人,進(jìn)行一次編譯
這個(gè)流程看起來還是比較明確的,做一個(gè)流程圖表示的話淆院,就是這樣
我們會(huì)編譯 pod庫(kù) -> target依賴 -> 主target何乎,這個(gè)流程比較明確,對(duì)于具體每一個(gè)步驟土辩,也是比較清楚的支救。這篇文章不打算去深入到每一步驟的細(xì)節(jié)里,比如調(diào)用clang編譯一個(gè) oc 文件的詳細(xì)過程拷淘,想說明的是在Xcode build這過程中各墨,大致做了哪些事,用到了哪些工具启涯,從開始n多個(gè)文件到最后一個(gè)xxx.app的過程贬堵。
2. 編譯的流程在哪里定義?
通過對(duì)編譯日志進(jìn)行解析结洼,我們基本明白發(fā)現(xiàn)了編譯的過程大致每一步做了什么黎做,用到了哪些工具,到最后 xxx.app的產(chǎn)出
接著松忍,我們可以看看這個(gè)流程是在哪里定義的蒸殿。
嗯,比較顯然挽铁,是在 Build Phase這塊定義的伟桅;
我們可以詳細(xì)看看
"Target Dependencies" 這一步,顯然是首先編譯依賴的target
"Check Pods Manifest.lock" 這一步叽掘,是cocoapods生成的腳本楣铁,diff了下 Podfile.lock和 Manifest.lock
"Compile Sources" 沒得說,這里定義了要編譯的全部源碼
"Link Binary With Libraries" 這里是把我們上一步編譯更扁,還有之前pod生成的靜態(tài)庫(kù)盖腕,動(dòng)態(tài)庫(kù),都鏈接起來
"Copy Bundle Resources" 這塊把靜態(tài)的資源文件拷貝到app bundle中
"Run Script" 又是執(zhí)行一個(gè)腳本文件浓镜,我們打開看看溃列,是fabric生成的一個(gè)腳本,上傳Dsyms文件用的
看到這里膛薛,其實(shí)我們應(yīng)該已經(jīng)比較熟悉這個(gè)流程了听隐;這里既然Cocoapods, Fabric這些都可以生成自定義的腳本,那我們自己可以嗎哄啄?當(dāng)然可以了雅任。
比如我們需要確認(rèn)某次包是對(duì)應(yīng) commit id所處风范,我們可以動(dòng)態(tài)解析當(dāng)前head指針,寫入Info.plist,最后編譯查找問題沪么。
3. 編譯的參數(shù)選項(xiàng)設(shè)置
我們知道硼婿,每一步過程中,必然對(duì)應(yīng)的很多的不同選項(xiàng)禽车;這些參數(shù)怎么配置?
Build Settings里面可以找到全部的配置寇漫,這里有很多很多東西。比如殉摔,有簽名部分的配置州胳,有build 優(yōu)化的,等等逸月。這里最好的參考陋葡,其實(shí)還是Xcode文檔
這是鏈接,有每項(xiàng)的說明彻采,這是最好不過了。
https://help.apple.com/xcode/mac/10.1/index.html?localePath=en.lproj#/itcaec37c2a6
4. 配置落實(shí)到文件在哪里
不管是 Xcode Build Phase捌归,還是Xcode Build Settings,都是我們?cè)赬code里面看到的肛响,落實(shí)到文件上是在哪里呢?
我們可以找到一個(gè) project.pbxproj 的文件惜索,我們拖進(jìn) visual studio里面特笋,一切似乎一目了然了。
我們可以慢慢看巾兆,這里就是 過程 + 參數(shù)配置的結(jié)合體猎物,到這里,似乎一切都明了了角塑。
最后蔫磨,多說一句,pbxproj格式文件圃伶,還真古老堤如,最早源自 " NeXT 的 OpenStep",具體的解析可以Google更多。