Unity iOS增量編譯
之前提到過利用ofollow,noindex">Jenkins自動化出包流程分享 ,後來發現一個問題是每次iOS編譯的時候都是全量編譯,很奇怪。根據Incremental builds for IL2CPP 裡的說法只要選擇Append應該已經支援了才對,但是發現還是每次觸發了全量編譯。
檔案時間戳
拿出Beyond Compare對比了下,發現即使沒有程式碼修改,Append出來的XCode工程裡也有一個頭檔案和一個資料夾的修改時間變了…這個就很難受了,因為很多IDE是根據這個來檢查是否需要重新編譯的。
我第一反應是用dnSpy看下IL2CPP工具好不好改,但是翻了會程式碼放棄了,而且維護成本肯定很大(每個版本升級都要跟著fix,直到官方修復)。後來在IL2CPP在xcode下增量編譯問題 包括UWA群裡聊了下,最後選擇了手動複製的方案:
打出的xcode用svn同步到xcode打包專案下
我比較偷懶就隨手寫了個python指令碼,完成了類似rsync的功能(shutil
瞭解一下,加起來也就10來行)
XCode增量打包
接下來麻煩的一個地方是,出包伺服器上呼叫的是xcode archive
然後xcodebuild -exportArchive
來生成.ipa,但這個預設就是clean build。如果直接xcodebuild
的話得到的是.app無法簽名。
網上搜了下How to create XCode archive without a clean build
,有人提的路子是PackageApplication
但這貨已經被官方移除了(不推薦使用)。我從網上下了個PackaegApplication放到XCode目錄,確實是能用的,但是證書部分怎麼都搞不對。
後來我分析了下xarchive檔案,發現裡面其實就是.app和Info.plist而已(其實還有dSYM,但刪掉完全沒影響)。這樣的話解決方案就很簡單了…
-
直接呼叫
xcodebuild
生成.app,這裡有個小技巧是CONFIGURATION_BUILD_DIR=build
指定輸出資料夾 - 構造Info.plist,裡面諸如CFBundleIdentifier、CFBundleVersion等資訊可以通過兩種方式獲得
xcodebuild -showBuildSettings /usr/libexec/PlistBuddy -c \"Print xxx\"
構造完成之後就可以像原來一樣xcodebuild -exportArchive
操作即可
實驗效果
在C#程式碼不變情況下(這個對我們這種lua為主的專案是常態),出包最耗時的就變成IL2CPP以及最後的ld,本身Compile消耗非常小。配合Asset Bundle的增量編譯,對於我們這種體量的工程來說從20min降到10min。
日常開發過程中使用增量節約時間,封版本的時候用全量即可避免潛在問題。
ps. Android部分的IL2CPP不知道有沒有老鐵研究過增量方式,我發現程式碼貌似是生成在Temp裡的…