網易技術乾貨 | 雲信跨平臺C++ SDK開發實戰
阿新 • • 發佈:2020-06-24
1. 序 言
2018年,Flutter Release正式釋出,將移動端跨平臺開發技術再一次推上風口浪尖。2019年5月,Flutter 1.5正式支援Web開發,而預告中正在開發的Flutter for Desktop以及對於嵌入式的支援,使得Flutter最終目標將不再是移動框架,而是一個跨平臺、多平臺框架。再往前推數年,RN、小程式已經是移動端生產開發中常見的跨平臺開發技術,Electron、Qt也逐漸成為當前桌面端跨平臺應用的首選技術方案。 綜上所述,在客戶端一次編寫,多處執行的大趨勢下,底層SDK服務能力的跨平臺化、多平臺化就顯得更為重要和自然。 雲信SDK提供有iOS/OSX、AOS、Windows、Linux、Unity等常見平臺的支援,從長期的開發維護中得到的經驗,我們認為底層能力的跨平臺化應該解決如下痛點:- SDK介面在各平臺上不統一,包括介面的命名、傳參,對外部開發者不友好。
- SDK功能在各平臺上由不同團隊維護,需求需要反覆溝通保障實現上的統一,使得產品迭代速度很慢。
- 如果團隊之間沒有有效的溝通,面對同樣的需求和能力,不同的實現方案,測試團隊往往需要設計不同的測試用例,降低了產品迭代效率。
2. 架構介紹
網易雲信C++ SDK目前還只支援Windows平臺,架構設計如下圖:- third patry:引入的三方庫。
- 元件層:SDK開發框架的根基,提供對通訊套接字、本地快取、加/解密、執行緒模型、日誌等基礎功能元件,並對引入的三方庫進行二次封裝。
- SDK業務實現層:包含了所有SDK業務邏輯的實現,SDK內部執行緒的管理等。
- SDK介面層:對外暴露SDK各功能介面並提供c++封裝層
3. 跨平臺改造
nbase模組與SDK的實現已深度的耦合,此次改造我們提出了以下幾個目標:- 對上層業務程式碼最少的改動,最好是不要改動。
- 可方便更換跨平臺框架,雖然我們選擇了Chromium base作為我們開發框架,但是有可能會隨著Chromium的迭代而對跨平臺框架進行升級/降級,或者為滿足特殊裝置改用其它跨平臺方案。
4. 改造之路
4.1. 規範化編碼 除了遵循Google cppguide外我們還整理了與我們SDK開發相關的一些規則:- 標頭檔案: 為了避免某些編譯器編譯失敗,包含的標頭檔案不能使用‘\’,必須全部使用‘/’,不要使用#pragma once ,使用#ifndef _XXX_H_ #define _XXX_H_ #endif,標頭檔案目錄必須從頂層目錄開始,比如’core/core/nim_core.h’。
- 名稱空間: [namespace]_BEGIN_DECLS/[namespace]_END_DECLS/ USING_NS_[namespace] 替換原先的名稱空間定義。
- 匯出API/類: XXX_EXPORT,匯出的類和函式都要加上這個巨集。
- 規範系統定義: OS_WIN/OS_MAC/OS_LINUX/OS_ANDROID/OS_IOS儘量不要直接使用系統自帶的巨集 比如WIN32。
- 規範各平臺實現的區別: 通過檔案字尾來區分,比如 platform_device_win.cpp、 platform_device_android.cpp等。
- 字串編碼格式的標準化: 使用 std::string/UTF8String/UTF16String/UTF32String。
- 方便整合到我們的工程除錯,在開發過程中經常會碰到這樣那樣的問題,所以除錯是必不可少的步驟。
- 為了後續對base庫的精簡和可控打下基礎。
- Windows SDK 改為使用7.0
- WINVER = 0x0501
- PSAPI_VERSION = 1
5. 經驗分享
網易雲信目前已經開發完成並上線了跨平臺C SDK,從一開始的開發跨平臺C SDK到如今的對C++ SDK的跨平臺改造,開發小組也接觸了許多C++開發領域常見並熟識的跨平臺基礎庫,例如stl、boost、Poco、folly等,內部也對幾個基礎庫做過詳細的對比,首先根據我們的SDK業務需求,以及對平臺的需求,如果我們做到跨平臺需要滿足以下幾個最基本的需求: Facebook 的 folly庫應該也是個很好的選擇,但由於時間關係沒有去整理,看介紹,這個庫為了效率重造了很多輪子,估計會有很多詭異的實現,所以並未進入對比範圍。- chromium base + net
- Boost
- Poco
6. TO DO
目前,雲信跨平臺SDK已經支援Windows(xp+)、OSX、iOS平臺,我們計劃2019年Q4完成對Linux部分桌面發行版的開發支援工作,2020年Q1完成對AOS的開發支援工作,後期也會增加對常見的小型裝置的開發支援工作。此外,為了方便開發者快速接入SDK,我們將在2019年Q4上線基於跨平臺SDK封裝的ElectronSDK,2020年上半年上線FlutterSDK。 跨平臺SDK本身很多元件或思想來自於開源社群,未來我們計劃開源跨平臺開發框架,通過回饋開源社群,希望繼續與社群一起打造好玩的“輪子”,大家可以先關注https://github.com/netease-im/phoenix。開源該技術提高了產品團隊與開發者之間的透明度,有助於跨平臺開發的普及,並使開發者能夠參與並對這些開源技術做出持續貢獻。 最後,感謝曾經以及如今還在為網易雲信跨平臺SDK貢獻程式碼的小夥伴們,包括但不限於rg,gg,harrison等等大佬們。7. 傳送門
- 網易雲信跨平臺C++ SDK: github.com/netease-im/…
- 網易雲信跨平臺開發框架: github.com/netease-im/…
- 網易雲信Duilib應用介面開發框架: github.com/netease-im/…
- 網易雲信Electron-SDK: github.com/netease-im/…
- 網易雲信跨平臺C SDK: github.com/netease-im/…
- google/styleguide: github.com/google/styl…
- Google 開源專案風格指南: zh-google-styleguide.readthedocs.io/en/latest/
- Get the Code: Checkout,Build,& Run Chromium: www.chromium.org/developers/…
- The Chromium Projects For Developers: www.chromium.org/developers/