距離上一篇iOS二進制編譯方案(iOS如何提升10倍以上編譯速度)已經快過去半年了,期間收到了不少來着小夥伴們的支持。cocoapods-imy-bin這套系統也在我司(美柚)跑滿了上萬條的打包記錄,目前表現依然是很穩定。ios
鑑於目前市場上,Swift及Swift-OC混編項目流行,且Swift的編譯項目過慢的問題,在業務繁忙之瑕,作了對Swift、Swift-OC項目的二進制組件化的支持。但願能給小夥伴們在iOS編譯的問題上,提供幫助。git
咱們Cocoapods-imy-bin項目,同時支持對純Swift、純Object-C、Swift-OC混編的二進制化。github
直接上圖看效果,多餘的話就很少說了。本文實驗Swift-OC-Demo地址,感興趣的小夥伴們能夠自行下載驗證效果。面試
做爲一個開發者,有一個學習的氛圍跟一個交流圈子特別重要,這是一個個人iOS交流羣:413038000,無論你是小白仍是大牛歡迎入駐 ,分享BAT,阿里面試題、面試經驗,討論技術, 你們一塊兒交流學習成長!swift
圖1、Build tasks對比xcode
圖2、Build time對比框架
圖1、編譯任務數,在未使用\使用二進制時,編譯tasks是532\113個、113個tasks是除了Pods庫外的一些其餘文件、link、copy文件、sign等tasks,減小了80%的tasks。iphone
圖2、編譯時間,在未使用\使用二進制時,編譯時間是35.9s\17.8s個、17.8s是除了Pods庫外的一些其餘文件、link、copy文件、sign等時間,效率提高了2倍。組件化
圖3、美柚App 編譯時間對比post
整體效率上,編譯速度的提高是很是可觀的,項目越大、性能提高越明顯,在我司美柚APP項目上,編譯提速可達13倍以上。(全量編譯)
自動化支持iOS項目組件二進制化:
use_frameworks!
目前Demo是Swift-OC 混編,同時支持純Swift項目。OC-Demo在這,具體原理及詳情請移步到 iOS如何提升10倍以上編譯速度。
Swift二進制化原理其實也就那麼回事,在pod的時候,所有自動轉換成Framework
圖四
圖5、自動轉換依賴二進制化組件
解決:
一、配置Framework的Build Setting將「Build Libraries for Distribution」選項設置爲 YES,不然Swift編譯器不會生成必要的".swiftinterface文件,這是未來編譯器可以加載舊庫的關鍵。
二、若是機器很少的話,能夠把xcode更新到統一的版本號
解決:(建議殼工程化,能夠避免此問題)
這個文件是混編時,系統生成的Swift文件對應的Objective-C的頭文件,具體能夠在Targets-->Build Settings-->Swift Compiler - General-->Objective-C Generated Interface Header Name進行配置,默認文件名是工程名-Swift.h,通常不作改動。
找不到對應的頭文件,這個頭文件是xcode編譯時自動生成的,在Products/Debug-iphonesimulator/lottie-ios/lottie-ios.framework/Headers 中,去掉use_frameworks!後就找不到了
解決:在Header Search Paths 添加對應的文件引用
解決:cocopods1.8.4會出現此問題,升到1.9.1後就正常了
Masonry
, which do not define modules. To opt into those targets generating module maps (which is necessary to import them from Swift when building as static libraries), you may set use_modular_headers!
globally in your Podfile, or specify :modular_headers => true
for particular dependencies.pod bin auto 的時候出現了
解決:修改cocoapods插件相關代碼,或者使用cocopods-imy-bin v0.3.11版本便可解決。
# setting modular_headers_for if(target_definition && target_definition.use_modular_headers_hash.values.any?) target_definition.use_modular_headers_hash.values.each do |f| f.each { | pod_name| self.set_use_modular_headers_for_pod(pod_name, true) } end end 複製代碼
歡迎你們的加入,一塊兒學習與探討
做者簡介 蘇良錦,美柚 iOS 工程師,2019 年加入美柚。
做爲一個開發者,有一個學習的氛圍跟一個交流圈子特別重要,這是一個個人iOS交流羣:413038000,無論你是小白仍是大牛歡迎入駐 ,分享BAT,阿里面試題、面試經驗,討論技術, 你們一塊兒交流學習成長!
做者:Mr_Coder
連接:https://juejin.cn/post/6890419459639476237 來源:掘金