Jack Jiang

          我的最新工程MobileIMSDK:http://git.oschina.net/jackjiang/MobileIMSDK
          posts - 499, comments - 13, trackbacks - 0, articles - 1

          2025年3月27日

          1、基本介紹

          RainbowChat-Web是一套基于MobileIMSDK-Web的網頁端IM系統。不同于市面上某些開源練手或淘寶售賣的demo級代碼,RainbowChat-Web的產品級代碼演化自真正運營過的商業產品,其所依賴的通信層核心SDK已在數年內經過大量客戶及其輻射的最終用戶的使用和驗證。RainbowChat-Web同時也是移動端IM應用RainbowChat的姊妹產品。

           

          2、品質說明

          ? 源自真正運營的商業產品:RainbowChat-Web的技術源于真實運營的商業產品。

          ? 它不是個Demo:不同于市面上某些開源或淘寶售賣的demo級代碼,RainbowChat-Web的產品級代碼演化自真正運營過的商業產品,其所依賴的通信層核心SDK(即MobileIMSDK-Web)已在數年內經過大量客戶及其輻射的最終用戶的使用和驗證。

          ? 簡潔、精煉、優化、原生:RainbowChat-Web為了盡可能降低2次開發時的上手門檻、兼容性、可讀性、可維護性的難度堅持不依賴任何前端框架這些框架通常是指AngularJS、VUE、EmberJS、React等),返璞歸真,只使用原生JS+HTML+CSS(再無其它復雜性),極大降低開發者的上手難度、兼容成本,達到最簡潔、最精煉、最靈活的目標(簡潔、簡單、回歸本質的東西,才能擁最強的生命力)。

          截止目前:RainbowChat-Web努力保證在各主流系統、主流瀏覽器、不同分辨率屏幕上的體驗,包括但不限于:Chrome、Safari、FireFox、Edge、360瀏覽器、世界之窗瀏覽器等▼

          3、運行演示

          ? 運行截圖,詳見:《RainbowChat-Web前端功能截圖
          ? 演示視頻,詳見:《RainbowChat-Web運行演示視頻

          4、功能簡介

          1、支持文本消息、查看語音留言消息(App產品發送)、圖片消息大文件消息、查看短視頻消息(App產品發送)、名片消息位置消息、消息表情、快捷消息、消息撤回消息轉發等;
          2、支持一對一陌生人聊天模式;
          3、支持一對一正式好友聊天模式;
          4、支持多對多群聊聊天模式;
          5、完善的群組信息管理:建群、退群、解散、轉讓、邀請、踢人、群公告等;
          6、完整的注冊、登陸、密碼找回等等功能閉環;
          7、個人中心功能:改基本信息、改個性簽名、改頭像、改密碼等;
          8、支持查看個人相冊、個人語音介紹;
          9、完整的離線消息/指令拉取機制;
          10、完整的歷史消息/指令存取機制;
          11、完整的好友關系管理:查找好友、發出請求、處理請求、刪除好友、好友備注等;
          12、以及其它未提及的功能和特性。

          5、技術亮點 

          1)輕量易使用:純原生JS編寫,堅持不依賴任何前端框架這些框架通常是指AngularJS、VUE、EmberJS、React等);

          2)模塊化設計:所有UI模塊、數據邏輯均由獨立封裝的JS對象管理,代碼規范、低耦合,有效防止代碼復雜性擴散;

          3)瀏覽器跨域:所有AJAX接口均為JSONP實現,百分百支持跨域;

          4)通信代碼解偶:得益于高內聚的MobileIMSDK-Web工程,實現了IM功能邏輯與網絡通信的解偶,利于持續升級、重用和維護(這是經驗不足的IM產品做不到的);

          5)支持WebSocket:并非某些產品中還在使用的過時“長輪詢”技術,真正的“即時通訊”

          6)網絡兼容性好:核心層基于MobileIMSDK-Web技術,在不支持WebSocket的情況下仍可很好地工作;

          7)斷網恢復能力:擁有網絡狀況自動檢測斷網自動治愈的能力;

          8)輕松支持加密:一個參數即可開啟SSL/TLS通信加密

          9)服務端慢io解偶:IM實例本身堅持不直接進行DB等慢io的讀、寫,保證IM實時消息高吞吐和性能;

          10)服務端邏輯解偶:得益于MobileIMSDK-Web工程,實現了上層邏輯與網絡通信核心的解偶,底層數據通信全部通過低偶合的回調通知來實現;

          11)完善的log記錄:服務端使用log4js日志框架,確保每一關鍵步驟都有日志輸出,讓您的運行調試更為便利;

          12)聊天協議兼容:實現了與RainbowChat-APP產品完全兼容的協議模型;

          13)消息收發互通:實現了與RainbowChat-APP產品的無縫消息互通。

          6、支持的聊天消息類型

          7、好友聊天

          8、群聊聊天

          9、發送“群名片”消息

          10、發送“位置”消息

          11、“消息撤回”

          12、“消息轉發”

          12、“消息引用”

          14、“@”功能

          15、其它特性和細節

          聊天區上方聊天對象信息顯示:查看視頻

          消息送達狀態圖標顯示:查看視頻

          posted @ 2025-06-13 16:15 Jack Jiang 閱讀(25) | 評論 (0)編輯 收藏

               摘要: 本文由攜程前端開發專家Chris Xia分享,關注新技術革新和研發效率提升。1、引言本文介紹了攜程機票前端基于Server-Sent Events(SSE)實現服務端推送的企業級全鏈路通用技術解決方案。文章深入探討了 SSE 技術在應用過程中包括方案對比、技術選型、鏈路層優化以及實際效果等多維度的技術細節,為類似使用場景提供普適性參考和借鑒。該方案設計目標是實現通用性,適用于各種網絡架構和業務場景...  閱讀全文

          posted @ 2025-06-13 15:32 Jack Jiang 閱讀(23) | 評論 (0)編輯 收藏

          本文來自嗶哩嗶哩通用技術團隊分享,下文進行了排版優化和修訂。

          1、引言

          隨著 AI 技術快速發展,業務對 AI 能力的渴求日益增長。當 AI 服務面對處理大規模請求和高并發流量時,AI 網關從中扮演著至關重要的角色。AI 服務通常涉及大量的計算任務和設備資源占用,此時需要一個 AI 網關負責協調這些請求來確保系統的穩定性與高效性。因此,與傳統微服務架構類似,我們將相關 API 管理的功能(如流量控制、用戶鑒權、配額計費、負載均衡、API 路由等)集中放置在 AI 網關層,可以降低系統整體復雜度并提升可維護性。

          本文要分享的是B站在大模型時代基于多模型AI的網關架構設計和實踐總結,希望能帶給你啟發。

          * 相關閱讀:全民AI時代,大模型客戶端和服務端的實時通信到底用什么協議?

          技術交流:

          (本文已同步發布于:http://www.52im.net/thread-4831-1-1.html)

          2、系列文章

          1. 長連接網關技術專題(一):京東京麥的生產級TCP網關技術實踐總結
          2. 長連接網關技術專題(二):知乎千萬級并發的高性能長連接網關技術實踐
          3. 長連接網關技術專題(三):手淘億級移動端接入層網關的技術演進之路
          4. 長連接網關技術專題(四):愛奇藝WebSocket實時推送網關技術實踐
          5. 長連接網關技術專題(五):喜馬拉雅自研億級API網關技術實踐
          6. 長連接網關技術專題(六):石墨文檔單機50萬WebSocket長連接架構實踐
          7. 長連接網關技術專題(七):小米小愛單機120萬長連接接入層的架構演進
          8. 長連接網關技術專題(八):B站基于微服務的API網關從0到1的演進之路
          9. 長連接網關技術專題(九):去哪兒網酒店高性能業務網關技術實踐
          10. 長連接網關技術專題(十):百度基于Go的千萬級統一長連接服務架構實踐
          11. 長連接網關技術專題(十一):揭秘騰訊公網TGW網關系統的技術架構演進
          12. 長連接網關技術專題(十二):大模型時代多模型AI網關的架構設計與實現》(* 本文

          3、AI網關技術概覽

          AI 網關是一個用于統一接入和調度大語言模型(LLM)服務的系統,支持多供應商、多模型、負載均衡調度的管理。同時具備統一鑒權、Token 配額管理、安全審計與可觀測能力,確保 API 調用的安全性和穩定性。負載均衡模塊,能夠根據提供商多線路、多模型 和 API Key 進行靈活路由,并適用于多模型接入、多租戶等復雜場景。

          4、整體架構設計

          AI 網關的整體架構和傳統 API 網關及其類似,在數據面和控制面上有幾乎相同的設計。

          實際上 AI 網關就是衍生于之前微服務團隊的 API Gateway,我們在 API Gateway 的基礎上做了一些針對 AI 業務接口的特性優化,如無緩沖區的請求代理,支持域名、服務發現等混合調度,AI 超長響應時間請求的優雅退出等功能。

          在此基礎上我們使用于 API Gateway 相類似的數據面、控制面分離的架構,控制面會將變更后的網關配置準實時下發至數據面節點。數據面節點識別配置有更新后在運行時會動態切換代理引擎至新的代理邏輯下,并保證老的代理邏輯會處理完當下被分配的請求。

          在數據面中,我們對請求過濾器有兩種模式的抽象:請求過濾器和模型過濾器。請求過濾器作用于用戶的原始請求,這類過濾器往往被設計用于處理鑒權、限流等邏輯。而模型過濾器作用于請求被轉發至該模型時,常用于模型 API 的兼容邏輯。比如模型發展中目前對深度思考 <think> 的標簽處理,推理引擎自定義參數的兼容修正等。

          除此之外控制面也會提供 OpenAPI 供 AI 模型供給團隊上架模型,新增 API Key 等日常運營能力。模型提供方可以在上架模型時支持為模型配置相應的 RPM、TPM 上限,并根據模型的推理引擎選擇相應的兼容策略。也可以通過 OpenAPI 為單個 API Key 授權相應模型等功能。

          5、鑒權認證

          在鑒權機制中,采用目前主流 OpenAI SDK 兼容的 API Key 認證方案。

          Authorization: Bearer <YOUR_API_KEY>

          在 API Key 的認證基礎上還提供細粒度的權限控制功能,允許為每個 API Key 配置可訪問的模型范圍,以及對不同模型的設置不同的配額。

          另外支持靈活的 API Key 有效期配置,用戶可根據需求設置 API Key 的 過期時間 或 不過期。

          6、配額管理

          在配額管理體系里可以限制模型消費者的調用速率,在這里主要參考了 OpenAI 的配額策略: RPM(每分鐘請求數)和 TPM(每分鐘 Tokens 數)。

          在這里可以按照為每個用戶分配不同模型的 Token 配額,或指定單位時間的請求數限制,以確保 AI 服務的高效運行并防止超出預算。

          同時我們還支持月維度的 Token 配額,業務按自然月進行預算申請,超過預算時請求將被限制。對于接入 AI 能力而言,每個業務都需要提前申請預算額度,避免帶來難以負擔的成本。

          7、多模型訪問

          目前版本僅支持基于 OpenAI API 的協議轉發。以目前推理引擎發展和在線 AI 云服務而言,兼容 OpenAI API 協議已經成為業界共識,在此基礎上我們只需要實現根據用戶需求的模型名,擇優選擇一個相應模型的上游 API 提供商(公司自建 IDC或公有云),并替換成相應服務商的 API Key 和 Upstream 域名就可以進行負載均衡。

          對于公司 IDC 自建的模型服務而言,我們繼續沿用基于 discovery 等服務發現技術來發現推理引擎節點,直接將請求包裝調度至這些自建模型。

          8、模型負載均衡

          LLM API 的負載均衡和傳統實時 API 的模式有很大的不同。

          傳統 API 開發中:一次請求往往被設計成會極大概率地命中一塊結果緩存,且緩存 Key 的計算都比較簡單,因此很多負載均衡都簡單基于請求相應時間、連接數等等。

          在 LLM 推理場景下:每個推理請求都會帶來網關本身難以評估的計算時間和設備資源占用,此時基于 RPS、TTFB、連接數等負載均衡策略將不再適用。

          在 AI 網關的默認負載均衡策略中:我們主要基于單模型服務節點處理 Token 的吞吐和時延能力,在黑盒模式下評估節點的飽和度。除此之外,推理引擎自身和顯卡其實也暴露了許多和執行隊列相關的指標,綜合這些指標同樣預計能獲得比傳統負載均衡更有效的體驗。

          另外:基于 Prefix Cache 的節點選擇同樣會是一個相當有效的調度策略,但 Prefix Cache 的計算能力往往需要外部服務來進行,因此 AI 網關同樣支持接入外置的負載均衡算法,通過前置的 RPC 來讓外置服務選擇最合適的模型節點。

          9、多租戶隔離

          業務主要通過 域名 + API Key 進行訪問大模型推理,可以通過域名進行管理對接的接口路由,進行配置轉發到指定 Model Provider 服務。如果需要進行多業務隔離,只需要通過不同的域名訪問并配置不同的轉發目標。

          10、可觀測能力

          從業務視角,主要分為 Gateway、 Domain、Consumer、Provider、UserModel、UpstreamModel 維度,進行查詢和觀察請求接口的可用率,以及 QPS、Latency、5xx、Quota 等指標。

          11、支持的API協議

          11.1 概述

          在 AI 網關中,我們主要以 OpenAI 提供的 API 作為基礎協議,讓開發者基于 OpenAI SDK 實現各種業務場景對接。

          目前支持的 API 協議有:

          • 1)對話式模型交互(CHAT_COMPLETION);
          • 2)通用文本向量接口(EMBEDDING);
          • 3)提示詞模板(CHAT_TEMPLATE);
          • 4)模型上下文協議(MODEL_CONTEXT_PROTOCOL) 。

          業務可以根據自己不同的場景進行選擇對應的協議。

          11.2 對話式模型交互(CHAT_COMPLETION)

          對話式模型交互是最基礎的協議,用于構建具有復雜邏輯的對話交互。同時 API 支持上下文感知的對話,使得模型能夠理解和響應多輪交流,并在對話中保持合理的邏輯和語境一致性。

          對話接口是 LLM 與現實世界溝通的重要渠道,大量 AI 需求實際上就是在與模型進行一輪或多輪對話實現的。

          例如業務希望通過 LLM 排查線上故障的潛在原因,簡單來說就是將應用的各項可觀測指標、故障期間的日志記錄或應用上下游的變更記錄以對話形式告知 LLM,并讓 LLM 輸出一段便于程序理解的結果表達模式,讓 LLM 從模型數據中計算出符合直覺潛在故障原因。

          11.3 通用文本向量(EMBEDDING)

          通用文本向量(EMBEDDING)接口的核心功能是將文本轉化為高維向量,捕捉其語義特征。這在需要進行大規模信息檢索、匹配和知識管理的場景中尤為關鍵。

          11.4 提示詞模板(CHAT_TEMPLATE)

          提示詞模板是一種結構化的對話生成方式,允許業務通過設置預定義的模板來生成系統化的回復。這種方式將語言模型的生成能力與模板化結構相結合,使業務能夠以普通 API 的方式進行請求交互,并可以更集中化地控制生成內容的樣式和格式。

          同時我們也支持內嵌函數,以方便在提示詞模板進行處理內容:

          • 1)len(v any) string
          • 2)jsonify(v any) string
          • 3)make_json_object(v ...any) map[string]any
          • 4)slice_to_index_map(v any, startBy int) map[int]any

          以評論內容翻譯的場景:

          - path: /v1/reply-to-en

            protocol: HTTP

            timeout: 300s

            middlewares:

            - name: v1_chat_template

              options:

          '@type': type.googleapis.com/infra.gateway.middleware.llm.v1.contrib.ChatTemplateConfig

                provider: bilibili

                model_name: index

                prompt_template: |

                  你的任務:以下給定文本是一個B站視頻的相關文本信息,可能為標題、簡介、彈幕或評論,請你將給定的文本逐條翻譯成英文。輸入為一個json格式,key為序號,value為待翻譯的彈幕,一共有{{ len .reply_list }}個文本。示例如下:

                  輸入: {"1": "xxx", "2": "xxx"}

           

                  輸出: {"1": "xxx", "2": "xxx"}

           

                  注意,用{dyn:xxx}符號包裹的是圖片引用,不需要翻譯,直接保留。用[xxx]包裹的是表情符號,不需要翻譯,直接保留。現在請根據上述要求完成如下片段的翻譯,輸出一共{{ len .reply_list }}個翻譯后的結果,直接輸出翻譯后的英文,不要進行任何解釋。

           

                  輸入: {{ jsonify (slice_to_index_map .reply_list 1) }}

           

                  輸出:

          提示詞模版接口實際上是基于對話接口的一種高效對接模式。眾所周知,自 OpenAI 發布 ChatGPT 后,提示詞工程(Prompt Engineering)本身被當作一種技術路線而提出。提示詞工程主要關注提示詞開發與優化,幫助用戶將大語言模型用于各場景和研究領域。研究人員可利用提示工程來提升大語言模型處理復雜任務場景的能力,如問答和算術推理能力。

          對于接入 LLM 的業務研發而言,他可能本身不具備很強的提示詞工程能力;甚至提示詞的優化本身也取決于模型的迭代更新。因此對于解決特定領域的業務場景,AI 工程師往往會基于最優模型寫出最精準的提示詞,通過 AI 網關的提示詞模版接口發布。業務提交簡單 JSON KV 對后,渲染出最有效的完整提示詞,LLM 基于有效提示詞輸出最精確的結果。

          11.5 模型上下文協議(MODEL_CONTEXT_PROTOCOL)

          MCP (Model Context Protocol,模型上下文協議) 是由 Anthropic 在 2024 年底推出的一種開放協議,旨在讓大型語言模型(LLM)能夠以標準化的方式連接到外部數據源和工具。該協議抽象并標準化了 Resources、Prompts、Tools 等資源及其接入方式,允許 LLM Client 應用以一致的方式連接到各種數據源和工具,如文件、數據庫、API 等。

          配置轉發到注冊中心的 MCP 服務:

          - path: /example-mcp/*

            protocol: HTTP

            timeout: 300s

            middlewares:

            - name: v1_mcp_server

              options:

                '@type': type.googleapis.com/infra.gateway.middleware.llm.v1.contrib.MCPServerConfig

                proxy:

                  name: example-mcp

                  upstreams:

                  - url: 'discovery://infra.example.example-mcp'

          - path: /example-mcp/*

            protocol: HTTP

            timeout: 300s

            middlewares:

            - name: v1_mcp_server

              options:

                '@type': type.googleapis.com/infra.gateway.middleware.llm.v1.contrib.MCPServerConfig

                proxy:

                  name: example-mcp

                  upstreams:

                  - url: 'discovery://infra.example.example-mcp'

          12、MCP市場與API接入

          MCP 市場其實就是一個公司內部的資源共享和協作平臺。簡單來說,它可以看作是企業內的小型“App Store”,專門用來提供各種服務和資源的接入入口。可以讓業務通過這個平臺輕松獲取、整合、使用這些資源,使業務對接更加地簡單。

          用戶可以把自己的 MCP 服務快速發布到市場上,并且接入到 MCP Gateway 后即可使用。

          當前的 MCP 協議中主要有兩個端點:

          • 1)/sse:是一個 Events 長連接通知協議,用于實時通知資源信息的變更;
          • 2)/message:用于 JSONRPC 通信端點,能夠以 JSONRPC 方式進行通信交互。

          而我們在 MCP Gateway 中,我們在企業內部將通過統一的域名進行提供業務接入,并且進行管理每一個 MCP服務的接口,例如:https://mcp.example.com/logging-mcp

          同時在 MCP服務中,需要使用相同的根路徑 /logging-mcp,因為在 MCP 協議中,會先連接到 /sse 端點,再返回對應的 /message 端點信息,所以請求路徑需要保持跟網關一致。

          13、本文小結

          AI 網關通過統一接入、鑒權、配額管理 和 模型調度支持,為大模型提供了高效、安全、定制的連接能力。同時,支持了 OpenAI 協議、提示詞模板 和 MCP 市場等功能,進一步擴展了 AI 技術在企業中的應用場景,為業務接入和資源整合提供了極高的便利性。

          14、相關資料

          [1] Web端即時通訊技術盤點:短輪詢、Comet、Websocket、SSE

          [2] SSE技術詳解:一種全新的HTML5服務器推送事件技術

          [3] 網頁端IM通信技術快速入門:短輪詢、長輪詢、SSE、WebSocket

          [4] 搞懂現代Web端即時通訊技術一文就夠:WebSocket、socket.io、SSE

          [5] 全民AI時代,大模型客戶端和服務端的實時通信到底用什么協議?


          (本文已同步發布于:http://www.52im.net/thread-4831-1-1.html)

          posted @ 2025-05-22 14:08 Jack Jiang 閱讀(54) | 評論 (0)編輯 收藏

          本文來自QCon全球軟件開發大會王勁鵬的技術分享,下文進行了排版優化和修訂。

          1、引言

          性能和體驗在 iOS / Android 雙端場景下已經是一個較為成熟的話題,但隨著鴻蒙 OS 的發展,端側開發者需要更多的關注多端場景的差異性。

          本次分享的主題是小紅書在鴻蒙平臺上的工程實踐,主要聚焦于性能優化和探索。* PPT講稿原文下載:小紅書鴻蒙OS下的性能優化探索與實踐(PPT)[附件下載]》)

          先介紹一下自己的背景。之前一直從事大前端領域的工作,主要專注于跨端和容器化方案。也曾手寫過一個跨端框架,名為 Doric,它可以對標 React Native、Vue Native 和 Flutter 等。Doric 框架在落地時表現良好,還支持了一些自研的 3D 引擎方案。除此之外,我還有播放器內核研發經驗,以及大前端常規體系建設和 CI/CD 流水線的工程經驗。未來,我將持續關注大前端的演進,尤其是鴻蒙這樣的多端和跨端平臺。

          從 2023 年開始,鴻蒙的優勢愈發明顯,已經成為可與 iOS、安卓媲美的第三大移動操作系統。從一些抖音視頻中也可以看出,鴻蒙在流暢性方面甚至在某些層面上超過了 iOS。

          今天的分享內容分為四個部分:

          • 1)介紹整個歷程和背景;
          • 2)介紹鴻蒙 OS 的相關能力和小紅書在該平臺上的優化實踐;
          • 3)通過鴻蒙 OS 提供的性能驗證工具,展示小紅書在鴻蒙平臺上的性能優化驗證方法、優化后的性能提升以及具體的收益和結果;
          • 4)總結和展望。
           
           

          2、內容分享和整理

          分享者:王勁鵬,內容審校和編輯:Kitty。

           王勁鵬:小紅書鴻蒙工程師。目前主要負責小紅書鴻蒙版的研發和工程建設,曾從事過大前端架構設計、研發效能等方向的工作,在終端架構演進、性能優化以及跨端容器和動態化等方面具備長期實踐及深厚經驗,持續關注大前端技術體系,鴻蒙以及多端的演進。

          3、版本歷程和開發背景

          3.1 小紅書迭代歷程

          從 2023 年年中開始,鴻蒙的“千帆計劃”正式啟動,并很快升級為“鴻飛計劃”。小紅書作為 7 家頭部合作商之一,率先支持了鴻蒙,并于 2023 年 11 月中旬上線了一個基礎版的 beta 版本 APP。這個版本主要包含筆記瀏覽和視頻筆記瀏覽兩大功能,以及一些簡單的個人設置。當時,小紅書的動作非常迅速,可以說是頭部應用廠商中對華為支持最為積極的品牌之一。

          在整個鴻飛計劃中,我們規劃了三個核心里程碑:除了 2023 年 11 月的 beta 版本外,還包括 2024 年 6 月的 HDC 版本和 2024 年 9 月的商用版本。HDC 版本主要是針對華為正式宣發鴻蒙 3(HarmonyOS Next)開發者測試的情況。在 HDC 版本中,我們上線了許多小紅書特有的存量功能,包括視頻拍攝、圖文拍攝以及多設備協同等創新特性。而到了 2024 年 9 月的商用版本交付時,小紅書的核心功能已經基本與主端對齊。考慮到鴻蒙的開發周期僅有一年,小紅書的鴻蒙 APP 在這一年中要對齊開發了十年甚至十幾年的安卓和 iOS 版本,難度和壓力都非常巨大。

          到 2024 年 9 月,除了對齊雙端的所有功能外,我們還開發了許多其他功能,包括華為支持的創新特性,例如智能拖拽——用戶可以將圖片拖拽到中轉站或小藝等場景。此外,商用版本還支持了用戶呼聲較高的 HDR 或 Moonlight Photo 拍攝能力。

          3.2 純血鴻蒙與安卓的區別

          我從幾個維度來對比一下純血鴻蒙和安卓 OS 的主要區別。

          內核架構純血鴻蒙的本質是微內核,而安卓是基于 Linux 宏內核。微內核只提供基礎的內存和文件管理能力,驅動和其他系統能力都在 OS 之外。這樣做的好處是系統穩定性極高,即使應用崩潰,也不會導致整個系統崩潰(system crash)。而在 Linux 宏內核中,應用的不當行為可能會直接導致系統崩潰。

          多設備適配鴻蒙目前支持多種設備類型:包括 Mate 60 Pro 這樣的直板手機、Mate X5 或非凡大師 XT 這樣的雙折疊和三折疊手機、平板電腦、車機,甚至華為正在研發的鴻蒙 PC。鴻蒙真正實現了類似 iOS 的多端整合能力,通過一套代碼實現多端部署。其工程體系和架構支持單 HAP(Harmony Ability Package)多 HSP(Harmony Service Package)模塊,指令集適配了 ARM64 等多種架構,開發者只需根據設備尺寸適配 UI 展示即可。例如,在 2024 年 9 月 的華為全場景設備發布會上,余承東展示了小紅書在從直板機到雙折疊、三折疊設備上的適配能力,完全實現了響應式編程,不同設備形態下有不同的瀏覽體驗。

          開發工具和編程模型鴻蒙的開發工具和編程模型與安卓差異較大。鴻蒙更類似于 Flutter 的嵌套型容器布局,而不是安卓那種面向對象的開發方式。在語言層面,鴻蒙完全封裝了底層邏輯,采用類似前端 Flux 單向數據流模式,通過數據變更驅動 UI 刷新。這種模式類似于前端 Redux 或 MobX 框架中的 state 管理 。

          從 2024 年 10 月 8 日公測開始,鴻蒙的應用生態正在逐漸繁榮。不過,目前像微信這樣的應用還處于搶先體驗階段。相比之下,安卓的生態已經相對成熟。鴻蒙的最終目標是打造全場景智能設備生態,涵蓋所有終端設備,以及基于 OpenHarmony 內核開發的物聯網終端。它還支持多種芯片體系,例如瑞芯微 RK3568 等。

          3.3 小紅書鴻蒙應用架構層級

          小紅書經過一年的迭代,其整體應用架構已經基本成熟。目前,整體代碼量接近 200 萬行,達到了一個較高的復雜度。在一般成熟的 APP 架構中,通常會包含一些基礎底層能力,例如網絡、磁盤存儲、埋點體系、APM(應用性能管理)系統,以及一些通用組件和能力。對于鴻蒙平臺,小紅書還具備一些特殊的公共通用能力。

          我們開發了一個“一多框架”,這是一個支持一套代碼多端部署的具體框架體系。通過這個框架,我們實現了多設備的斷點控制功能。用戶可以根據設備的尺寸和類型進行適配,因為華為設備支持多端投屏。例如,用戶可以在手機上瀏覽小紅書,然后將內容投屏到車機上。比如用戶購買了一輛問界汽車,可以在車內通過車機繼續瀏覽手機上的小紅書內容,這種場景在駕駛時尤其有用。

          除了底層框架,對于上層業務,小紅書還有一套自研的組件庫方案,這套組件庫承載了上層業務的多種功能,包括圖文筆記、視頻筆記瀏覽,以及一些 Hybrid 容器能力。小紅書本質上在跨端開發中仍然使用了 React Native(RN)和類 Web 技術。RN 引擎由華為內部合作提供,采用了自研的 ohos 方案,用于解決 React Native 的 bundle 和 JS 加載以及渲染問題。此外,還包括產品定制層,這里涵蓋了所有相關的設備適配內容。

           3.4 性能優化與實踐

          目前,安卓和 iOS 在性能優化方面已經相當成熟,包括如何分析性能熱點問題、有哪些工具以及最佳實踐等。然而,對于鴻蒙來說,它是一個全新的系統。直到 2024 年年中,鴻蒙的穩定性和流暢性都還存在一些問題。這里重點講述小紅書在 2024 年與華為一起進行了哪些實踐,以提升應用的性能和用戶體驗。

          我們定義了一個性能指標場景。這個指標體系是小紅書與華為共同探討的結果,因為華為有一個性能工廠,它對每個應用的評級都有一個 S 標標準。小紅書與華為一起確定了針對小紅書場景需要觀測的具體指標。性能優化的核心是慢函數指標,它主要包含兩部分:過程時長和應用體驗的流暢性。

          過程時長主要包含以下三點:

          • 1)冷啟動時長:這是用戶最關心的指標之一,即從點擊應用圖標到應用完成動畫并展示第一幀的時間。對于多數應用,首頁通常有緩存機制。例如,小紅書會緩存用戶上次刷新的筆記,淘寶會緩存用戶上次瀏覽的商品內容;
          • 2)場景完成時長:指完成某個特定場景所需的時間;
          • 3)應用響應時長:指用戶操作界面后,界面真正發生變化的時間,即響應時延。

          流暢性方面,最基礎的觀測指標是平均 FPS(幀率),包括丟幀數、最大連續丟幀數、丟幀卡頓次數以及卡頓率。卡頓率可以通過量化計算得出:當一個場景中出現丟幀時,丟幀的時長與場景總時長的比值即為卡頓率,它是一個小于 1 的百分比數值。

          3.5 OS 能力 & 優化實踐

          首先,針對 IO 場景,我們進行了相應的優化。

          鴻蒙 OS 的系統能力主要分為以下三個方面:

          • 1)并行化能力鴻蒙 OS 提供了兩種并行化能力:Worker 和 TaskPool。Worker 類似于傳統的線程模型,每個 Worker 都有自己的內存空間和執行單元,支持通過消息(message)進行通信。TaskPool 則類似于協程或線程池,能夠動態管理線程數量,支持標記為 @concurrent 的函數直接在任務池中調度和運行。這兩種機制都支持線程間隔離,內存不共享;
          • 2)多線程通信和數據傳輸在多線程通信方面,鴻蒙 OS 支持序列化數據傳輸和基于消息(message)的通信機制。此外,還引入了事件發射器(Emitter)用于系統事件的發布和訂閱。這種機制允許線程間通過消息傳遞來實現復雜的交互邏輯;
          • 3)同步轉異步機制鴻蒙 OS 支持基于 Promise 的異步編程模型,包括 async 和 await 語法,以及 then 和 catch 方法。這種機制能夠有效提升應用的響應性和用戶體驗。

          4、并行化能力

          在并行化能力方面,鴻蒙 OS 提供了兩套基礎實現方式。開發者可以通過 RTS(運行時系統)實現并行化,也可以通過底層庫(如 C++ 標準庫中的)實現。不過,如果完全依賴底層庫,可能會導致開發效率下降。為了滿足業務需求,鴻蒙 OS 在年初引入了 Worker 和 TaskPool 能力。Worker 類似于傳統的線程模型,每個 Worker 都有獨立的內存空間和執行單元,支持通過消息進行通信。消息可以包含可序列化的數據,也可以通過指針直接遷移數據。TaskPool 則類似于線程池,能夠動態管理線程數量,支持標記為 @concurrent 的函數直接在任務池中調度和運行。與安卓平臺的線程池不同,鴻蒙 OS 的 TaskPool 會根據硬件條件和任務負載動態調整線程數量。這種機制避免了安卓平臺中因線程池數量過多而導致的系統資源消耗問題。

          接下來我們對比鴻蒙 OS 的 Worker 并行化能力和安卓端的相關特性。從多個維度來看,Worker 本質上不推薦手動創建,而是通過系統配置 build-provider.json 綁定 ETS 文件來實現創建。這一點與安卓端并無明顯差異,安卓端可以通過 THREAD 等方式啟動線程。

          在鴻蒙 OS 5.0 以下版本(如 4.2 版本)中,主要運行的仍然是安卓系統。這種情況下,安卓線程數量存在上限,這對應用開發者來說是一個挑戰。如果 SDK 集成過多,線程數可能超標,進而導致應用被系統強制終止,或出現業務場景異常崩潰等穩定性問題。

          數據傳輸方面:鴻蒙 OS 為了優化 Worker 的性能和負載,對 Worker 的數量和單個 Worker 的傳輸上限進行了限制。鴻蒙 Worker 的單個傳輸上限類似于安卓中的 Binder 機制,也存在類似的傳輸限制。不過,安卓線程通常沒有嚴格限制,因為線程本質上是一個內存拷貝過程,除非開發者通過指針等方式自定義線程間數據傳輸。

          在傳輸格式上:鴻蒙 OS 支持通過 Sendable 接口進行數據傳輸。Sendable 是一種注解方式定義的數據結構,具有傳染性,即如果一個類被標記為 Sendable,其關聯屬性也必須是 Sendable 類型。鴻蒙 OS 支持基礎數據類型(如 number、string)和集合類型作為 Sendable 傳輸的內容。對于跨模塊調用,鴻蒙 OS 不允許 Worker 跨 HAP 或跨 HSP 調用。相比之下,安卓應用通常運行在一個或多個 Dex 文件中,允許跨 Dex 或跨模塊的線程間調用。

          TaskPool 類似于雙端的協程概念,是一種輕量級線程,僅存儲函數。不過,TaskPool 與協程有所不同,它獨立于任務維度,且任務執行時長有限制(超過 3 分鐘會被系統自動回收)。安卓平臺可以通過 ASM 插樁技術對線程的創建和執行進行監控和優化,但輕量級線程或協程的實現通常依賴于線程池或協程機制。

          TaskPool 中的任務默認支持數據轉移(transfer),不支持拷貝。此外,TaskGroup 不支持 SDK 初始化包的加載。某些同學習慣在異步線程中觸發 SDK 的行為,在鴻蒙 OS 上可能會因 TaskPool 生命周期結束而導致變量被釋放。

          關于并行化數據傳輸的 Sendable 概念:Sendable 通過系統提供的 SharedHeap(共享堆)實現傳輸。共享堆與本地堆(local Heap)的區別在于,共享堆支持 Sendable 化數據的傳輸,而本地堆則需要序列化。共享堆的管理和控制耗費了華為專家大量時間和精力,其中還涉及復雜的異步鎖(async lock)機制。在 RTS 并發實例期間(包括 Worker、TaskPool 等),數據可以通過 Sendable 傳遞,但 Worker 需要使用單獨的 API。TaskPool 則完全支持 Sendable 的直接傳輸。這種異步鎖機制允許在 TaskPool 或 Worker 中鎖定其他任務中的某些函數,實現線程間的同步,類似于安卓中的 synchronized 或其他鎖機制。

          5、小紅書典型并行化場景

          小紅書在一些典型化場景中已經實現了并行化處理。例如,網絡請求是一個典型的耗時操作,因為請求過程中涉及驗簽和安全能力的處理,這些操作如果在主線程中同步完成,可能會導致應用掉幀。當用戶滑動時,掉幀現象會非常明顯,這通常是由于大量計算引起的。為了解決這一問題,我們采用了 Worker 化的方式,將這些操作移到 Worker 線程中,從而避免主線程的卡頓。

          在進行埋點時,可能會涉及數據庫的 IO 操作,這些操作也不建議在主線程中執行。通過將這些操作放到 Worker 線程中,可以有效避免對主線程的影響。

          針對雙列布局中的圖片和資源預加載,我們采用華為自研的 RCP 網絡解決方案(類似于 HTTP),通過 Worker 線程在遠端進行下載,并在完成后將結果返回到主線程。此外,TaskPool 的應用場景也非常廣泛,例如文件上傳、多媒體操作以及啟動任務的編排等。TaskPool 的優勢在于輕量化,避免了線程上下文切換帶來的不必要耗時。

          關于冷啟動和首刷場景的優化。這部分主要包括兩個方面:模塊的懶加載和動態組件的復用池。懶加載是應用開發中常見的優化手段,類似于安卓端的 class order 機制。當應用不需要某個類時,可以延遲加載該類,直到真正需要使用時才加載。這種方式可以顯著提高冷啟動階段的代碼加載效率,從而大幅降低冷啟動時長。

          動態組件和組件復用池則是為了解決 UI 組件重復創建的問題。在應用中,可能會有多種相同類型的 UI 組件(例如小紅書中的筆記組件)。為了避免重復創建帶來的開銷,我們希望在運行時盡量復用已有的組件,而不是頻繁地創建和銷毀。

          6、類前端視角下的模塊懶加載

          我們通過特定的分析工具對懶加載進行了深入分析。如圖所示,我們能夠識別出啟動過程中加載的各種模塊,包括 RNOH(React Native on Harmony)、Web engine(網頁引擎)、Red Player(播放器)等組件。這些模塊的加載過程涉及到多個.so 文件,即共享對象文件。

           通過自上而下的分析方法,我們可以清晰地看到每個模塊加載的具體耗時。進一步分析這些.so 文件與 RTS(運行時系統)的關聯,以及它們所引入的 Napi 的 TS 文件。我們進行了懶加載潛在對象的分析,發現許多 RTS 實際上并不需要的類文件已經被加載。這是因為開發者在編寫代碼時,可能并未充分考慮到導入一個類或方法對應用啟動延遲的影響。

          為了優化這一過程,我們的目標是減少字節碼中需要加載的類文件數量,從而加快應用的冷啟動速度。華為提供的編譯器能夠將 RTS 編譯成 Ark bytecode(方舟字節碼),這是一種高效的字節碼格式。通過減少需要加載的類文件數量,我們可以顯著提高應用的啟動速度。

          華為還提供了一種懶加載的導入方式,只有在真正需要使用某個類時,它才會被加載。這種懶加載機制有助于減少應用啟動時的資源消耗。這引發了一個問題:為什么華為不默認采用全懶加載方式,即只有在使用時才加載類文件呢?我已經將這個問題反饋給華為,并且系統側可能會考慮在未來的版本中默認采用懶加載方式,同時仍然允許用戶手動選擇非懶加載的方式進行類文件的加載。

          7、動態組件

          在小紅書的首頁場景中,筆記卡組件在多個場景中被復用。為了避免重復創建 UI 導致的性能消耗,我們采用了動態組件的概念。動態組件的核心原理是利用占位符來延遲組件的創建,這與 Android 開發中使用 Stub 模式的概念相似。在這種模式下,可以使用一個代理對象(stub)來代表尚未初始化的組件,從而延遲組件的創建過程。當真正需要渲染組件時,再將渲染內容填充進去,從而避免每次調用構建函數(如 build)時的耗時。

          占位邏輯通過系統的 API 實現,涉及到 NodeContainer 和 NodeController 的綁定關系。Container 和 Controller 一一映射,由 NodeCore 進行管理。Container 僅管理當前展現的內存部分,使用完畢后需要將其放回池中進行回收和再利用。以冷啟動首刷為例,在啟動階段可以先獲取磁盤上的筆記內容,然后在 BuilderNode 中預先創建多個 Image 組件。這樣,在等待網絡或推薦接口響應時,Image 組件已經創建完畢,從而在首頁刷新時可以立即使用這些組件,這對于提高首刷非常有益。

           對于組件復用池,當動態組件不再使用時,需要將其返回到組件池中。對于自定義組件,通過 NoteContainer 占位方式,由 NodeController 進行管理。在需要創建子組件時,先在 NodePool 中查找,如果找不到,則創建新組件;如果找到,則嘗試復用。流程圖展示了從 Container 裝載 NodeItem 開始,通過 NodePool 查找,如果找到則進行條件判斷和復用。

          組件的新建和復用過程中,如果找到對應的 NodeItem,則調用 build 方法并更新自定義組件的狀態,完成復用。如果有對應的 NodeItem,可以直接通過 update 函數更新內部狀態并刷新 UI。但要注意,update 方法可能會因狀態變量過于復雜而導致更新延遲,出現圖像殘影。因此,需要拆分 state,使其足夠小,以確保狀態變更到通知 UI 的時間縮短,消除殘影。

          我們的策略是優先在 NodePool(節點池)中查找可用的 NodeItem(節點項)。如果 NodePool 中存在可用的 NodeItem,我們就直接使用它,并通過 getNode 方法進行 item 綁定,隨后更新其狀態以實現復用。如果 NodePool 中沒有找到對應的 NodeItem,那么我們將通過 makeNode 方法調用 build 函數來創建新的節點項。

          完成組件的復用后,我們需要將這些組件返回到緩存池中,以便在未來可以再次使用。這個過程涉及到 NodeContainer(節點容器)和 NodeController(節點控制器)的銷毀,并將 NodeItem 重新放回 NodePool 中。為了更有效地管理緩存,業務層可以利用 LRU(最近最少使用)算法,或者鴻蒙系統提供的 LRUCache 和 LiUHashMap 等數據結構,來自定義緩存的大小,從而優化組件的復用和緩存策略。

          8、滑動類場景

          在小紅書應用中,滑動類場景非常普遍,包括推薦頁的子頻道、個人頁中的收藏點贊以及用戶自己發布的筆記,還有搜索結果頁中的搜索結果和用戶商品等,這些都是雙列滑動場景。這些雙列滑動場景占據了小紅書用戶體驗的 90% 到 95%,因此,滑動體驗的流暢性對于用戶的整體體驗至關重要。

          為了提升滑動場景的流暢性,小紅書采用了 RCP 框架來優化網絡資源的獲取。RCP 是華為提供的一個系統組件能力,主要解決網絡資源獲取效率問題。通過 RCP,開發者可以在需要時發起網絡請求,并自定義資源的寫入地址,如文件或 ArrayBuffer。RCP 負責高效地將資源寫入指定位置,而在不需要時,可以取消 RCP 請求,從而優化資源管理。

           RCP 的核心能力在于能夠取消請求,并對弱網場景進行了優化,其建聯過程優于 HTTP 1.1 或 2.0。基于 RCP,小紅書還應用了華為俄研所提供的 Prefetch 方案。Prefetch 方案在瀑布流組件的可見區變更時,通過 worker 線程(如 prefetched worker)啟動資源獲取,當不可見時關閉,從而優化快速滑動場景,減少不必要的帶寬消耗。

          在快速滑動過程中,有些 item 可能短暫消失,對于雙端場景,網絡請求可能已經發出且在途,無法取消,導致帶寬浪費。Prefetch 和 RCP 結合的方式可以優化這種快滑場景,防止真正想要看的內容出現白塊。Prefetched worker 線程管理多個 RCP 請求,每個請求都有完整的生命周期。當通過 RCP 請求獲取到所需資源時,會通知主線程,主線程根據地址加載資源到 Image 組件或占位符 RQI 組件中。

          在小紅書的開發過程中,我們遇到了一些性能熱點問題,這些問題大多是通過 Code Linter(代碼檢查工具)檢測出來的。由于開發節奏快,開發者在編寫代碼時可能難以關注到性能問題,因此需要 CI(持續集成)檢查工具來輔助檢查。

          常見的性能熱點包括:

          1)在列表場景中頻繁使用的 LadyForEach 組件,需要指定 key 以實現列表復用。如果開發者忘記指定 key,Code Linter 會報錯提示;

          2)在 onClick 或 onVisible 等函數中編寫空 callback(回調函數)。當這些空 callback 積累到一定數量(如幾百個或上千個)時,可能會嚴重拖慢應用性能。Code Linter 可以掃描出這類問題;

          3)未使用 TaskPool 處理網絡資源。例如,Image Bitmap 直接傳遞 URL 進行同步加載,當網絡阻塞時會導致 UI 線程卡頓;

          4)復雜的 ETS 組件在列表場景下未實現重用。未設置重用的 ETS 組件在列表滾動時需要重新構建,非常耗時。組件嵌套層級過深也會導致性能問題。在安卓端,布局檢查器建議容器嵌套不超過四層;

          5)使用 JSON.stringify 進行對象序列化。JSON.stringify 有一定耗時,尤其在處理 100KB 左右的數據時,可能需要 10 毫秒左右。Code Linter 會提示這部分性能問題,但是否需要轉異步線程需要開發者自行判斷;

          6)調用 Image 的 syncLoad(同步加載)。在某些場景下,如轉場動畫,需要同步加載 image 以保證連貫性。但如果 image 是非磁盤資源(如網絡資源),會導致卡幀。Code Linter 可以掃描出這類問題;

          7)關于編譯器的優化。ETS 組件應避免嵌套過深。如果嵌套過深,可以將每層函數通過系統的 builder param 或 builder 函數轉換。使用 @builder 注解標識的函數會在編譯期間與 ETS 代碼整合,從而提高編譯器優化效果。

          Code Linter 支持全量掃描和基于 Git DIFF 的增量掃描,但目前華為的 Code Linter 還不能與 Git Prehook 關聯,導致無法在流水線上自動檢查。雖然 CI 檢查階段已有 Code Linter,但本地代碼提交階段仍需手動運行腳本,無法實現自動檢查。我們正在催促華為解決這一問題。

           

          9、UI 重載場景分幀方案

          在處理 UI 重載場景時,我們采用了一種稱為分幀方案的方法。分幀這個術語的含義是,當應用在一幀內無法完成所有繪制工作,或者在多幀內都無法完成時,會導致屏幕卡頓現象。盡管用戶可以看到畫面,但卻無法進行滑動或操作。在這種情況下,分幀方案就顯得尤為合適。雖然分幀方案可能看起來不是最優雅的解決辦法,但它確實能夠有效地解決性能問題,使應用性能達到預期標準。分幀方案雖然看似是一種應急措施,但它能夠幫助應用性能達標。

          分幀方案的流程大致如下:假設我們有數據 a、b、c 需要渲染,未采用分幀方案前,數據 a、b、c 會同時到達并觸發狀態變更,進而驅動整個 UI 進行刷新。這會導致在一幀內需要繪制大量 UI 組件,從而影響應用性能。為了解決這個問題,我們采用分幀方案,將數據 a、b、c 拆分開,分別在不同的幀中進行渲染。例如,數據 a 在第一幀中渲染完成后,通過調用宏觀指令讓其進入下一階段,然后在下一幀中更新數據 b,依此類推。

           

          在小紅書的圖文筆記場景中,分幀方案得到了應用。當用戶在首頁的雙列場景中點擊一篇筆記進入筆記詳情頁時,這個過程涉及到許多組件的加載。我們可以將這些組件拆分成不同的幀,例如幀 a、幀 b 和幀 c。對于用戶而言,他們通常希望在第一時間看到整個大屏的畫面,因此我們會優先在幀 a 中展示大圖。而在幀 b 和幀 c 中,我們再處理頂部導航欄或底部交互區等內容。通過這種分幀策略,我們能夠確保用戶在第一時間看到最關鍵的內容,同時避免了因為一次性加載過多組件而導致的性能問題。

          10、鴻蒙NEXT調優工具

          傳統的主觀工具對于鴻蒙 OS 的性能分析仍然適用。例如,抖音和小紅書都通過競品分析來進行主觀測評。這種能力主要是通過錄屏來展示整個流程的耗時和時長,特別適合評估冷啟動完成時延和轉場過程的性能。通過錄屏,我們可以逐幀查看用戶從點擊開始到結束的幀數和真實時長,以此來衡量整個過程的持續時間。

          10.1 鴻蒙性能分析工具:IDE Profiler

          除了主觀工具,我們還可以使用 IDE 提供的性能分析工具,如 Profiler,來分析慢函數。由于 ArkTS 編程語言框架主要通過 RTS 和 NAPI(原生應用接口)進行關聯,因此需要能夠查看 ArkTS 和 NAPI 的整個堆棧層級。這與安卓有所不同,因為當 Java 通過 Java Native API 與原生代碼交互時,堆棧并不那么容易查看。

          在小紅書的性能分析中,我們展示了一個整體線程分析的例子。在左側,可以看到小紅書的主線程(如 com 點開頭的線程)、Daemon 線程、Worker 線程以及 FFRT 線程。FFRT 是一種運行函數流的線程,可以執行 TaskPool 上的函數。在下圖右側,我們可以看到在 RTS 環境下的分析結果,其中頂部顯示了 NAPI 調用,底部則是一些 C++ 函數。整個調用棧和它們的執行時長是通過一種自上而下的視圖來展示的。利用這種視圖,我們可以精確地識別出哪些慢函數是造成界面卡頓的原因。

          10.2 性能場景測試工具:DevEco Testing

          DevEco Testing 是一個性能測試工具,它的功能非常全面,性能測試只是其中的一部分。除了性能測試,它還支持多種測試場景,包括 debug testing。在 debug testing 場景中,用戶可以自定義業務場景,監測 CPU 的耗時和負載、GPU 的耗時和負載、設備發熱情況以及功耗等問題。

          使用 DevEco Testing 進行性能測試的過程如下:首先定義測試場景,然后捕獲主幀數據。一旦開始捕獲,就可以觀測到 FPS(幀率)、GPU 負載以及整體功耗等數據。完成性能數據捕獲后,工具會生成一份報告,為用戶提供了一個完整的場景分析。不過,目前場景定義還缺乏腳本化能力,需要人工操作輔助。未來,我們期望能夠實現場景定義的腳本化配置,類似于自動化測試。這樣,就可以通過自動化工具,實現更高效的測試流程。

          11、小結與展望

          在對性能場景進行優化后,我們可以看到顯著的收益。在實驗室環境下的測試顯示,冷啟動時間可以降低 50%,響應時延可以低于 100 毫秒,完成時延則保持與雙端持平或更優。在流暢性方面,在多場景和重載場景下均實現了 0 丟幀的成果。需要注意的是,這里的測試是在非重載模式下進行的,即沒有同時運行多個資源密集型應用,如《王者榮耀》或《和平精英》等。在這種條件下,我們的核心場景,如冷啟動、搜索和個人頁等,都能夠與雙端完全對齊。

          展望未來,有幾個方向:

          1)首先:我們希望能夠在全場景下實現組件復用,以最大程度地實現 UI 復用。這樣可以在多個業務之間的轉場或 UI 創建過程中,將不必要的 UI 創建和消耗降到最低。

          2)其次:我們正在考慮代碼延遲加載的 lazy 機制。華為內部可能將其作為通用的解決方案,但在實施過程中我們發現了許多問題,例如全 lazy 加載可能會影響第三方 SDK,如支付寶等,因為它們可能進行了額外的二進制優化,導致加載失敗或無法響應。因此,我們期望通過代碼延遲加載來實現持續治理,但目前它可能還不適合全場景的 lazy import。

          3)最后:我們關注防劣化問題,即在每個版本發布時,我們不希望性能指標出現劣化。我們希望能夠在開發階段就定義劣化指標和具體數據,以防止應用劣化。這部分可能需要借助 DevEco Testing 和主觀測評的方式來實現。包括我們關注的指標,例如冷啟動和流暢性等,未來可能會納入防劣化場景。目前,我們的 CI 環節或 RC 環節,包括流水線的性能管控和代碼 CR 機制,都能夠規避這類問題。

          12、相關資料

          [1] 鴻蒙NEXT官方開發指南

          [2] 一年擼完百萬行代碼,企業微信的全新鴻蒙NEXT客戶端架構演進之路

          [3] 鴻蒙NEXT如何保證應用安全:詳解鴻蒙NEXT數字簽名和證書機制

          [4] 開源IM聊天程序HarmonyChat:基于鴻蒙NEXT的WebSocket協議

          [5] 微信純血鴻蒙版正式發布,295天走完微信14年技術之路!

          [6] 即時通訊框架MobileIMSDK的鴻蒙NEXT端詳細介紹

          [7] 即時通訊框架MobileIMSDK的鴻蒙NEXT端開發者手冊

          [8] 擁抱國產化:轉轉APP的鴻蒙NEXT端開發嘗鮮之旅

          [9] 微信Windows端IM消息數據庫的優化實踐:查詢慢、體積大、文件損壞等

          [10] 微信技術分享:揭秘微信后臺安全特征數據倉庫的架構設計

          [11] IM跨平臺技術學習(九):全面解密新QQ桌面版的Electron內存優化實踐

          [12] 企業微信針對百萬級組織架構的客戶端性能優化實踐

          [13] 揭秘企業微信是如何支持超大規模IM組織架構的——技術解讀四維關系鏈

          [14] 微信團隊分享:詳解iOS版微信視頻號直播中因幀率異常導致的功耗問題

          [15] 微信團隊分享:微信后端海量數據查詢從1000ms降到100ms的技術實踐

          [16] 大型IM工程重構實踐:企業微信Android端的重構之路

          [17] IM技術干貨:假如你來設計微信的群聊,你該怎么設計?

          [18] 微信團隊分享:來看看微信十年前的IM消息收發架構,你做到了嗎

          [19] 總是被低估,從未被超越,揭秘QQ極致絲滑背后的硬核IM技術優化

          [20] 首次公開,最新手機QQ客戶端架構的技術演進實踐

          [21] 大型IM穩定性監測實踐:手Q客戶端性能防劣化系統的建設之路


          (本文已同步發布于:http://www.52im.net/thread-4821-1-1.html)

          posted @ 2025-05-19 11:24 Jack Jiang 閱讀(70) | 評論 (0)編輯 收藏

               摘要: 全平臺開源即時通訊IM聊天框架MobileIMSDK的服務端開發指南,支持鴻蒙NEXT  閱讀全文

          posted @ 2025-05-15 12:27 Jack Jiang 閱讀(57) | 評論 (0)編輯 收藏

          一、基本介紹

          MobileIMSDK是一套全平臺原創開源IM通信層框架:

          • 超輕量級、高度提煉,lib包50KB以內;
          • 精心封裝,一套API同時支持UDP、TCP、WebSocket三種協議(可能是全網唯一開源的);
          • 客戶端支持iOS、Android、標準Java、H5、微信小程序、Uniap、鴻蒙Next(Demo完整源碼);
          • 服務端基于Netty,性能卓越、易于擴展 new;
          • 可與姊妹工程 MobileIMSDK-Web 無縫互通實現網頁端聊天或推送等;
          • 可應用于跨設備、跨網絡的聊天APP、企業OA、消息推送等各種場景。

          二、源碼倉庫同步更新

          GitHub.com:

          碼云gitee:

          三、設計目標

          讓開發者專注于應用邏輯的開發,底層復雜的即時通訊算法交由SDK開發人員,從而解偶即時通訊應用開發的復雜性。

          四、框架組成

          整套MobileIMSDK框架由以下7部分組成:

          1. Android客戶端SDK:用于開發Android版即時通訊客戶端,支持Android 4.0及以上版本,查看API文檔
          2. iOS客戶端SDK:用于開發iOS版即時通訊客戶端,支持iOS 12.0及以上版本,查看API文檔
          3. Java客戶端SDK:用于開發跨平臺的PC端即時通訊客戶端,支持標準Java 1.6及以上版本,查看API文檔
          4. H5客戶端SDK:查看精編注釋版
          5. 微信小程序端SDK:查看精編注釋版
          6. Uniapp端SDK:查看精編注釋版
          7. 鴻蒙Next端SDK:SDK暫無開源版(查看精編注釋版),Demo完整工程源碼
          8. 服務端SDK:用于開發即時通訊服務端,支持Java 1.7及以上版本,查看API文檔

          整套MobileIMSDK框架的架構組成:

          MobileIMSDK一直在持續開發和升級中,鴻蒙Next客戶端是MobileIMSDK工程的最新成果。

          五、技術特征

          • 久經考驗:歷經10年,從Andriod 2.3、iOS 5.0 時代持續升級至今(絕不爛尾);
          • 超輕量級:高度提煉,lib包50KB以內;
          • 多種協議:可能是全網唯一開源可同時支持UDP、TCP、WebSocket三種協議的同類框架;
          • 多種網絡:精心優化的TCP、UDP、WebSocket協議實現,可應用于衛星網、移動網、嵌入式物聯網等場景;
          • 多端覆蓋:客戶端支持iOS、Android、標準Java、H5微信小程序Uniapp鴻蒙Next
          • 高效費比:獨有的UDP協議實現,無連接特性,同等條件下可實現更高的網絡負載和吞吐能力;
          • 消息走向:支持即時通訊技術中消息的所有可能走向,共3種(即C2C、C2S、S2C);
          • 粘包半包:優雅解決各端的TCP經典粘包和半包問題,底層封裝,應用層完全無感知;
          • QoS機制:完善的消息送達保證機制(自動重傳、消息去重、狀態反饋等),不漏過每一條消息;
          • 健壯可靠:實踐表明,非常適于在高延遲、跨洲際、不同網絡制式環境中穩定、可靠地運行;
          • 斷網恢復:擁有網絡狀況自動檢測、斷網自動治愈的能力;
          • 原創算法:核心算法和實現均為原創,保證了持續改進和提升的空間;
          • 多種模式:預設多種實時靈敏度模式,可根據不同場景控制即時性、流量和客戶端電量消耗;
          • 數據壓縮:自有協議實現,未來可自主定制數據壓縮,靈活控制客戶端的流量、服務端網絡吞吐;
          • 高度封裝:高度封裝的API接口,保證了調用的簡易性,也使得可應用于更多的應用場景;
          • Web支持:可與姊妹工程 MobileIMSDK-Web 無縫互通實現網頁端聊天或推送等;
          • 擴展性好:服務端基于Netty,繼承了Netty的優秀高可擴展性;
          • 性能優異:服務端繼承了Netty高性能、高吞吐特性,適用于高性能服務端場景。

          六、演示程序

          1. Android客戶端 Demo:點此安裝和使用
          2. iOS客戶端 Demo:點此安裝和使用
          3. Java客戶端 Demo:點此安裝和使用
          4. H5客戶端 Demo:點此查看介紹
          5. 微信小程序端 Demo:點此查看介紹
          6. Uniapp端 Demo:點此查看介紹
          7. 鴻蒙Next端 Demo:點此查看介紹 new;
          8. 服務端 Demo:點此安裝和使用

          七、應用案例

          RainbowChat是一款基于MobileIMSDK的產品級聊天APP,更多詳情:點擊下載體驗 或 查看運行截圖

          ① 基于MobileIMSDK的產品級聊天APP:

          ▶ 詳細介紹下載體驗 或 查看運行截圖

          ② MobileIMSDK在高網絡延遲下的案例:

          ▶ 某款基于MobileIMSDK的商業商品,曾運營于跨洲際的復雜網絡環境下,端到端通信延遲在洲際網絡繁忙時可高達600ms以上(與服務端的單向延遲約為300ms左右,而通常大家訪問國內主流門戶的延遲約為20~50ms),某段時期的非敏感運營數據 點此查看

          八、打包下載(all in one)

          說明:最新發布版打包內容中,已包含完整的demo源碼、sdk源碼、api文檔、編譯后的分發包等。

          九、典型應用場景

          場景1:聊天APP

          應用說明:可用于開發類似于微信、QQ等聊天工具。

          消息走向:需使用C2C、C2S、S2C全部類型。

          特別說明:MobileIMSDK并未定義聊天應用的應用層邏輯和協議,開發者可自行定義并實現之。

          場景2:消息推送

          應用說明:可用于需要向客戶端實時推送信息的各種類型APP。

          消息走向:僅需使用S2C 1種消息走向,屬MobileIMSDK的最簡單應用場景。

          場景3:企業OA

          應用說明:可用于實現企業OA的指令、公文、申請等各種消息實時推送,極大提升用戶體驗,并可延伸至移動設備。

          消息走向:僅需使用S2C 1種消息走向,屬MobileIMSDK的最簡單應用場景。

          場景4:企業OA的增強型

          應用說明:可用于實現企業OA中各種系統級、用戶級消息的實時互動,充分利用即時通訊技術提升傳統OA的價值。

          消息走向:可使用C2C、C2S、S2C全部類型,這與聊天APP在很多方面已無差別,但企業OA有自已的用戶關系管理模型和邏輯,較之全功能聊天APP要簡單的多。

          十、開發指南

          1. Android客戶端開發指南:點此查看
          2. iOS客戶端開發指南:點此查看
          3. Java客戶端開發指南:點此查看
          4. H5客戶端開發指南:點此查看
          5. 微信小程序端開發指南:點此查看
          6. Uniapp端開發指南:點此查看
          7. 鴻蒙Next端開發指南:點此查看
          8. Server端開發指南:點此查看

          附錄1:Demo截圖

          1、在鴻蒙Next端運行效果:

          >> 編譯和運行:查看鴻蒙Next端Demo完整源碼

          2、Android端、iOS端運行效果

          >> 安裝和使用:進入Android版Demo幫助頁進入iOS版Demo幫助頁

          3、H5端運行效果

          4、微信小程序端運行效果

          5、Uniapp端運行效果

          6、Windows 運行效果

          >> 安裝和使用:進入Java版Demo幫助頁

          7、Mac OS X 運行效果

          >> 安裝和使用:進入Java版Demo幫助頁

          8、MobileIMSDK-Web版客戶端Demo運行效果:

          8.1)MobileIMSDK-Web在手機端瀏覽器運行效果:(如何獲取MobileIMSDK-Web版:點此進入

          8.2)MobileIMSDK-Web在PC端瀏覽器運行效果:(如何獲取MobileIMSDK-Web版:點此進入

          附錄2:基于MobileIMSDK的全功能IM【案例】

          >> 關于RainbowChat的更多資料請見:RainbowChat前端APP功能截圖網頁 (* 推薦 - 真機實拍視頻:Andriod端iOS端)。

          附錄3:基于MobileIMSDK-Web的網頁端IM系統【案例】

          下圖為RainbowChat-Web的主界面更多截圖點此進入更多演示視頻點此進入):

          下圖為RainbowChat-Web的主界面[聊天窗全屏時] (更多截圖點此進入更多演示視頻點此進入):

          下圖為RainbowChat-Web的主界面[獨立UI效果] (更多截圖點此進入更多演示視頻點此進入):

          以上內容同步發布于:http://www.52im.net/thread-52-1-1.html )

          posted @ 2025-04-29 15:29 Jack Jiang 閱讀(75) | 評論 (0)編輯 收藏

          本文由轉轉技術團隊趙衛兵分享,原題“鴻蒙新篇章:轉轉 APP 的 HarmonyOS Next 開發之旅”,下文進行了排版優化和內容修訂。

          1、引言

          2023 年在華為開發者大會(HDC.Together)上,除了面向消費者的 HarmonyOS 4 之外,華為還推出了面向開發者的 HarmonyOS Next 開發者預覽。

          而在去年的 6 月份華為開發者大會上,對外開啟了 HarmonyOS Next Beta 版,并在當年內正式推出面向消費者的商用版本。

          HarmonyOS Next,是鴻蒙生態的一個重要拐點。去年的時候,轉轉和華為已經達成合作,作為鴻蒙先鋒的一員,加入到鴻蒙應用的開發之中來。

          客戶端從 2023 年 11 月份開始,人力開始逐漸的往這個方向投入,于 2024 年 2 月份正式開始進入業務開發,在 6 月 4 號,對外正式發布了基于 HarmonyOS Next 系統的轉轉 App 首個版本。

          從早期的學習到最終第一個版本上線,我們經歷了以下幾個階段:

          • 1)前期的熟悉和學習過程;
          • 2)鴻蒙客戶端基建開發過程;
          • 3)首個版本需求范圍確定和排期;
          • 4)業務開發;
          • 5)測試;
          • 6)bug 修復/性能調優;
          • 7)上線。

          本文將要分享的是轉轉APP在開發全新鴻蒙NEXT端所遇到的一些問題,對比了鴻蒙開發和 Android、iOS 的不同,總結了這次開發過程中的一些經驗等等。希望能帶給你啟發。

           
           

          2、關于作者

          趙衛兵:目前負責轉轉集團 iOS 和鴻蒙系統 App 基礎架構和相關基礎建設。崇尚開源和分享精神,Sharing is everything ~

          轉轉團隊分享的其它幾篇技術文章有興趣也可讀一讀:

          1. 轉轉平臺IM系統架構設計與實踐(一):整體架構設計
          2. 轉轉平臺IM系統架構設計與實踐(二):詳細設計與實現
          3. Web端IM聊天消息該不該用瀏覽器本地存儲?一文即懂
          4. 手把手教你使用網絡編程抓包神器Wireshark
          5. 淺談網頁端IM技術及相關測試方法實踐(包括WebSocket性能測試)

          3、初識鴻蒙NEXT

          3.1 分布式技術

          HarmonyOS Next 具備強大的分布式技術,能夠實現跨設備協同工作。用戶可以無縫地在不同的設備間切換和使用應用,無需感知設備的差異。HDC 大會中如 WPS Office、高德等 APP,使用了應用接續特性,在不同設備中進行流轉,令人印象深刻。這點在 iOS 和 Android 中并不完全具備。

          3.2 高性能低時延

          HarmonyOS Next采用輕量級的微內核設計。

          iOS 使用的內核基于 XNU(X is Not Unix)內核,XNU 是一個混合內核,結合了微內核(Mach 內核)的內存管理、任務調度、進程間通信等特性和宏內核(BSD 內核)的文件系統、網絡堆棧、用戶進程管理等特性。

          Android 內核基于修改過的 Linux 宏內核,增加了 Binder IPC、電源管理、安全性等模塊和機制,以更好的支持移動設備。

          鴻蒙的微內核設計,官方稱相比宏內核,具備更高的性能和更低的時延,從而在多任務處理、設備響應和處理能力上具有明顯優勢。

          3.3 自適應UI框架

          通過 ArkUI和ArkTS,HarmonyOS Next能夠適應各種尺寸和形狀的屏幕設備,提供一致友好的用戶體驗。這個特性在跨設備協同時尤其重要。

          3.4 多終端、多OS支持

          HarmonyOS Next 不僅僅是一個手機操作系統,還能運行在平板、智能穿戴設備、智能家居設備等多種終端上,統一生態系統。對比蘋果的iOS,MacOS,TVOS,WatchOS,確實有些不同。但對于應用開發者而言,其實就是API的能力集合問題,這一點,鴻蒙使用 SysCap 系統能力集合達到了殊途同歸的效果。

          3.5 更優秀的安全性

          在應用安全層面,目前在應用的生態中有以下一些問題:

          • 1)誘導用戶下載安裝惡意應用;
          • 2)竊取用戶數據;
          • 3)強制推送廣告;
          • 4)利用漏洞攻擊其他應用程序;
          • 5)盜版軟件。

          這方面,由于Android 的開放性以及側載安裝的支持,問題表現的尤為明顯,而 iOS 是一個可以學習的老師。

          針對上面的問題,HarmonyOS Next 又是如何應對的呢?

          • 1)做好應用質量的監管,控制應用分發渠道,避免惡意應用分發到用戶設備上;
          • 2)提供安全的數據授權機制,避免用戶過度授權造成安全威脅;
          • 3)給應用程序開放的系統功能做到不被惡意利用;
          • 4)幫助應用程序最小程度的受到漏洞影響;
          • 5)為應用程序提供有效的核心數字產權保護手段,避免出現盜版軟件問題。

          具體可以看下圖:

          (圖片來自《鴻蒙生態應用安全技術白皮書 V1.0》)

          4、和Android、iOS的開發有何不同?

          鴻蒙開發上,和 Android、iOS 還是有不少相似和不同的地方,我挑選感受比較深刻的幾個點說下。

          4.1 開發語言和工具鏈

          鴻蒙開發使用的是ArkTS 語言,ArkTS基于 TypeScript 做了一些擴展,繼承了 TypeScript 的所有特性,是 TypeScript 的超集。

          下面是官方的一些介紹:

          ArkTS的一大特性是它專注于低運行時開銷。ArkTS對TypeScript的動態類型特性施加了更嚴格的限制,以減少運行時開銷,提高執行效率。通過取消動態類型特性,ArkTS代碼能更有效地被運行前編譯和優化,從而實現更快的應用啟動和更低的功耗。

          與JavaScript的互通性是ArkTS語言設計中的關鍵考慮因素。鑒于許多移動應用開發者希望重用其TypeScript和JavaScript代碼和庫,ArkTS提供了與JavaScript的無縫互通,使開發者可以很容易地將JavaScript代碼集成到他們的應用中。這意味著開發者可以利用現有的代碼和庫進行ArkTS開發。

          在開發工具上:使用的 IDE 是 DevEco Studio,基于 IntelliJ IDEA Community 開源版本打造,為開發者提供工程模板創建、開發、編譯、調試、發布等功能。華為在這個 IDE 上針對鴻蒙開發易用性上做了大量的工作,包含但不限于編譯器,代碼實時預覽、ArkUI Inspector、Profile 性能分析工具等等。

          在包管理上:有點類似前端的 npm 包管理機制,不過在這塊,是叫 ohpm,整體上非常相似,但是細節上有一些不同,譬如 package.json 的文件命名、lock 文件的內容信息、獨立的開源中心倉等等。倉庫這塊也提供了私倉部署的方式,采用套件工具中的 ohpm-repo就可以部署到企業內部服務器上。

          在調試上:和 Android 的 ADB 類似,鴻蒙這塊提供了一個 hdc 的工具,提供了類似查詢設備列表、網絡、文件、應用安裝卸載、shell、日志獲取等常用功能。

          4.2 開發體驗

          鴻蒙開發是用 ArkUI,類似 Flutter,SwiftUI 這樣的聲明式 UI,ArkUI 組件的命名和狀態管理和 SwiftUI 比較類似,上手比較容易。

          4.3 開發資料和交流

          Android 從 2008 年谷歌布,iOS 從 2007 年蘋果發布,距離到現在已經有了 16~17 年之久,在這期間,互聯網上積累了無數的開發資料和經驗分享,也有著大量的開源項目和社區。

          而有關 HarmonyOS Next 方面的資料,目前更多的是官方開發指南和開源范例(集中在 gitee 上)。

          社區方面,主要是華為開發者論壇,受限于開發者版本的迅速迭代,一些帖子討論的內容已經過時且不再適用。

          而在博客、github 開源上,目前看到的其實并不多,更多的分享還是比較基礎,深度有價值的還不多。

          目前在這個階段,更多的是企業和華為合作的情況下,內部使用 Issue 工單系統進行溝通交流。交流主要圍繞著需求、Bug 反饋、指南疑問來展開。

          譬如:

          • 1)指南資料中提供的能力,不滿足訴求,交流是否有更好的解決方案;
          • 2)API 、IDE、工具鏈表現不符合預期,反饋 bug;
          • 3)系統能力類比 Android、iOS 缺失的特性,交流是否有替代的解決方案。

          截止到本篇文章寫的時候,轉轉華為工單交流的總數已達到 270+個。反饋的 bug 和缺失的能力,在后面的開發者預覽版本中都被修復或支持了。

          印象比較深刻的一件事是:開發和測試期間我們發現了停留在登錄頁面不動,過個10 分鐘左右,系統就會卡死重啟,我們一度以為是 App 哪里有 bug。我們通過 hdc hilog 抓取系統輸出的日志,發現大約過了 10 分鐘左右,log 就會死循環打印,很明顯系統底層發生了一些異常。已經晚上快 1 點了,我們興奮的找到和我們對接這個問題的華為工程師張老師,將視頻和日志發送給他,張老師按照復現的路徑,也成功復現出來,并且抓取到日志。后面的幾天,經過華為伙伴的努力,終于定位到問題所在,是文件句柄 FD 存在泄露的情況,并在下一個開發者版本中推送修復了。

          為華為工程師的敬業和效率豎一個大拇指,華為之所以強大,從這件事的跟進和解決效率上,就能理解到為什么。

          5、踩坑后總結的幾個經驗

          5.1 類比學習

          投入鴻蒙開發的客戶端同學,有來自 Android 開發的,也有來自 iOS 開發的,或多或少對另外一端的系統了解的不是很全面。

          在學習的過程中,我們發現鴻蒙的一些特性和 API 設計,有些和 iOS 比較像,而有些和 Android 有些像。我們內部經常討論交流和理解 HarmonyOS Next 的應用層設計問題。在方案選擇上,HarmonyOS Next 中都有借鑒和取舍。

          這個階段:我們需要重點理解鴻蒙特有的一些設計概念和思想。譬如 Stage 模型,Stage模型是從 API 9 開始新增的模型,是目前主推且會長期演進的鴻蒙應用模型。在該模型中,由于提供了 AbilityStage、WindowStage 等類作為應用組件和 Window 窗口的“舞臺”,這種方式在 Android、iOS 上是不是有類似的概念呢?

          如果我們如下類比 Android、iOS。

          AbilityStage 和 WindowStage:

          • 1)在 iOS 中,與 UIViewController 和 UIWindow 類似。UIViewController 管理視圖層次和界面行為,而 UIWindow 是應用程序的窗口,可以顯示內容;
          • 2)在 Android 中,可以類比于 Activity 和 Window。Activity 是應用的單個屏幕,負責界面的創建和管理,而 Window 是 Activity 的頂層視圖容器。

          UIAbility 和 ExtensionAbility:

          • 1)UIAbility 可以和 iOS 的 UIViewController 以及 Android 的 Activity 相對應,因為它們都是用于管理和顯示用戶界面的基本單元。
          • 2)ExtensionAbility 可以類比于 iOS 的 App Extension 和 Android 的 Service。App Extension 提供了將功能擴展到系統范圍內的能力,而 Service 在 Android 中則是運行在后臺的組件,執行長時間運行的操作。

          雖然細節有所不同,但大方向上這樣對比和類比,會幫助我們快速理解鴻蒙相關開發概念。

          5.2 項目管理和風險方案應對

          首個版本的開發,幾乎涉及到了公司所有的業務部門,我們通過啟動會拉齊背景信息,前期讓大家梳理到新增一個鴻蒙終端對業務的影響范圍,以及解決方案。

          1)PlanB 方案:

          一些三方 SDK 如微信、支付寶等在前期都是沒有的,我們首個版本需要做好 PlanB 方案。涉及到的包括登錄、支付、分享等業務,都需要針對這些進行調整。

          2)有限的測試機:

          因為業務部門參與進來的很多,但工程樣機十分有限。服務端和前端同學代碼調整完畢后如何測試呢?這個是我們不得不考慮的一件事情。

          新增一個鴻蒙終端,服務端調整后端代碼,在測試和沙箱測試時,除了回歸不要影響 Android 和 iOS 之外,還要能保證針對鴻蒙的兼容調整是有效的。鑒于鴻蒙測試機器十分有限,我們給 Server 同學提供了 Android 測試包,將 Android 測試包的終端 mock 成鴻蒙終端來供服務端測試接口,這樣子測試下來十分高效。

          針對前端同學:不能再向剛才那樣做了,畢竟是用 Android 的 WebView。即便我們 WebView 的 UserAgent mock 成 Android 系統,使得通信和交互仍然走類似 Android 的策略,而這樣并不能代表真實的鴻蒙 WebView 環境,因為在 Next 系統中整個 Native 和 Webview 的通信 Bridge 是全新的一套方案,且鴻蒙的 API 實現接口也都需要走鴻蒙側來測試。針對這個情況,我們非常謹慎小心的將各個業務部門的參與進來的時間錯開,盡力保證在有限測試機的情況下,每個業務輪轉參與進來的時候都是有機器的。

          5.3 多和華為伙伴進行溝通

          這部分的經驗,具有一定的時效性。后期商用版本發布之后,可能這樣的溝通渠道、頻次很難再有了。

          為什么要多和華為伙伴時刻保持密切的溝通?有幾個印象深刻的例子。

          1)第一個例子:路由

          鴻蒙關于頁面跳轉提供了兩套解決方案,一套是頁面路由 router,一套是組件導航 Navigation。前期我們在基建開發期間,采用的頁面路由 router 方案,@zz/router 組件代碼已經開發完畢了,但是到了開發 WebView 的 Hybrid 接口時,才意識到一個嚴重的問題,就是 router 提供的能力,并不能滿足我們復雜的頁面棧管理,譬如在頁面棧中多個 WebView,我們需要關閉指定的 WebView 頁面,router 提供的 API 能力是無法做到的。和華為溝通后才知道,官方是推薦 Navigation 來實現,且未來 router 方案不再演進。我們提出的復雜頁面棧管理的能力,彼時 Navigation 支持的還不完整,但是伙伴告訴我們,他們會在 Navigation 上滿足我們的需求。關閉頁面棧中指定 index 或者 name 的頁面,相信其他開發者也都會遇到,應該是一個普遍的需求。

          基于這種情況,我們不得不迅速調整我們的路由組件,基于 Navigation 重新設計了一套路由方案,還好項目業務還沒有開始大量開發,要改動的地方也不是很多,如果溝通再晚點,恐怕調整起來代價會相對更高點。此時的溝通,讓我們少走了彎路,避免在 router 上走投無路死磕方案。

          2)第二個例子:企業分發

          企業分發通常用于企業內部測試、企業內部 App 等。Dev 證書和 iOS 的 Dev 證書類似,Provisioning Profile(p7b 文件)會有 100 臺設備的限制。考慮到將來,轉轉也想依賴企業分發能力,可以在測試中采用企業簽名打包來進行測試。雖說在當前階段不是硬性和必要的,但是我們還有一個轉轉質檢 App,這個 App 我們不能通過 AGC 后臺上架華為市場,因為在質檢中心,如果不走內部分發安裝,那么我們將會面臨著外網下載,會給質檢中心的帶寬帶來很大的負載以及成本。

          我們密切關注者企業分發能力的就緒時間,在今年的 5 月份,AGC 后臺企業分發能力提供之后,立即進行了全流程處理,包括申請企業開發者、申請證書以及測試走通下載整個過程。這種情況下,通過及時交流,我們可以第一時間進行測試實踐,有效降低或者避免了未來方案上的一些風險。

          3)第三個例子:安全控件與系統 Picker

          相信廣大開發者今年剛開始介入 HarmonyOS Next 開發時,對于使用到的一些權限,如讀取剪貼板,讀取或者保存圖片到相冊等等這些 ACL(Access Control List)訪問控制列表權限,都是通過在開發者后臺勾選這些權限從而實現在應用中彈窗許可訪問。但是在今年 6 月份的溝通中,我們獲知后面要讓開發者全部適配到安全控件方案。這些安全控件都是系統提供的選擇器,使用之后,每次需要用戶明確操作才行。

          目前在 Android 和 iOS 中,如果想要在應用中上傳一張照片,就需要同意該應用獲得圖庫的訪問權限,而帶來的弊端就是,這個應用今后可隨意訪問你圖庫中的所有圖片。相比之前的授權彈窗許可一次之后,可能造成的權限濫用,安全控件提升了用戶對敏感權限的操作感知,算是 HarmonyOS Next 在保障用戶隱私安全方面的一個亮點和優勢。

          這其中的核心理念便是從權限管控到數據管控。在 Android 和 iOS 原本的權限管控方案中,比如一旦給了通訊錄權限,那么相當于把通訊錄的鑰匙給予了應用開發者,如果開發者違規使用,在用戶不知情的讀取整個通訊錄,其實是不符合用戶的隱私要求。而數據管控便是不會再把通訊錄的鑰匙給開發者,而是你要什么樣的通訊錄數據,那么你只能通過通訊錄安全選擇控件中來選擇想要讀取的通訊錄,不再讓應用隨意獲取整個通訊錄數據。

          關于安全控件我們進行了多次溝通,了解了安全控件在華為側推進的節奏以及我們整改的期限時間等,另外我們也提出個別場景,安全控件還不足以滿足訴求,譬如用戶保存圖片到相冊,還沒有對應的安全控件能力。這方面的溝通,會讓我們及時的對 App 的隱私合規性做出優化調整,避免后面因為隱私權限問題而影響上架。

          及時溝通對于了解 Bug 的解決情況,功能交付時間、華為伙伴的要求等都是很有必要的,因為這些都會影響到開發測試到上線的一個節奏。

          6、鴻蒙NEXT上的WebView混合頁面開發

          6.1 概述

          回到我們大前端來,得提一下大家關注的 WebView。在 HarmonyOS Next 中仍然沿用之前統一的 WebView 架構。

          在 V1 版本中,需要做的核心工作包括:

          • 1)實現 WebView Core 層;
          • 2)JSBridge 層,新增實現 HarmonyOS Next 的 Bridge 通信;
          • 3)平移安全層能力;
          • 4)實現 Hybrid API 接口,也就是 Ability 層的能力。

          需要特別提一下的是:HarmonyOS Next 使用的 Web 瀏覽器基于 ArkWeb(方舟Web內核),該內核基于 Chrome 114 版本定制,對于各種 CSS、HTML、JS 屬性在各大瀏覽器中的兼容性情況可以使用 https://caniuse.com/#home 這個網站進行查詢。

          6.2 前期如何確定影響范圍和制定方案

          Ability 層的接口:轉轉的 WebView 歷經多年的演進,Native 與 WebView 的交互 API 是有一定歷史包袱的。我們不希望鴻蒙這次繼續背著包袱前行,所以我們計劃趁著這次前端業務兼容鴻蒙的機會,進行一波優化,丟棄一些已經計劃不再使用的能力或者接口。比如老的半屏 WebView 方案,導航欄按鈕功能設置方案、非統跳的頁面跳轉接口等。

          但一個方案的確定要充分考慮客戶端實現的難易程度以及前端大量業務側統一修改的難度代價,需要做到盡可能的合理平衡。為了確定這點,我們根據線上最近一個月中URL 中接口調用的埋點日志,結合 URL 查詢所屬業務、開發測試負責人的內部接口,整理了一張巨大的二維矩陣表,通過在線表格的過濾、篩選等功能,可以非常直觀的看到所有還在使用中的接口的業務調用分布情況,為我們評估方案改造工作量提供了重要的參考。

          一個 Hybrid API 在鴻蒙上支持情況,分為下面幾種情況。

          a) 直接支持,前端無需修改:提供和 Android、iOS 一樣的接口能力:

          • 1)功能對等:能力實現和 Andriod、iOS 一樣;
          • 2)簡化:比如瀏覽大圖、奢侈品鑒定,暫時使用簡版選圖方案。

          b) 推薦使用新方案:

          • 1)譬如導航欄相關按鈕的能力、新半屏能力;
          • 2)如 enterChat 等等功能,使用統跳接口來實現跳轉。

          c) 不支持:

          • 1)業務下線:業務不再需要,下線處理;
          • 2)版本初期不考慮該功能;
          • 3)某端特定功能:為了解決某個問題,某端專門增加的一個 api 供使用;
          • 4)系統能力不支持:HarmonyOS Next 沒有該項能力。

          最終根據這些原則,我們確定下來 V1 版本中 WebView API 的需求范圍、涉及業務方、改動方案。現在回想起來,當時我們做的這一步是非常有必要的,前期這些如果沒有梳理清楚,后面就非常容易造成溝通混亂以及影響開發進度。

          6.3 關于性能

          轉轉前端的頁面主要是 Web 形態,Hybrid 場景占據多數。在過去的幾年中,我們圍繞 Hybrid 形態,摸索出了一系列 Web 頁面的優化方案。從基礎的離線包,到復雜的預渲染、預請求等都有涉及。最終實現了 Hybrid 頁面與 Native 頁面在電商場景下,相差無幾的體驗。

          目前鴻蒙在這塊優化上,還都沒來得及跟進這些優化手段。這個也是后面要繼續建設的一個方向,最終要拉齊到和Android、iOS 一樣的性能優化體驗。

          7、后續開發展望

          首個版本上線,只是一個起點。

          在業務上,我們將不斷的繼續追平 Android、iOS 中那些重要的模塊和功能;

          在開發工具體驗和支持上,也逐漸補足缺失的能力,比如豐富的Native、WebView小工具能力,進一步提升客戶端和前端在 HarmonyOS Next 下的開發體驗。

          在性能體驗上,持續的關注和跟進性能問題,優化 WebView 以及 Native 的使用體驗,提升 App 的流暢度和響應速度。

          在創新上,我們將持續探索,將更多的 HarmonyOS Next 下的創新場景,如元服務、意圖推薦等等融入到轉轉 App 中,提升用戶的購物使用體驗。

          要做的事情很多,我們會在后續迭代中逐步完善起來這些能力,敬請期待。

          8、相關資料

          [1] 鴻蒙NEXT官方開發指南

          [2] 一年擼完百萬行代碼,企業微信的全新鴻蒙NEXT客戶端架構演進之路

          [3] 鴻蒙NEXT如何保證應用安全:詳解鴻蒙NEXT數字簽名和證書機制

          [4] 開源IM聊天程序HarmonyChat:基于鴻蒙NEXT的WebSocket協議

          [5] 微信純血鴻蒙版正式發布,295天走完微信14年技術之路!

          [6] 即時通訊框架MobileIMSDK的鴻蒙NEXT端詳細介紹

          [7] 即時通訊框架MobileIMSDK的鴻蒙NEXT端開發者手冊

          [8] 轉轉平臺IM系統架構設計與實踐(一):整體架構設計

          [9] 轉轉平臺IM系統架構設計與實踐(二):詳細設計與實現

          [10] Web端IM聊天消息該不該用瀏覽器本地存儲?一文即懂

          [11] 手把手教你使用網絡編程抓包神器Wireshark

          [12] 淺談網頁端IM技術及相關測試方法實踐(包括WebSocket性能測試)


          (本文已同步發布于:http://www.52im.net/thread-4820-1-1.html)

          posted @ 2025-04-23 10:50 Jack Jiang 閱讀(62) | 評論 (0)編輯 收藏

               摘要: 本文由企業微信客戶端團隊黃瑋分享,原題“在流沙上筑城:企微鴻蒙開發演進”,下文進行了排版優化和內容修訂。1、引言當企業微信團隊在2024年啟動鴻蒙Next版開發時,我們面對的是雙重難題:1)在WXG小團隊模式下,如何快速將數百萬行級企業應用移植到全新操作系統?2)在鴻蒙API 還是Preview的初期,如何保持業務代碼的穩定,在API快速更新的浪潮中巋然不動?DataLis...  閱讀全文

          posted @ 2025-04-15 11:22 Jack Jiang 閱讀(89) | 評論 (0)編輯 收藏

               摘要: 本文由美團技術團隊張晨分享,原題“鴻蒙應用簽名實操及機制探究”,下文進行了排版優化和內容修訂。1、引言華為鴻蒙單框架操作系統HarmonyOS NEXT已于2024年10月23日正式發布Release版。HarmonyOS NEXT僅支持鴻蒙原生應用,不再兼容安卓。本文對鴻蒙NEXT公開資料進行了深入分析和解讀,梳理了鴻蒙單框架應用的簽名機制,拆解每一步的實操過程和背后的實...  閱讀全文

          posted @ 2025-04-09 11:51 Jack Jiang 閱讀(84) | 評論 (0)編輯 收藏

               摘要: 本文由阿里云望宸分享,原題“大模型推理主戰場:什么才是通信協議標配?”,下文進行了排版優化和內容修訂。1、引言DeepSeek 加速了模型平權,隨之而來的是大模型推理需求的激增,大模型性能提升的主戰場從訓練轉移到了推理。推理并發的提升,將催生計算、存儲、網絡、中間件、數據庫等領域新的工程化需求。本文將分享 SSE 和 WebSocket 這兩個AI大模型應用的標配網絡通信協...  閱讀全文

          posted @ 2025-03-27 15:14 Jack Jiang 閱讀(83) | 評論 (0)編輯 收藏

          Jack Jiang的 Mail: jb2011@163.com, 聯系QQ: 413980957, 微信: hellojackjiang
          主站蜘蛛池模板: 陇川县| 哈尔滨市| 东乌珠穆沁旗| 安丘市| 上蔡县| 蓬溪县| 新泰市| 邵阳市| 道真| 邵阳县| 易门县| 白城市| 元阳县| 迭部县| 图们市| 博罗县| 德江县| 康乐县| 合阳县| 巫溪县| 毕节市| 利辛县| 巴彦淖尔市| 沭阳县| 北川| 永寿县| 神农架林区| 南丰县| 镇赉县| 萨迦县| 南安市| 荃湾区| 潜江市| 大洼县| 雅江县| 哈巴河县| 墨竹工卡县| 尚义县| 廉江市| 双流县| 和田县|