Jack Jiang

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

置顶随笔

相关链接:

一、理论知识准备

您需要对鸿蒙Next和ArkTS开发有所了解:

您需要对WebSocket技术有所了解:

HTML5的标准WebSocket协议文档、API手册:

鸿蒙Next的WebSocket文档和手册:

小提示:鸿蒙Next中的WebSocket API跟标准HTML5中的WebSocket接口及用法略有不同,但主要API都能一一对应,相差不大。

二、开发工具准备

1)DevEco-Studio:

JackJiang 使用的版本号如上图所示,为了方便直接引用工程,建议你也使用此版或较新版本

2)一站式下载地址:鸿蒙官网下载地址 点此进入。(需要注册成为开发者才能下载哟!

3)DevEco-Studio效果预览:

三、SDK 文件用途说明

3.1文件概览

纯ArkTS实现,无任何第3方库依赖,更无本地原生代码混编:

MobileIMSDK-鸿蒙端SDK本身只是ets文件源码的集合,自带的Demo代码只是为了方便随时测试SDK代码,目的主要是用于演示SDK的API调用,Demo代码不属于SDK框架的一部分。

大致的目录说明:

3.2详细说明

SDK 各模块/文件作用说明:

四、主要API接口和用途说明

* 主要API文档地址是:http://docs.52im.net/extend/docs/api/mobileimsdk/harmony/

1)ClientCoreSDK.getInstance().loginHasInit:

  • 用途:是否已经完成过首次登陆。
  • 说明 :用户一旦从自已的应用中完成登陆IM服务器后,本方法就会一直返回true(直到退出登陆IM)。
  • 返回值:{boolean},true表示已完成首次成功登陆(即已经成功登陆过IM服务端了,后面掉线时不影响此标识),否则表示尚未连接IM服务器。

2)ClientCoreSDK.getInstance().connectedToServer:

  • 用途:是否在线。
  • 说明 :表示网络连接是否正常。
  • 返回值:{boolean},true表示网络连接正常,否则表示已掉线,本字段只在this._logined=true时有意义(如果都没有登陆到IM服务器,怎么存在在线或掉线的概念呢)。

3)ClientCoreSDK.getInstance().currentLoginInfo:

4)ClientCoreSDK.getInstance().init(eventHub: common.EventHub): void:

  • 用途:初始化SDK核心。
  • 说明:不同于MobileIMSDK的iOS和Java客户端,本方法需要由开发者调用,以确保MobileIMSDK核心已被初始化完成。
  • 本方法被调用后, #isInitialed() 将返回true,否则返回false。

5)ClientCoreSDK.getInstance().release(): void:

  • 用途:保释放MobileIMSDK框架资源统一方法。
  • 说明 :本方法建议在退出登陆(或退出APP时)时调用。调用时将尝试关闭所有MobileIMSDK框架的后台守护线程并同设置核心框架init=false、loginHasInit=false、connectedToServer=false。

6)LocalDataSender.getInstance().sendLogin(loginInfo: PLoginInfo | undefined): number:

  • 用途:发送登陆(连接)信息给服务端。
  • 说明 :不同于其它IM框架,本框架的登录和连接高度封装在了一个sendLogin方法中,无需单独再去connect服务器,大大简化了SDK的使用。loginInfo登陆信息各字段定义见:http://docs.52im.net/extend/docs/api/mobileimsdk/harmony/#1697

7)LocalDataSender.getInstance().sendLoginout(): number:

  • 用途:发送注销登陆信息。
  • 说明:此方法的调用将被本库理解为退出库的使用,本方法将会额外调用资源释放方法 ClientCoreSDK#release() ,以保证资源释放。本方法调用后,除非再次进行登陆过程,否则核心库将处于初始未初始化状态。

8)LocalDataSender.getInstance().sendCommonDataPlain(dataContentWidthStr: string, to_user_id: string, QoS: boolean = true, fingerPrint: string = '', typeu: number = -1): number:

  • 用途:向某人发送一条消息。
  • 参数dataContentWidthStr:要发送的数据内容(字符串方式组织)。
  • 参数to_user_id:要发送到的目标用户id。
  • 参数QoS :true表示需QoS机制支持,否则不需要。
  • 参数fingerPrint:QoS机制中要用到的指纹码(即消息包唯一id),可设为null,生成方法见 Protocal.genFingerPrint()。
  • 参数typeu:应用层专用字段——用于应用层存放聊天、推送等场景下的消息类型。注意:此值为-1时表示未定义。MobileIMSDK框架中,本字段为保留字段,不参与框架的核心算法,专留作应用层自行定义和使用。
  • 返回值:0表示数据发出成功,否则返回的是错误码,see ErrorCode。

