ACPM高效C++元件管理讓音視訊終端SDK效能更好、穩定性更高

2023-12-08 12:00:17
本專欄將分享阿里雲視訊雲MediaBox系列技術文章,深度剖析音視訊開發利器的技術架構、技術效能、開發能效和最佳實踐,一起開啟音視訊的開發之旅。本文為MediaBox技術架構篇,重點從 ACPM介紹、技術架構以及高效管理等方面,介紹如何通過MediaBox ACPM的高效元件管理,來提升音視訊終端SDK的穩定性和效能。

阿弗|作者

 

01 ACPM介紹

背景

針對行業音視訊數位化,阿里雲視訊雲提出了MediaBox終端一體化套件,融合了播放、直播、超低延遲直播、實時音視訊通訊、短視訊創作等多種音視訊能力,但這並非簡單地把SDK疊加起來,而是通過合理的架構設計、抽離複用各種基礎元件等手段,最終構建出一個高效能、高可用、高靈活性、可插拔、易擴充套件性的一體化SDK

其中得益於元件的高度複用,終端一體化總能以更小的包體提供同樣的能力組合。但隨著元件化的深入,元件的版本管理、元件間的依賴關係、元件開發進度不同帶來的團隊共同作業問題、元件本身的穩定性和效能等問題都需要更好地解決,因此我們設計了ACPM來統一解決元件化過程中出現的問題。

概念

ACPM全稱是Aliyun C++ Package Manager,主要解決C++包管理的問題,同時也負責元件的資源、aar、原始碼偵錯等。ACPM的核心目標是簡化專案中的依賴庫管理,減少繁瑣的設定工作,提高開發人員的生產效率,並確保專案的穩定性。

使用流程

包管理工具本身主要解決包的版本管理和依賴關係管理,但其本質是解決團隊共同作業問題,使用工具目的也是為了團隊提效,同時在高效中提升音視訊終端SDK的效能和穩定性。因此,以下以元件的使用方和提供方兩種角色的不同視角來描述工具流程:

 

 

• 依賴元件(使用方):負責根據描述分析依賴關係、下載對應元件、生成cmake工程需要的編譯檔案;

• 釋出元件(提供方):負責託管元件靜態庫(在MTL上)並記錄釋出時的具體資訊以供依賴時分析。

 

02 技術思路

ACPM始於包管理問題,但我們現在談論ACPM已經不僅限於包管理,而是整個元件化過程中的一系列工具。元件化的核心思想就是分而治之,我們把龐大複雜的工程拆解為一個個小元件,再組合起來,每個小元件其實都是一個獨立的個體。跟SDK開發、應用開發一樣,元件開發也有著嚴格的研發流程,只有把一個個小元件治理好了才能治理好龐大複雜的工程。

要讓元件化過程變得高效,我們不僅要解決包管理的問題,還需要關注元件化的整個研發流程,對整體進行優化的同時,也為每個節點提供相應的工具來提高效率。

 

 

03 高效管理

以下針對元件研發流程的每個節點,展開介紹我們是怎樣去做的。

元件開發

想要高效地完成元件化,最直接的想法是並行地去做,並行開發每個元件,當然這要求元件本身是獨立的、物理隔離的。然而,獨立的元件需要獨立的工程,要實現元件的多平臺複用,這就要求每個元件都要建立平臺工程來進行開發偵錯,其中的工作量無疑是非常重複且繁瑣的。

雖然各元件的功能職責各不一樣,但每個元件的工程結構實際上是相似的,所以我們在這個環節上提供工具指令碼,實現一鍵搭建標準化的元件工程,讓元件開發者只需關注邏輯開發本身即可。

 

 

* 有意思的是,我們的元件開發工程本身也是通過ACPM包管理組織起來的,充分說明了一切皆元件。

 

元件測試

雖然元件是可以物理隔離的,但終歸還是要組合在一起,想要實現高效融合,這就要求元件融合前已經是穩定的,如果元件本身的問題直到融合後才被發現,那麼無論是對於問題的偵錯還是共同作業效率來說都是低效的,所以元件釋出前都需要經過測試。由於我們的元件都是多平臺複用的,如果要求元件的每個版本都對所有平臺逐一測試會十分消耗人力,因此,我們需要自動化地去完成這項任務。

基於此,我們提供完整的測試平臺進行實現,元件只需在平臺上設定好一次任務,後續的所有版本都可以重複使用。我們也提供了各個平臺所需的裝置,元件開發者只需要編寫好測試用例,其他的所有事情都可以自動化完成,這不但提高了元件的開發效率,同時也保障了元件的穩定性。

 

 

