拒絕編譯等待 - 動態研發模式 ARK

作者:字節跳動終端技術——徐紀光

背景

iOS 業界研發模式多爲 CocoaPods + Xcode + Git 的多倉組件化開發模型。爲追求極致的研發體驗、提升研發效率,對該研發模式進行了大量優化,但目前遇到了以下瓶頸,亟需突破:

  • pod install 時間長:編譯優化絕大部分任務放在了 CocoaPods 上,CocoaPods 承擔了更多工作,執行時間因此變長。
  • 編譯時間長:雖然現階段絕大部分工程已經從源碼編譯轉型成二進制編譯,但編譯耗時依舊在十分鐘左右,且現有工程基礎上已無更好優化手段。
  • 超大型工程通病:Xcode Index 慢、爆內存、甚至卡死,鏈接時間長。

如何處理這些問題?

究其本質,產生這些問題的原因在於工程規模龐大。據此我們停下了對傳統模式各節點的優化工作,以"縮小工程規模"爲切入點,探索新型研發模式——動態研發模式 ARK。

ARK[1] 是全鏈路覆蓋的動態研發模式,旨在保證工程體驗的前提下縮小工程規模:通過基線構建的方式,提供線下研發所需物料;同時通過實時的動態庫轉化技術,保證本地研發僅需下載和編譯開發倉庫。

Show Case

動態研發模式本地研發流程圖如下。接下來就以抖音產品爲例,闡述如何使用 ARK 做一次本地開發。

演示基於字節跳動本地研發工具 MBox[2] 。

流程圖

1.倉庫下載

ARK 研發模式下,本地研發不再拉取主倉代碼,取而代之的是 ARK 倉庫。ARK 倉庫含有與主倉對應的所有配置,一次適配接入後期不需要持續維護。

相較傳統 APP 倉庫動輒幾個 GB 的大小,ARK 倉庫貫徹了縮減代碼規模這一概念。倉庫僅有應用配置信息,不包含任何組件代碼。ARK 倉庫大小僅 2 MB,在 1 s 內可以完成倉庫下載 。

在 MBox 中的使用僅需幾步點擊操作。首先選擇要開發的產品,然後勾選 ark 模式,選擇開發分支,最後點擊 Create 便可以數秒完成倉庫下載。

2.開發組件

CocoaPods 下進行組件開發一般是將組件倉庫下載到本地,修改 Podfile 對應組件 A 爲本地引用 pod A, :path =>'./A' ,之後進行本地開發。而在 MBox 和 ARK 的研發流程中,僅需選擇要開發的組件點擊 Add 便可進行本地開發。

動態研發模式 ARK 通過解析 Podfile.lock 支持了 Checkout From Commit 功能,該功能根據宿主的組件依賴信息自動拉取相應的組件版本到本地,帶來便捷性的同時也保證了編譯成功率。

3. pod install

傳統研發模式下 pod install 必須要經歷 解析 Podfile 依賴、下載依賴、創建 Pods.xcodeproj 工程、集成 workspace 四個步驟,其中依賴解析和下載依賴兩個步驟尤爲耗時。

ARK 研發模式下 Podfile 中沒有組件,因此依賴解析、下載依賴這兩個環節耗時幾乎爲零。其次由於工程中僅需開發組件步驟中添加的組件,在創建 Pods 工程、集成工程這兩個環節中代碼規模的降低,對提升集成速度的效果非常顯著。

沒有依賴信息,編譯、鏈接階段顯然不能成功。ARK 解決方案通過自研 cocoapods-ark 及配套工具鏈來保證編譯、鏈接、運行的成功,其原理後續會在系列文章中介紹。

4. 開發組件編譯&調試

和傳統模式一樣通過 Xcode 打開工程的 xcworkspace ,即可正常開發、調試完整的應用。

工程中僅保留開發組件,但是依然有變量、函數、頭文件跳轉能力;參與 Index、編譯的規模變小,Xcode 幾乎不存在 loading 狀態,大型工程也可以秒開;編譯速度大幅提升。在整個動態研發流程中,通過工具鏈將組件從靜態庫轉化成動態庫,鏈接時間明顯縮短。

5. 查看全源碼

ARK 工程下默認只有開發組件的源碼,查看全源碼是開發中的剛需。動態研發流程提供了 pod doc 異步命令實現該能力,此命令可以在開發時執行,命令執行完成後重啓工程即可通過 Document Target 查看工程中其他組件源碼。

pod doc 優點:

  • 支持異步和同步,執行過程中不影響本地開發。
  • 執行指令時跳過依賴解析環節,從服務端獲取依賴信息,下載源碼。
  • 通過 xcodegen 異步生成 Document 工程,大幅降低 pod install 時間。
  • 僅複用 pod installer 中的資源下載、緩存模塊。
  • 支持倉庫統一鑑權,自動跳過無權限組件倉庫。

收益

體驗上: 與傳統模式開發流程一致,零成本切換動態研發模式。

工具上: 站在巨人的肩膀上,CocoaPods 工具鏈相關優化在 ARK 同樣生效。

時間上: 傳統研發模式中,歷經各項優化後雖然能將全鏈路開發時間控制在 20 分鐘左右,但這樣的研發體驗依舊不夠友好。開發非常容易在這個時間間隔內被其他事情打斷,良好的研發體驗應該是連貫的。結合本地開發體驗我們認爲,一次連貫的開發體驗應該將工程集成時間控制在分鐘級,當前研發模式成功做到了這一點,將全鏈路開發時間控制在 5 分鐘以內。

成功率: 成功率一直是研發效率中容易被忽視的一個指標。據不完全數據統計,集團內應用的本地全量編譯成功率不足五成。一半的同學會在首次編譯後執行重試。顯然,對於工程新手來說就是噩夢,這意味着很長時間將在這一環節中浪費。而 ARK 從平臺基線到本地工具鏈貫徹 Sandbox 的理念,整體上提高編譯成功率。

寫在最後

ARK 當前已經在字節跳動內部多業務落地使用。從初期技術方案的探索到實際落地應用,遇到了很多技術難點,也對研發模式有了新的思考。

相關技術文章將陸續分享,敬請期待。

擴展閱讀

[1] ARK: https://github.com/kuperxu/KwaiTechnologyCommunication/blob/master/5.WWDC-ARK.pdf

[2] MBox: https://mp.weixin.qq.com/s/5_IlQPWnCug_f3SDrnImCw

字節跳動終端技術團隊(Client Infrastructure)是大前端基礎技術的全球化研發團隊(分別在北京、上海、杭州、深圳、廣州、新加坡和美國山景城設有研發團隊),負責整個字節跳動的大前端基礎設施建設,提升公司全產品線的性能、穩定性和工程效率;支持的產品包括但不限於抖音、今日頭條、西瓜視頻、飛書、懂車帝等,在移動端、Web、Desktop等各終端都有深入研究。

火山引擎應用開發套件MARS是字節跳動終端技術團隊過去九年在抖音、今日頭條、西瓜視頻、飛書、懂車帝等 App 的研發實踐成果,面向移動研發、前端開發、QA、 運維、產品經理、項目經理以及運營角色,提供一站式整體研發解決方案,助力企業研發模式升級,降低企業研發綜合成本。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章