9)LocalDataSender.getInstance().sendCommonData(p: Protocal): number:

  • 用途:通用数据协议包的发送根方法。
  • 参数p:{Protocal} 要发送的消息协议包对象,Protocal详情请见“/module/mb_constants.js”下的createCommonData函数说明。
  • 返回值:0表示数据发出成功,否则返回的是错误码,see ErrorCode。

10)SocketEvent.SOCKET_EVENT_ON_RECIEVE_MESSAGE事件通知:

11)SocketEvent.SOCKET_EVENT_ON_LOGIN_RESPONSE事件通知:

  • 用途:本地用户的登陆结果回调事件通知(此事件发生时表示客户端已登陆/连接或重连完成)。
  • 推荐用法:开发者可在此事件中处理登录连接和掉线重连响应反馈。
  • 参数1: {PLoginInfoResponse}:API文档详见:http://docs.52im.net/extend/docs/api/mobileimsdk/harmony/#1434

12)SocketEvent.SOCKET_EVENT_ON_LINK_CLOSE事件通知:

  • 用途:与服务端的通信断开的回调事件通知(此事件发生时表示客户端已掉线)。
  • 该消息只有在客户端连接服务器成功之后网络异常中断之时触发。导致与与服务端的通信断开的原因有(但不限于):无线网络信号不稳定、WiFi与2G/3G/4G/5G等同开情况下的网络切换、手机系统的省电策略等。
  • 推荐用法 :开发者可在此通知中处理掉线时的界面状态更新等,比如设置将界面上的“在线”文字更新成“离线”。

13)SocketEvent.SOCKET_EVENT_PING事件通知:

  • 用途:本地发出心跳包后的回调通知(本回调并非MobileIMSDK-鸿蒙端核心逻辑,开发者可以不需要实现!)。
  • 推荐用法 :开发者可在此回调中处理底层网络的活动情况。

14)SocketEvent.SOCKET_EVENT_PONG事件通知:

  • 用途:收到服务端的心跳包反馈的回调通知(本回调并非MobileIMSDK-鸿蒙端核心逻辑,开发者可以不需要实现!)。
  • 推荐用法 :开发者可在此回调中处理底层网络的活动情况。

15)SocketEvent.SOCKET_EVENT_KICKOUT事件通知:

16)SocketEvent.SOCKET_EVENT_ON_ERROR_RESPONSE事件通知:

17)SocketEvent.SOCKET_EVENT_RECONNECT_ATTEMPT事件通知:

  • 用途:“自动重连尝试中”事件(本回调并非MobileIMSDK-鸿蒙端核心逻辑,开发者可以不需要实现!)。
  • 参数 code :{numeric}:0:已停止,1:持续运行中,2:单次脉搏

18)SocketEvent.SOCKET_EVENT_MESSAGE_LOST事件通知:

  • 用途:消息未送达的回调事件通知。
  • 发生场景:比如用户刚发完消息但网络已经断掉了的情况下,表现形式如:就像手机qq或微信一样消息气泡边上会出现红色图标以示没有发送成功)。
  • 建议用途:应用层可通过回调中的指纹特征码找到原消息并可以UI上将其标记为“发送失败”以便即时告之用户。
  • 参数1:{Array}:由框架的QoS算法判定出来的未送达消息列表。

19)SocketEvent.SOCKET_EVENT_MESSAGE_BE_RECIEVED事件通知:

  • 用途:消息已被对方收到的回调事件通知。
  • 说明 :目前,判定消息被对方收到是有两种可能:1) 对方确实是在线并且实时收到了;2) 对方不在线或者服务端转发过程中出错了,由服务端进行离线存储成功后的反馈(此种情况严格来讲不能算是“已被收到”,但对于应用层来说,离线存储了的消息原则上就是已送达了的消息:因为用户下次登陆时肯定能通过HTTP协议取到)。
  • 建议用途:应用层可通过回调中的指纹特征码找到原消息并可以UI上将其标记为“发送成功”以便即时告之用户。
  • 参数1:{String}:已被收到的消息的指纹特征码(唯一ID),应用层可据此ID找到原先已发的消息并可在UI是将其标记为”已送达“或”已读“以便提升用户体验。

