主頁 > 移動端開發 > 中心化決議管理——云端分析

中心化決議管理——云端分析

2022-09-27 09:08:50 移動端開發

作者:錢佳衛,研發工程師,產品研發和工程架構部-Client Infrastructure-App Infra-DevOps-Developer Tools

前言

CocoaPods 云端分析能力是位元組跳動的終端技術團隊(Client Infrastructure) 下 Developer Tools 部門提供的一系列云化基礎設施之一, Developer Tools 團隊致力于建設下一代移動端云化基礎設施,團隊通過云 IDE 技術、分布式構建、編譯鏈接等技術,優化公司各業務的研發和交付程序中的質量、成本、安全、效率和體驗,

一、背景

iOS 組件化研發模式下,CocoaPods 已然成為 iOS 業界標準的依賴管理工具,但隨著業務能力不斷拓展迭代,組件數量不斷增多,導致App工程復雜度急劇增大,依賴管理效率嚴重下降,甚至出現潛在的穩定性問題,為了能夠更快、更穩定得管理大型專案的組件依賴,iOS build 部門打造了一套中心化依賴管理服務——云端依賴分析,從工具鏈的層面收斂了依賴管理流程,加速了決議速度,聚合了失敗問題,

圖片

二、什么是云端依賴分析

圖片

基于 CocoaPods 的 iOS 工程管理,每次執行 pod install,都需要先將組件索引資訊 Spec 倉庫同步到本地,一般都依靠于 git 倉庫的 clone,然后讀取 Podfile、Lockfile 以及其他組態檔,開始進入依賴分析、依賴下載、工程整合等幾個步驟,

圖片

云端分析是一個依賴于位元組跳動自研制品庫平臺,通過工具鏈上傳本地工程構建物料,快速回傳依賴分析結果,中心化管理 iOS 工程依賴的云端服務,云端分析服務會依賴于制品庫提供所有組件索引資訊;并且通過云端分析本地工具在環境準備程序中獲取本地工程物料,統一上傳至云端進行依賴決議任務,云端借助于一系列優化手段以及服務器性能,快速回傳一個決議結果,本地接收到決議結果之后進行后續的依賴下載與工程整合程序,

云端分析的接入方式也極其容易,不需要增加組態檔,也不需要修改原有研發模式,以無侵入、無接入成本、不影響研發流程的方式接入到工程專案中,唯一需要做的,僅僅是在 CocoaPods 工具鏈中加入云端分析的 RubyGem 插件,并在 pod install 命令中增加一個開啟優化功能的控制開關引數,

三、如何加速決議

3.1 制品庫 (全量組件索引資訊)

基于 Cocoapods 的 iOS 開發體系對 iOS 的產物管理是非常粗放的,直接將不同的 git 倉庫作為構建產物(podspec 檔案)的索引倉庫,擔當了制品庫的角色,隨著 iOS 工程的復雜化,git 倉庫的檔案資訊增加導致組件索引資訊查詢困難,倉庫的同步速度緩慢,BitNest 制品庫是公司自研的移動端的產物管理系統,用于管理持續集成程序中所產生的構建產物,制品庫將分離在各個 git 倉庫的 podspec 源進行了中心化的管理,通過一套完整的 CLI 指令,能夠快速拉取、查詢 podspec 資訊,云端分析服務借助于制品庫能力的幫助,能夠在云端實時訪問一個全量完整的 podspec 源資訊,每次CocoaPods 任務都不需要再去更新 podspec 源資訊,也不會因為不及時更新 podspec 源資訊而找不到最新發版的組件 podspec 資訊,

3.2 快取機制

圖片