元件構建&釋出

寫程式碼、編譯、偵錯,是技術同學的日常。在提升開發效率上,減少編譯時間是一件收益頗豐的事情,為此,我們絕大部分的元件都會提供各平臺的預編譯庫。但對於多平臺複用的元件而言,其中的過程又非常繁瑣,況且與原始碼不一樣,預編譯庫還可能產生難以發現的ABI相容問題,更何況預編譯庫的問題追溯也比原始碼更加困難,因此我們需要記錄每一次預編譯釋出的原始碼來源、構建過程等以更好地排查問題。

雖然要解決的問題很多,但這在效率上的收益值得我們去逐一攻克。為解決上述問題,我們基於集團的MTL,編寫了外掛、提供了各平臺統一的編譯鏈工具、釋出前自動化安全檢測、提供機器人提高發布效率等,以此實現元件構建和釋出環節的高效管理。

 

 

元件使用

ACPM提供簡單而強大的方式整合依賴庫,只需編寫一個json檔案去描述需要的依賴庫名字和版本,無需手動下載和編譯,工具就會自動地去處理這些步驟,讓開發者可以專注於專案的核心開發。

為了讓開發更加地高效,工具還會根據開發者當前構建的平臺,按需下載對應的資源並做好相應的快取。

同時,為了方便研發人員使用,工具可以開箱即用,甚至不需要提前安裝,只需把工具的倉庫作為子模組,研發團隊中的其他成員就可以直接使用,大大提高了元件使用效率。

 

{
  ...
  "dependencies": {
    "包名": "版本號",
    "包名": {
      "version": "版本號",
      "forcedSpecifyVersion": "強制指定的版本號",
      "fromRepository": "正式 或者 開發版本",
      "sourceCodeFirst": "是否優先選用原始碼依賴",
      "customSourcePath": "自定義原始碼路徑"
    }
  }
  ...
}

 

* 我們支援簡易地通過名字和版本描述依賴,也支援自定義描述以滿足更多的客製化需求。

 

簡單的工程(如上述所示)通常不會有問題,但複雜的工程難免會遇到依賴庫衝突的問題。ACPM能夠自動檢測和解決依賴庫之間的衝突問題,從而減少由不同庫版本引起的問題,確保專案的穩定性和可靠性。

通常,衝突的解決是指找到一個版本使得各個依賴庫都能相容,而相容的判斷依據往往是API的相容,由於我們提供的庫很多都是預編譯的庫,我們不僅考慮到了API相容也考慮到了ABI的相容,從而使專案更加穩定可靠。

此外,在ABI相容的前提下,我們通過強制指定衝突元件版本,實現自動解決衝突而無需重新編譯子元件,以此滿足元件高穩定基礎上的高效管理需求。

 

 

元件穩定性分析

雖然我們有一系列的手段保障穩定性,但現實是我們總會遇到意想不到的崩潰情況,因此我們需要監控SDK的穩定性情況。為了給客戶最小的包體最優的SDK,我們最終會把元件組合成同一個動態庫進行提供,並去掉相應的偵錯符號,但這樣我們就很難知道崩潰發生在哪裡。這就會佔用研發人員更多的時間精力,以及難以對元件本身的穩定性情況有一個量化的認知。

在人工處理流程上,我們發現這個過程是可以通過工具自動化來提高整體效率,所以我們設計瞭如下流程:

 

 

由於我們的元件有獨立的用例進行測試,上述意想不到的問題只有在具體SDK上才會發現,為了提高元件問題的解決效率,我們支援在SDK上把元件的預編譯庫接入簡易切換為原始碼接入,而這隻需要在依賴描述中修改一個設定開關即可,從而提升元件穩定性分析的效率。

 

 

04 結語

ACPM是一個強大而靈活的C++依賴庫管理工具,它旨在為開發人員提供一種簡化依賴庫管理的方式。基於ACPM的高效管理,我們釋出了數十個元件的正式版本,規範了元件的開發釋出流程,並圍繞著元件化開發了各種提效工具,確立了多項規範流程,未來我們也將不斷細化流程和工具,以保證我們持續穩定高效的輸出。

 

 

瞭解更多音視訊終端SDK技術,歡迎通過釘釘掃碼加入MediaBox體驗群,與我們交流分享。

釘釘群連結