五、如何引入SDK库文件

5.1方法一:源码形式

第一步:先将整个sdk源码module复制到您的鸿蒙工程中:

第二步:配置您的工程,确保正确引用了MobileIMSDK鸿蒙SDK的源码module:

 

5.2方法二:.har包形式

第一步:先将MobileIMSDK鸿蒙端SDK的.har包放入您的鸿蒙Next主module中(比如新建的libs目录下):

第二步:配置您的工程,确保正确引用了MobileIMSDK鸿蒙SDK的.har包:

六、如何调用SDK代码

6.1第一步:设置ws/wss连接URL

设置您自已部署的MobileIMSDK服务端IP或域名的示例详见Demo中的 IMClientManager.ets 文件):

提示:MobileIMSDK的服务端Demo部署指南请见 http://www.52im.net/thread-63-1-1.html

6.2第二步:初始化SDK

调用ClientCoreSDK中的init()方法进行初始化(示例详见Demo中的I MClientManager.ets 文件):

6.3第三步:注册框架事件

注册MobileIMSDK框架级的事件监听(示例详见Demo中的 IMClientManager.ets 文件):

6.4第四步:调用登录方法(框架内部会自动启动connect全过程)

调用登录方法(示例详见Demo中的 LoginPage.ets 文件):

提示:不同于其它IM框架,本框架的登录和连接高度封装在了一个sendLogin方法中,无需单独再去connect服务器,大大简化了SDK的使用。

七、Demo运行效果和功能说明

八、Demo运行方法

8.1重要说明

特别说明:MobileIMSDK的鸿蒙端工程(包括Demo代码),不依赖任何第3方库,也不存在任何Native代码混编,完全使用ArkTS、ArkUI官方标准API实现,所以你在拿到MobileIMSDK的鸿蒙端工程后直接开箱即可运行,切莫搞复杂、不要私自加戏!

8.2配置要连接的MobileIMSDK服务器IP

注意:下图中登陆连接的IP地址请设置为您自已的MobileIMSDK服务器地址哦。

友情提示: MobileIMSDK的服务端该怎么部署就不是本手册要讨论的内容了,你可以参见《即时通讯框架MobileIMSDK的Demo使用帮助:Server端》。

▲ 配置要连接的服务器IP(以上代码详见IMClientManager.ets文件

8.3启动模拟器

注意:如果没有新建模拟器可以自已新建一个。另外也可以使用支持鸿蒙Next的真机,打开“开发者模式”并插入USB线即可使用。

 

▲ 点击绿色箭头,立即启动模拟器!

8.4一键运行

如下图所示,点击绿色“运行”按钮后,将自动在模拟器或真机里显示自带的Demo界面了:

8.5运行效果

1)Demo的登陆界面运行截图:

2)Demo的主界面运行截图:

3)Demo运行的同时,可以查看详细的log输出(方便调试):

九、引用资料

[1] 鸿蒙Next官方开发资料

[2] MobileIMSDK开源框架的API文档

[3] MobileIMSDK开源IM框架源码Github地址点此

[4] MobileIMSDK-鸿蒙Next端发布公告

[5] MobileIMSDK-鸿蒙Next端详细介绍

[6] MobileIMSDK-鸿蒙Next端开发手册* 精编PDF版

[7] MobileIMSDK的Server端Demo使用帮助

posted @ 2024-12-30 12:08 Jack Jiang 阅读(89) | 评论 (0)编辑 收藏

     摘要: 本文的上篇我们讨论了在线实时消息的投递,如果接收方用户B不在线,系统是如何保证离线消息的可达性的呢?这就是本文要讨论的问题。  阅读全文

posted @ 2016-11-18 14:39 Jack Jiang 阅读(3099) | 评论 (0)编辑 收藏

     摘要: 虽然C10K问题已被妥善解决,但对于即时通讯应用(或其它网络编程方面)的开发者而言,研究C10K问题仍然价值巨大,因为技术的发展都是有规律和线索可循的,了解C10K问题及其解决思路,通过举一反三,或许可以为你以后面对类似问题提供更多可借鉴的思想和解决问题的实践思路。而这,也正是撰写本文的目的所在。  阅读全文