在介紹快取機制之前,先簡單介紹一下 pod install 中依賴分析的運行流程,在第一次執行的時候(忽略 lockfile),CocoaPods 會通過 DSL 從 Podfile 中讀取具體的 plugin,source,target,pod 等內容,創建相應的物件完成準備階段,在每個 Target 物件中每個 pod 都創建成了 Dependency 物件,并且都會有具體的 Requirements 物件,所有 Target 物件的所有 Dependency 物件都逐個被加入到堆疊中,并創建一個 Graph 依賴節點圖,每個 Dependency 物件根據其 Requirements 去對應的 Source 倉庫尋找對應的 pod,如果 Requirements 中沒有倉庫資訊,就從 podfile 公共 Source 中遍歷尋找,找到對應的 pod 之后,會先建立一個版本串列,并從版本串列中找出所有符合 Requirements 要求的 pod,然后讀取對應是 podspec 檔案內容,決議中會對 Spec 物件中隱式的 pod 創建新的 Dependency 加入到分析堆疊和 Graph 中,如果某個版本的 Spec 在遍歷 Graph 依賴圖時不滿足另一個同名依賴的 Requirements,就會進行出堆疊回撤和依賴圖回撤,直至所有 Dependency 都被找到對應的 Spec 物件為止,分析就完成了,可見,在 CocoaPods 依賴管理程序中,有大量重復的物件創建和排序查找程序,極大的降低了研發效率,試想,讓 CocoaPods 任務所需的物件一直保持就緒狀態,每當收到任務請求立即執行依賴分析作業,就可以快速回傳結果,云端分析服務集中化了所有 CocoaPods 的依賴管理任務,針對重復的作業搭建了物件快取機制,采用懶加載的模式,對新增物件進行快取,在下一次任務進來之后立刻進入依賴決議程序,

3.2.1 排序 Version 快取

圖片

在分析每個 pod 時,為了能獲取最新版本的 pod 依賴,CocoaPods 會對 source 倉庫中的所有版本號建立對應的 Version 物件,并進行排序,目前,公司內部大部分制品版本已經達到上萬的數量級,而且在不指定 source 源的情況下,二進制版本和原始碼版本都會被排序并讀取,最侄訓取一個滿足要求且最新的版本,由于組件版本號都以 “.” 和 “-” 分段,大部分組件版本都存在4個或者5個欄位以上,這也致使上萬個組件在進行排序的程序中,每次排序對比都需要遍歷4次以上,使時間復雜度提升了好幾倍,極大得增加了耗時,

為了更快得獲取到有序的版本串列,由制品庫服務維護了所有 pod 組件從大到小排序的版本檔案;每增加一個新的 pod 版本,制品庫都會向檔案中插入一個新版本;洗掉時,則會洗掉相應的版本欄位,

有了有序的版本檔案,云端分析增加 Version 快取的主要目的是為了將版本分段資訊一直維持在 Version 物件中,可以快速判斷當前 Version 是否滿足依賴的要求,Version 快取可以讓依賴管理程序提速大約10-12秒左右

云端分析在無版本快取的情況下,會優先讀取版本檔案中的資料,直接獲得有序的版本串列;如果版本串列長度與 source 中組件版本目錄長度不一致,會回退到原始方法(版本串列出錯,確保分析的正確性),在快取命中的情況下,也需要判斷快取版本串列長度是否與 pod 版本目錄長度相等(有新增版本,快取未新增),則會從版本串列陣列中查找出差異版本,并對快取進行修正,

3.2.2 Spec 物件快取

圖片

CocoaPods 在從排序版本中查找滿足依賴要求的 podspec 時,會將所有滿足依賴要求的 podspec 版本內容全部讀取進來,進行依賴決議遍歷,如果在不注明具體版本的情況下,所有版本的 podspec 檔案都將被讀取,并且在不注明具體 source 源的情況下,所有 source 存在的 pod 也都會被讀取,一萬個 podspec 檔案讀取就需要花費 30 秒左右(據不同磁盤而定)

云端分析會對每次分析任務 IO 讀取的 podspec 檔案內容進行快取,在下次任務獲取 Spec 物件時,可以根據 source,pod_name,version 三個欄位直接得到對應的Spec物件,

