百度直播iOS SDK平臺化輸出改造
導讀: 百度直播定位成直播SDK,賦能百度廠內APP使用,隨著業務規模快速擴大、程式碼體量膨脹、宿主接入定製訴求強烈,在不影響業務迭代和業務規模擴張的前提下,直播工程架構也在不停優化 。
全文2496字,預計閱讀時間7分鐘。
一、 背景
百度直播定位成直播SDK, 賦能百度廠內APP使用, 隨著業務規模快速擴大、程式碼體量膨脹, 直播原有工程結構限制了直播的快速發展, 隨著垂類APP數量接入, 宿主接入流程中定製困難/配置除錯耗時/需要實現的協議多等問題制約了SDK對外的輸出, 總結起來就是以下兩個大類問題:
-
工程層面問題: 原生工程結構影響開發效率/業務程式碼耦合嚴重/宿主繫結的功能巨集定義造成SDK差異化輸出困難
-
接入流程層面問題: 定製困難/配置除錯耗時/協議眾多等問題
在不影響業務迭代和業務規模擴張的前提下, 直播團團隊有針對性的逐步進行了改造, 實現最終SDK靈活高效的平臺化輸出。
二 、工程層面改造
工程層面改造分為三步走, 首先是工程接入EasyBox, 其次是業務維度元件化多倉庫拆分, 在前兩步基礎上最後完善SDK差異化輸出能力, 整體完成了工程架構改造遷移。
1.工程改造
直播最早期工程是基於Xcode原生工程, 多project巢狀連編實現工程構件, 這種方式在弊端太多, 基於手百自研EasyBox工具鏈, 直播進行了工程化的改造, EasyBox工具鏈對於工程是標準化的模版式改造
首先是對於liveBoxAPP工程的殼化, 其次對於原有的業務工程標準分層, 直播工程重新劃分了邏輯層級:
-
殼工程, 直播SDK編譯執行構建環境
-
MixTure構建層, 控制SDK差異化構建,通過EasyBox支援變體(variant)元件的實現差異化, 通過link_dependency控制產物SDK的自由組合生成
-
業務層, 直播核心業務
-
基礎庫層
-
宿主平臺庫依賴層/三方依賴庫
基於以上改造, 使直播工程依賴關係更加清晰, Easybox分層使層級之間的依賴不會裂化, 以上改造只是基於直播原用工程結構的升級改造, 業務倉庫本身還是有問題, 因此針對業務倉庫做了多倉多元件模版拆分。
2.多倉多元件模版拆分
業務倉庫的問題主要是業務耦合嚴重/許可權無隔離, 直播早期倉庫管理機制是Monorepo, 隨著業務規模膨脹, 團隊擴大, 直播按照模版業務唯獨拆分了多倉庫, 倉庫管理升級到Multirepo, easyBox本身也支援Multirepo模式. 直播間業務VC是由一套slotPage框架來管理佈局和服務, slotPage簡單來說就是把直播間的UI和能力劃分為(直播間內)元件/外掛/服務, 提供元件的佈局管理/事件分發/基礎狀態管理的一套頁面管理機制, 直播針對business層倉庫元件進行了模版維度的拆分, 具體分為已下幾步:
-
Business層拆分出service層, 將通用能力統一下沉到service層倉庫元件
-
拆分基礎核心直播容器元件, 提供直播間核心能力
-
拆分直播間功能沉澱為通用元件外掛池
-
按照模版維度拆分Business層倉庫元件, 歸屬業務模版特有的(直播間內)元件/外掛
3. 支援SDK差異化輸出
不同宿主對SDK定製需求差異化很大, 因此SDK要靈活支援裁剪, EasyBox雖然能通過變體(variant)和link_dependency能實現差異化構建, 但是對於直播間內小元件功能裁剪定製不太適用, ,因此直播提供小元件編譯時注入能力, 直播元件都包含一個註冊module, module分發直播核心的Module Event, 在event合適的時機, 註冊元件的服務到Pyramid, 採用實現impl和interface分離的方式來實現真正的需要差異化輸出元件的編譯隔離, 差異化元件橫向禁止依賴, impl元件只能依賴interface的介面元件。
基於以上改造, 靈活實現了直播功能小元件的差異化組裝構建。
三、 接入效率優化
工程層面問題改造完成後, 為了實現能夠宿主自動接入/快速除錯, 直播團隊也做了很多輔助工具, 能夠實現業務方自動化接入。
1. 自動化接入平臺
由於SDK功能複雜而且可選,上下游依賴眾多, 每接入一個宿主涉及眾多業務,造成接入成本特別高, 因此直播開發了可視化出包平臺, 宿主接入在用接入文件+自主出包平臺的方案, 降低接入成本, 以下是流程圖:
在接入平臺上, 申請SDK接入, 填寫相應的資訊, 根據直播提供的功能清單選擇功能, 稽核通過後, 會觸發對應的SDK構建, 可以快速獲取SDK產物, 根據直播提供的接入文件, 即可實現自動接入。
2.快速原始碼除錯/對映
直播是一個超大工程, 在宿主原始碼除錯按照EasyBox配置方式需要引入直播所有倉庫, 配置繁瑣且容易出編譯問題, 基於EasyBox工具, 直播開發了直播自己的原始碼除錯外掛, 可以在支援一鍵配置直播原始碼除錯到宿主, 並且為了方便除錯問題, 擴充套件了外掛能力, 在EasyBox二進位制原始碼對映機制開發了直播自己的小元件力度的對映, 原理圖如下:
3.接入協議優化
SDK快速迭代, 對外暴露的協議也比較多, 每個宿主情況各異,每一個協議都實現對於業務接入成本也是很高, 直播提供一系列小元件二進位制, 提供通用實現協議實現, 宿主根據自身情況自由引入, 降低接入成本。
四、收 益
基於以上幾步的改造, 收益比較明顯, 主要是效率的提升:
-
藉助EasyBox和mgit , 工程複雜度降低, 直播業務同學開發成本降低
-
基於直播差異化構建方案設計,垂類產品功能定製無需侵入直播核心業務,實現靈活可定製, 功能元件自由裁剪
-
藉助於自動接入平臺, 大大降低溝通對接成本, 實現接入使用SDK的自動化,標準化
-
開發EasyBox原始碼除錯外掛, 方便對接同學快速除錯
五、結語
直播工程 化是站在廠內EasyBox工具鏈的基礎上, 結合直播特定的訴求, 演化成直播自己的工程開發模式, 無論是工程化改造還是接入效率優化,迴歸本質, 最終目的就是提升開發效率, 助力產品快速迭。
推薦閱讀:
百度APP 基於Pipeline as Code的持續整合實踐
百度交易中臺之錢包系統架構淺析
百度評論中臺的設計與探索
一鍵三連,好運連連,bug不見 :point_down:
- ffplay影片播放原理分析
- 微服務化解決文庫下載業務問題實踐
- 百度APP Android包體積優化實踐(二)Dex行號優化
- 百度工程師眼中的雲原生可觀測性追蹤技術
- 百度APP Android包體積優化實踐(一)總覽
- 百度APP iOS端記憶體優化實踐-大塊記憶體監控方案
- 使用百度開發者工具 4.0 搭建專屬的小程式 IDE
- 使用百度開發者工具 4.0 搭建專屬的小程式 IDE
- 百家號基於AE的影片渲染技術探索
- 百度工程師教你玩轉設計模式(觀察者模式)
- Linux透明大頁機制在雲上大規模叢集實踐介紹
- 百度APP 基於Pipeline as Code的持續整合實踐
- Go 語言使用 MySQL 的常見故障分析和應對方法
- 超高效!Swagger-Yapi的祕密
- Linux透明大頁機制在雲上大規模叢集實踐介紹
- 百度直播iOS SDK平臺化輸出改造
- 百度直播iOS SDK平臺化輸出改造
- 基於模板配置的資料視覺化平臺
- 揭祕百度智慧測試在測試自動執行領域實踐
- 百度直播iOS SDK平臺化輸出改造