posted @ 2016-10-21 16:02 Jack Jiang 阅读(2683) | 评论 (0)编辑 收藏

     摘要: 本文将以新手的视角引导你阅读相关文章,以便为从零开发一个移动端IM做好方方面面的知识准备:包括但不限于网络编程基础、通信协议的选型、IM的架构设计等等。  阅读全文

posted @ 2016-08-29 17:42 Jack Jiang 阅读(3216) | 评论 (0)编辑 收藏

     摘要: 本文将简要介绍TeamTalk开源的过去和现在,为打算研究和采用TeamTalk的同行提供一定程度的参考。  阅读全文

posted @ 2016-08-09 17:25 Jack Jiang 阅读(2855) | 评论 (0)编辑 收藏

     摘要: 本文基于作者的实践以及相关资料的整理,总结了自已对Android进程和Service保活的理解,希望能为你的应用开发带来启发。  阅读全文

posted @ 2016-08-02 22:43 Jack Jiang 阅读(2572) | 评论 (0)编辑 收藏

     摘要: 本文将介绍如何在现有的技术基础上选择合适的方案开发一个“服务器推”(Comet技术)的应用,最优的方案还是取决于应用需求的本身。相对于传统的 Web 应用, 开发 Comet 应用具有一定的挑战性。  阅读全文

posted @ 2016-07-28 11:07 Jack Jiang 阅读(1514) | 评论 (0)编辑 收藏

     摘要: 本文对服务器推送技术(SSE)进行了详细的介绍,包含浏览器端和服务器端的相应实现细节,为在实践中使用该技术提供了指南  阅读全文

posted @ 2016-07-22 18:03 Jack Jiang 阅读(1219) | 评论 (0)编辑 收藏

     摘要: Web端即时通讯技术因受限于浏览器的设计限制,一直以来实现起来并不容易,主流的Web端即时通讯方案大致有4种:传统Ajax短轮询、Comet技术、WebSocket技术、SSE(Server-sent Events)。本文将简要介绍这4种技术的原理,并指出各自的异同点、优缺点等。  阅读全文

posted @ 2016-07-15 15:08 Jack Jiang 阅读(1890) | 评论 (2)编辑 收藏

     摘要: Web端的IM应用,由于浏览器的兼容性以及其固有的“客户端请求服务器处理并响应”的通信模型,造成了要在浏览器中实现一个兼容性较好的IM应用,其通信过程必然是诸多技术的组合,本文的目的就是要详细探讨这些技术并分析其原理和过程。   阅读全文

posted @ 2016-07-12 15:59 Jack Jiang 阅读(5601) | 评论 (0)编辑 收藏

     摘要: 文演示的是一个Android客户端程序,通过UDP协议与两个典型的NIO框架服务端(分别用MINA2和Netty4来实现),实现跨平台双向通信的完整Demo。  阅读全文

posted @ 2016-06-30 16:57 Jack Jiang 阅读(770) | 评论 (0)编辑 收藏

     摘要: 本文将演示一个iOS客户端程序,通过UDP协议与两个典型的NIO框架服务端(将分别用MINA2和Netty4来实现),实现跨平台双向通信的完整Demo。  阅读全文

posted @ 2016-06-28 22:11 Jack Jiang 阅读(1408) | 评论 (0)编辑 收藏

     摘要: 本文是《NIO框架入门》系列文章中的第2篇,将演示的是一个基于MINA2的UDP服务端和一个标准UDP客户端(Java实现)双向通信的完整例子。  阅读全文

posted @ 2016-06-24 14:38 Jack Jiang 阅读(865) | 评论 (0)编辑 收藏

     摘要: 本文将演示的是一个基于Netty4的UDP服务端和一个标准UDP客户端(Java实现)双向通信的完整例子。实际上,Netty4的UDP例子非常难找,官方的代码演示里只有一个简单的UDP广播例子,不足以用于演示Netty4的UDP通信最佳实践。  阅读全文