同時,為了確保 Spec 的正確性,防止 Spec 在不改變版本而更改內容的情況出現,Spec 物件快取是以一個多維陣列的形式存在,通過判斷 podspec 檔案的修改時間,來更新快取中的 podspec 內容為最新提交的,確保 checksum 計算與本地拉倉依賴分析的計算值相同,實作云端依賴分析的正確性,后續,也會增加 Spec 快取命中次數,Spec 物件過期時間等,實作 Spec 快取的清理策略,

3.2.3 快取復用

圖片

云端分析也會對分析結果進行快取,下一次遇到相同的分析任務能夠直接復用,云端在獲取一次物料之后,會對物料做一次全域 hash 計算和一次分段 hash 計算,分別快取完整的分析結果分析結果圖 Graph,針對下一次分析任務,如果是完全相同的物料可以直接回傳一個可用的完整分析結果;如果未匹配,會通過一些 target,platform 等資訊計算出一級平臺資訊 key,來確定具體 app 資訊;再對所有target 下的組件依賴逐個計算 hash 值,獲得二級 hash 陣列 key,并對應一個分析結果圖 Graph value;通過模糊匹配的方式對 hash 陣列 key 進行匹配,匹配到依賴個數相同最多的相近圖,來替換物料中的 locked_dependencies,來加速分析,當然,模糊匹配能力也有一定的局限性,無法對原本上傳 lockfile 物料的分析任務進行加速,

3.3 物料剪枝

云端分析會將 CocoaPods 物件轉變為位元組流進行傳輸,具體的上傳物料與分析結果具體如下:

圖片

1. 上傳物料

云端分析工具鏈會將 Podfile 物件、lockfile 生成的 Molinillo Graph 物件、指定的 Source 物件、插件配接器,所有的外部源 Specs 物件(具體為指定 git,path 和 podspec 的 pre-release 物件)作為上傳物料,但其實,云端分析并不需要這些本地物件的全部資訊,可以對這些物件進行剪枝,例如 Podfile 物件僅需要 target_definitions 的鏈表即可;Molinillo Graph 物件僅需要所有 pod 對應的節點,而不需要記錄操作節點的 log;Source 物件僅需要知道 name 和 repo_dir 即可,等等,其中,部分決議優化插件需要通過插件配接器額外傳輸一些配置 Config 物件,

2. 結果回傳

云端分析回傳的結果為以 Target 為 key,相應的 Specs 陣列為 value 的 hash 物件,結果回傳之前,會先對所有 Spec 的 Source 進行剪枝,由于每個 Spec 對應的 Source 在后續流程中僅使用到 url 的欄位進行分類與生成 lock 檔案,因此,可以洗掉 Source 物件其他無用的欄位,最小化傳輸內容,加快回應時間,對回傳結果進行剪枝后,傳輸內容大小可以減少大約10MB以上

圖片

3.4 決議策略兼容

為了確保決議結果的正確性和唯一性(single truth),云端分析兼容了位元組跳動內部各 CocoaPods 決議策略優化的工具鏈,根據工程中構建配置引數,云端分析本地插件識別出具體的決議策略,并傳遞到云端分析服務器并激活對應決議策略演算法進行快速決議,同時,結合已有的決議優化策略和云端的優化加速機制,讓 CocoaPods 的依賴管理流程達到秒級回傳

四、總結

本文主要分享了目前位元組跳動內部的一種 CocoaPods 云端化的優化方案,針對大量重復的 iOS 工程流水線構建任務進行了收斂和復用,在保證依賴決議正確性的前提下加速了依賴管理速率,提升了研發效能,目前云端分析服務已經完成第一階段的開發并落地使用,已被公司內部幾個核心的生產線使用,如頭條接入云端分析服務后,pipeline 的依賴分析階段耗時加速60%以上,后續,對于 CocoaPods 的下載優化,工程快取服務也已經在技術探索中,相關技術文章將陸續分享,敬請期待!

擴展閱讀

CocoaPods原理詳解:https://mp.weixin.qq.com/mp/appmsgalbum?__biz=MzA5MTM1NTc2Ng==&action=getalbum&album_id=1477103239887142918&scene=173&from_msgid=2458325057&from_itemidx=1&count=3&nolastread=1#wechat_redirect

CocoaPods優化:https://www.infoq.cn/article/adqsbwtvsyzuvh429p8w

 

加入我們

我們是位元組的 Client Infrastructure 部門下的 Developer Tools 團隊,團隊成員由 IDE 專家及構建系統專家組成,團隊致力于通過客戶端云化技術以及編譯構建技術,優化公司各業務的研發和交付程序中的質量、成本、安全、效率和體驗,同時,在實踐的程序中我們也看到了很多令人興奮的新機會,希望有更多對編譯工具鏈技術感興趣的同學加入我們一起探索,

職位鏈接

https://jobs.bytedance.com/referral/pc/position/detail/?token=MTsxNjYzMTM3NTEwNTU2OzY2ODgyMDc4MjQ2MDQyMzUyNzI7Njc5OTgyMjIzMjczNTQ1MTQwMA

圖片

【掃碼投遞簡歷】



轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/509657.html

標籤:iOS

上一篇:Git 便捷操作

下一篇:返回列表

標籤雲
其他(145340) Python(37296) JavaScript(24909) Java(16484) C(14967) 區塊鏈(8236) C#(7957) AI(7469) 爪哇(7405) html(6776) MySQL(6729) 基礎類(6313) sql(6084) 熊猫(6051) PHP(5787) 数组(5741) R(5307) 反应(5188) Linux(5185) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4417) 数据框(4310) css(4249) 节点.js(4029) C語言(3288) json(3241) 列表(3120) C++語言(3117) 扑(3085) 安卓(2997) 打字稿(2957) VBA(2784) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2402) ASP.NET(2364) MongoDB(2317) 麻木的(2285) 正则表达式(2232) 字典(2211) 循环(2197) 迅速(2174) 擅长(2159) 镖(2150) 功能(1967) Web開發(1951) python-3.x(1918) 弹簧靴(1911) xml(1884) for循环(1841) 谷歌表格(1837) Unity3D(1824) PostgreSQL(1808) .NET技术(1800) 網絡通信(1793) .NETCore(1792) 蟒蛇-3.x(1774)