posted @ 2016-06-20 14:48 Jack Jiang 阅读(1537) | 评论 (0)编辑 收藏

     摘要: MobileIMSDK是一套专为移动端开发的原创即时通讯框架:超轻量级、高度提炼,lib包50KB以内;完全基于UDP协议实现;客户端支持iOS、Android、标准Java平台;可应用于跨设备、跨网络的聊天APP、企业OA、消息推送等各种场景。  阅读全文

posted @ 2015-12-14 15:18 Jack Jiang 阅读(2795) | 评论 (0)编辑 收藏

     摘要: MobileIMSDK是专为移动端开发的原创即时通讯开源框架:超轻量级、高度提炼,lib包50KB以内;完全基于UDP协议实现;客户端支持iOS、Android、标准Java平台;可应用于跨设备、跨网络的聊天APP、企业OA、消息推送等各种场景。  阅读全文

posted @ 2015-12-01 16:06 Jack Jiang 阅读(3394) | 评论 (2)编辑 收藏

2025年6月13日

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 阅读(21) | 评论 (0)编辑 收藏

     摘要: 本文由携程前端开发专家Chris Xia分享,关注新技术革新和研发效率提升。1、引言本文介绍了携程机票前端基于Server-Sent Events(SSE)实现服务端推送的企业级全链路通用技术解决方案。文章深入探讨了 SSE 技术在应用过程中包括方案对比、技术选型、链路层优化以及实际效果等多维度的技术细节,为类似使用场景提供普适性参考和借鉴。该方案设计目标是实现通用性,适用于各种网络架构和业务场景...  阅读全文

posted @ 2025-06-13 15:32 Jack Jiang 阅读(18) | 评论 (0)编辑 收藏

2025年5月22日

本文来自哔哩哔哩通用技术团队分享,下文进行了排版优化和修订。

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 阅读(53) | 评论 (0)编辑 收藏

2025年5月19日

本文来自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)编辑 收藏

2025年5月15日

     摘要: 全平台开源即时通讯IM聊天框架MobileIMSDK的服务端开发指南,支持鸿蒙NEXT  阅读全文

posted @ 2025-05-15 12:27 Jack Jiang 阅读(57) | 评论 (0)编辑 收藏

2025年4月29日

一、基本介绍

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)编辑 收藏

2025年4月23日

本文由转转技术团队赵卫兵分享,原题“鸿蒙新篇章:转转 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)编辑 收藏

2025年4月15日

     摘要: 本文由企业微信客户端团队黄玮分享,原题“在流沙上筑城:企微鸿蒙开发演进”,下文进行了排版优化和内容修订。1、引言当企业微信团队在2024年启动鸿蒙Next版开发时,我们面对的是双重难题:1)在WXG小团队模式下,如何快速将数百万行级企业应用移植到全新操作系统?2)在鸿蒙API 还是Preview的初期,如何保持业务代码的稳定,在API快速更新的浪潮中岿然不动?DataLis...  阅读全文

posted @ 2025-04-15 11:22 Jack Jiang 阅读(89) | 评论 (0)编辑 收藏

2025年4月9日

     摘要: 本文由美团技术团队张晨分享,原题“鸿蒙应用签名实操及机制探究”,下文进行了排版优化和内容修订。1、引言华为鸿蒙单框架操作系统HarmonyOS NEXT已于2024年10月23日正式发布Release版。HarmonyOS NEXT仅支持鸿蒙原生应用,不再兼容安卓。本文对鸿蒙NEXT公开资料进行了深入分析和解读,梳理了鸿蒙单框架应用的签名机制,拆解每一步的实操过程和背后的实...  阅读全文

posted @ 2025-04-09 11:51 Jack Jiang 阅读(84) | 评论 (0)编辑 收藏

2025年3月27日

     摘要: 本文由阿里云望宸分享,原题“大模型推理主战场:什么才是通信协议标配?”,下文进行了排版优化和内容修订。1、引言DeepSeek 加速了模型平权,随之而来的是大模型推理需求的激增,大模型性能提升的主战场从训练转移到了推理。推理并发的提升,将催生计算、存储、网络、中间件、数据库等领域新的工程化需求。本文将分享 SSE 和 WebSocket 这两个AI大模型应用的标配网络通信协...  阅读全文

posted @ 2025-03-27 15:14 Jack Jiang 阅读(83) | 评论 (0)编辑 收藏

Jack Jiang的 Mail: jb2011@163.com, 联系QQ: 413980957, 微信: hellojackjiang