熱門瀏覽
  • 【從零開始擼一個App】Dagger2

    Dagger2是一個IOC框架,一般用于Android平臺,第一次接觸的朋友,一定會被搞得暈頭轉向。它延續了Java平臺Spring框架代碼碎片化,注解滿天飛的傳統。嘗試將各處代碼片段串聯起來,理清思緒,真不是件容易的事。更不用說還有各版本細微的差別。 與Spring不同的是,Spring是通過反射 ......

    uj5u.com 2020-09-10 06:57:59 more
  • Flutter Weekly Issue 66

    新聞 Flutter 季度調研結果分享 教程 Flutter+FaaS一體化任務編排的思考與設計 詳解Dart中如何通過注解生成代碼 GitHub 用對了嗎?Flutter 團隊分享如何管理大型開源專案 插件 flutter-bubble-tab-indicator A Flutter librar ......

    uj5u.com 2020-09-10 06:58:52 more
  • Proguard 常用規則

    介紹 Proguard 入口,如何查看輸出,如何使用 keep 設定入口以及使用實體,如何配置壓縮,混淆,校驗等規則。

    ......

    uj5u.com 2020-09-10 06:59:00 more
  • Android 開發技術周報 Issue#292

    新聞 Android即將獲得類AirDrop功能:可向附近設備快速分享檔案 谷歌為安卓檔案管理應用引入可安全隱藏資料的Safe Folder功能 Android TV新主界面將顯示電影、電視節目和應用推薦內容 泄露的Android檔案暗示了傳說中的谷歌Pixel 5a與折疊屏新機 谷歌發布Andro ......

    uj5u.com 2020-09-10 07:00:37 more
  • AutoFitTextureView Error inflating class

    報錯: Binary XML file line #0: Binary XML file line #0: Error inflating class xxx.AutoFitTextureView 解決: <com.example.testy2.AutoFitTextureView android: ......

    uj5u.com 2020-09-10 07:00:41 more
  • 根據Uri,Cursor沒有獲取到對應的屬性

    Android: 背景:呼叫攝像頭,拍攝視頻,指定保存的地址,但是回傳的Cursor檔案,只有名稱和大小的屬性,沒有其他諸如時長,連ID屬性都沒有 使用 cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Video.Media.DURATIO ......

    uj5u.com 2020-09-10 07:00:44 more
  • Android連載29-持久化技術

    一、持久化技術 我們平時所使用的APP產生的資料,在記憶體中都是瞬時的,會隨著斷電、關機等丟失資料,因此android系統采用了持久化技術,用于存盤這些“瞬時”資料 持久化技術包括:檔案存盤、SharedPreference存盤以及資料庫存盤,還有更復雜的SD卡記憶體儲。 二、檔案存盤 最基本存盤方式, ......

    uj5u.com 2020-09-10 07:00:47 more
  • Android Camera2Video整合到自己專案里

    背景: Android專案里呼叫攝像頭拍攝視頻,原本使用的 MediaStore.ACTION_VIDEO_CAPTURE, 后來因專案需要,改成了camera2 1.Camera2Video 官方demo有點問題,下載后,不能直接整合到專案 問題1.多次拍攝視頻崩潰 問題2.雙擊record按鈕, ......

    uj5u.com 2020-09-10 07:00:50 more
  • Android 開發技術周報 Issue#293

    新聞 谷歌為Android TV開發者提供多種新功能 Android 11將自動填表功能整合到鍵盤輸入建議中 谷歌宣布Android Auto即將支持更多的導航和數字停車應用 谷歌Pixel 5只有XL版本 搭載驍龍765G且將比Pixel 4更便宜 [圖]Wear OS將迎來重磅更新:應用啟動時間 ......

    uj5u.com 2020-09-10 07:01:38 more
  • 海豚星空掃碼投屏 Android 接收端 SDK 集成 六步驟

    掃碼投屏,開放網路,獨占設備,不需要額外下載軟體,微信掃碼,發現設備。支持標準DLNA協議,支持倍速播放。視頻,音頻,圖片投屏。好點意思。還支持自定義基于 DLNA 擴展的操作動作。好像要收費,沒體驗。 這里簡單記錄一下集成程序。 一 跟目錄的build.gradle添加私有mevan倉庫 mave ......

    uj5u.com 2020-09-10 07:01:43 more
最新发布
  • 中心化決議管理——云端分析

    云端分析是針對 CocoaPods 依賴管理云端化的優化方案。對大量重復的 iOS 工程構建任務進行了收斂和資源復用,在保證正確性的前提下達到了加速依賴管理速率的目的,實作了 Pod install 分析階段提速 60% 以上的能力。 ......

    uj5u.com 2022-09-27 09:08:50 more
  • Git 便捷操作

    雖然現在有很多圖形化的 Git 工具,但是命令列依然 yyds。本文記錄了作業中很有用的一些 Git 操作。 1.Fork出來的Git倉庫同步代碼 **背景:**有的時候從原倉庫fork出了一個新倉庫,這個新倉庫做了自己的修改。可是原倉庫也進行了更新,比如修復了bug,增加了新特性之類的。這個時候想 ......

    uj5u.com 2022-09-27 09:08:37 more
  • 華為帳號自擬形象上線 打造手機里的另一個你

    華為帳號自擬形象上線啦!用戶只需一張照片,即可輕松創建屬于自己的華為帳號自擬形象,還能對形象進行個性化裝扮,DIY發型、服裝、配飾等。點擊“手機設定 > 華為帳號 > 自擬形象 ”即刻擁有手機中的另一個你。 華為帳號自擬形象提供數個預置虛擬形象供用戶直接使用,用戶也能夠通過拍攝/上傳照片,一鍵生成照 ......

    uj5u.com 2022-09-27 09:08:19 more
  • 國際聾人周 | 聾健人群無界融合,看見手語的力量

    聽不見、聽不清、聽不懂,這是全國上千萬聽障群體的真實寫照。由于聽力的局限,他們在求學、作業、就醫、出行等方面都面臨巨大挑戰。AI時代,全行業為資訊無障礙建設形成強大合力,但聽障群體依然面臨著冷冰冰的現實:專業語言服務人員的稀缺、溝通輔助器具的不完備,甚至來自社會的偏見及誤解…… “聾人只要通過助聽設 ......

    uj5u.com 2022-09-26 07:32:31 more
  • 國際聾人周 | 聾健人群無界融合,看見手語的力量

    聽不見、聽不清、聽不懂,這是全國上千萬聽障群體的真實寫照。由于聽力的局限,他們在求學、作業、就醫、出行等方面都面臨巨大挑戰。AI時代,全行業為資訊無障礙建設形成強大合力,但聽障群體依然面臨著冷冰冰的現實:專業語言服務人員的稀缺、溝通輔助器具的不完備,甚至來自社會的偏見及誤解…… “聾人只要通過助聽設 ......

    uj5u.com 2022-09-26 07:31:56 more
  • 關愛2700多萬聽障者,手語服務助力無聲交流

    如果有一天,周遭的世界突然變得很安靜,動聽美妙的音樂,在你看來只是沉寂;振奮人心的演講,對你而言只是默劇;大自然的千里鶯啼,于你來說也只是畫卷。你會不會感到害怕? 而有這么一群人,每天都在與這世界無聲交流著,他們就是聽力障礙人士。據2006年第二次全國殘疾人抽樣調查顯示,我國的聽力殘疾人約2780萬 ......

    uj5u.com 2022-09-25 08:06:58 more
  • C C++指標面試題零碎整理

    最基礎的指標如下: int a; int* p = &a; 答:p指向a的地址,&是取a的地址。*指的是指標中取內容的符號。 2.str[]和str*的區別: char str1[] = "abc"; char str2[] = "abc"; const char str3[] = "abc"; c ......

    uj5u.com 2022-09-25 08:06:53 more
  • C C++指標面試題零碎整理

    最基礎的指標如下: int a; int* p = &a; 答:p指向a的地址,&是取a的地址。*指的是指標中取內容的符號。 2.str[]和str*的區別: char str1[] = "abc"; char str2[] = "abc"; const char str3[] = "abc"; c ......

    uj5u.com 2022-09-25 08:06:41 more
  • 關愛2700多萬聽障者,手語服務助力無聲交流

    如果有一天,周遭的世界突然變得很安靜,動聽美妙的音樂,在你看來只是沉寂;振奮人心的演講,對你而言只是默劇;大自然的千里鶯啼,于你來說也只是畫卷。你會不會感到害怕? 而有這么一群人,每天都在與這世界無聲交流著,他們就是聽力障礙人士。據2006年第二次全國殘疾人抽樣調查顯示,我國的聽力殘疾人約2780萬 ......

    uj5u.com 2022-09-25 08:06:30 more
  • 本文相關主要記錄一下使用Hbuilder打包成蘋果IOS-App的詳細步驟

    ?介紹一下個人開發者賬號: 再說下什么是免費的蘋果開發者賬號,就是你沒交688年費的就是免費賬號,如果你想變成付費開發者賬號,提交申請付費就行,賬號都是一樣的賬號。 沒有賬號的點擊鏈接申請: 蘋果開發者賬號申請 登錄開發者中心developer.apple.com/account這個界面就是免費開發 ......

    uj5u.com 2022-09-24 10:28:11 more