融云跨平台 SDK 自动生成技术的探索和实践

news2024/11/24 2:34:37

移步【融云全球互联网通信云】回复“地图”免费领

移步公众号报名报名 WICC · 出海嘉年华 

 

作为即时通讯云的领创品牌,融云的通信云产品广泛地服务于社交沟通、直播互动、实时社区、商业沟通等场景。关注【融云全球互联网通信云】了解更多

随着应用场景的丰富和开发框架的发展,原生双平台开发显然已经难以满足需求。融云推出了跨平台 SDK,一套代码应用于多个平台,为不同平台用户提供一致体验,赋能全平台、多语言开发。

本文主要分享融云跨平台研发团队通过技术手段自动生成跨平台 SDK,使其更快适应原生 SDK 的发版节奏,为开发者提供更好体验的探索实践。


平铺接口

融云跨平台 SDK 支持 uni-app、Flutter、RN、Unity 等多个主流平台,涵盖 IM、RTC 双核心通信服务的功能。

通过跨平台 SDK,融云为开发者提供一致的功能和接口,让开发者无需在各个平台间纠结于不同的接口调用。一切都基于原生接口进行封装实现,提供相应平台的功能插件,差异仅在于所使用的开发语言。

为了在适配多个平台的过程中减少重复工作,提升效率,融云通过平铺接口代码自动生成技,对 SDK 中的重复代码进行自动化生成。

融云 SDK 的部分接口是基于面向对象的思想开发的,在历史版本的不断演化中,部分功能存在多端对齐难的问题。为了方便开发者使用 SDK,融云在原生 SDK 基础上进行了一次封装,也就是平铺层接口。

 

平铺接口具备以下优势:

1. 优化历史版本不断演化的功能接口,让开发者无须在相同功能的接口上进行 “断舍离”。

2. 抹平 SDK 间的接口差异,保证 SDK 相同的功能在不同设备上保持一致。

3. 下沉平台层的逻辑,包括数据校验、数据整合等操作。

4. 提供一套更简洁、更清晰的产品接口。

完成平铺接口层建设后,最终的跨平台结构如下图所示。平台层调用平铺接口,再由平铺接口去调用原生 SDK 的功能接口。


自动生成

目前业界主流的代码生成技术分为以下几类:

基于模版编排生成代码:可以基于模板快速生成应用程序代码,开发者只需要关注逻辑开发。

基于可视化 UI 生成代码:将 UI 与命令行绑定,通过拖动 UI 生成对应代码,不过并不适用复杂的项目工程。

基于代码语料生成代码:要有足够的语料,再基于一套生成规则生成目标代码。

基于人工智能技术生成代码:多和 AI 领域的图像识别和机器学习技术结合。

融云跨平台 SDK 基于平铺接口调用原生 SDK 功能,以 connect 接口为例,其代码示例如下。

iOS 平铺 SDK connect 接口:

- (NSInteger)connect:(NSString *)token
             timeout:(int)timeout
      databaseOpened:(nullable void (^)(NSInteger code))databaseOpenedBlock
           connected:(nullable void (^)(NSInteger code, NSString *userId))connectedBlock;

Android 平铺 SDK connect 接口:

public abstract int connect(String token, int timeout, RCIMIWConnectCallback callback);

public abstract class RCIMIWConnectCallback implements IRCIMIWConnectCallback {
    @Override
    public void onDatabaseOpened(int code) {
    }
}

public interface IRCIMIWConnectCallback {
    void onConnected(int code, String userId);

    void onDatabaseOpened(int code);
}

Flutter 平铺 SDK connect 接口:

Future<int> connect(String token, int timeout, {RCIMIWConnectCallback? callback})

class RCIMIWConnectCallback {
  RCIMIWConnectCallback({this.onDatabaseOpened, required this.onConnected});

  Function(int? code)? onDatabaseOpened;
  Function(int? code, String? userId) onConnected;
}

不难发现,这组代码在方法名、返回值类型、参数类型、参数名等方面均存在相似之处,具备一定的规则性,可根据 iOS 和 Android 的代码来推导出 Flutter 代码。因此,融云选择基于代码语料自动生成代码的技术路线,流程如下:

 

生成平台结构信息

使用融云技术团队自研的工具扫描 iOS 和 Android 平台的接口信息,包括类名、包名、包含的属性、包含的方法等将 SDK 内所有的类信息,并且根据这些信息生成一个结构信息。

合并结构信息

合并结构信息可以检查两个类是否一致,帮助我们做一次校验工作。

并且,跨平台 SDK 最终要包含两个平台,将相同的信息合并到一个地方,可以更好地帮助我们进行后续处理。

在合并的同时,还会再次生成一份结构信息,这个结构信息抛弃了 iOS 和 Android 的语法概念,只保留单纯的结构信息,以便给生成跨平台层 SDK 使用。

以枚举来举例展示合并方式。

Android 枚举:

public enum RCIMIWMessageOperationPolicy {

    /*本地*/
    LOCAL,

    /*远端*/
    REMOTE,

    /*本地和远端*/
    LOCAL_REMOTE,
}

iOS 枚举:​​​​​​​

typedef NS_ENUM(NSUInteger, RCIMIWMessageOperationPolicy) {
    RCIMIWMessageOperationPolicyLocal = 0,
    RCIMIWMessageOperationPolicyRemote = 1,
    RCIMIWMessageOperationPolicyLocalRemote = 2,
};

观察上面的信息可以发现如下规则:

Android 直接展示枚举名字,但多个单词存在分隔符;iOS 是类名加枚举名字。

合并时可对 Android 去掉下划线和 iOS 去掉类名后的内容进行比对,判断二者是否一样,然后生成 RCIMIWMessageOperationPolicy 的结构信息。​​​​​​​

类名:RCIMIWMessageOperationPolicy
枚举:[local,remote,localRemote]
ios枚举信息:...
android枚举信息...
...

导入配置信息

完成上述合并结构信息后,再将一些特殊的配置信息合并到结构信息中,比如 Android 平台需要配置的一些三方推送信息等。

生成 SDK

至此,我们便得到了一份完整的结构信息,只需结合跨平台层的 SDK 模板,即可将所有信息生成到对应的文件中。

 

如上图示,在 Flutter SDK 中将所有的枚举生成到 rongcloud_im_enum.dart 中, 接口生成到 rongcloud_im_engine.dart 中,类信息生成到 rongcloud_im_classes.dart 中……

整个过程中,只需要在平铺接口进行 SDK 功能增加即可,无需在跨平台 SDK 上做任何操作,相应的接口就会自动生成到跨平台 SDK 上,极大提升开发效率,实现在低人力投入的前提下持续向开发者交付最新版本 SDK 的目标。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/540479.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

华为设备内网常用访问控制案例配置

实现 vlan 10不能访问其它vlan但可以上网&#xff0c;用traffic-filter实现 vlan20 不能访问其它vlan但可以上网&#xff0c;用mqc实现 vlan 30不能上外网&#xff0c;但可以和其它网段通信&#xff0c;用mqc实现 交换机配置 : [Huawei]dis current-configuration sysname Hua…

总结JVM重要知识点

一.类加载和创建对象的过程 1.类加载 1.编译 : 将源码文件(.java)编译成JVM可以解释的.class文件 . 语法分析>语义分析>注解处理 , 生成class文件 2.加载 : 装载 : 字节码本来存储在硬盘上 , 需要运行时 , 有类加载系统负责将类的信息加载到内存中(方法区) , 使用的是类…

距离6月18日DAMA-CDGA/CDGP认证考试还有31天,报名从速

6月18日DAMA-CDGA/CDGP数据治理认证考试开放报名中&#xff01; 考试开放地区&#xff1a;北京、上海、广州、深圳、长沙、呼和浩特、杭州、南京、济南、成都、西安。其他地区凑人数中… DAMA-CDGA/CDGP数据治理认证班进行中&#xff0c;报名从速&#xff01; DAMA认证为数据管…

crow-han(基于go-micro框架的微服务脚手架)-02-添加一个微服务实战(已k8s为例)

文章目录 1. 目录结构2. 添加自己的微服务2.1 配置文件和必要的函数2.1.1 配置文件2.1.2 连接k8s 2.2 k8s服务相关代码2.3 proto2.3.1 创建proto文件2.3.2 编译proto 2.4 handler2.5 k8s的main函数 3. gateway调用3.1 调用微服务3.2 router 4. 添加文档 swagger5. 调试5.1 启动…

自学黑客(网络安全)有哪些技巧——初学者篇

很多人说&#xff0c;要想学好黑客技术&#xff0c;首先你得真正热爱它。 热爱&#xff0c;听着多么让人激情澎湃&#xff0c;甚至热泪盈眶。 但很可惜&#xff0c;“热爱”这个词对还没入门的小白完全不管用。 如果一个人还没了解过你就说爱你&#xff0c;不是骗财就是骗色…

第三十四章 使用react-redux进一步管理状态

react-redux和redux是两个不同的概念。 redux是一个重要的数据管理库。redux的作用是帮助处理应用程序中复杂的数据管理和状态管理&#xff0c;它可以让你的应用程序更加可维护和可扩展。 react-redux是一个react库&#xff0c;它可以帮助react开发者在react应用程序中集成re…

Java经典笔试题—day11

Java经典笔试题—day11 &#x1f50e;选择题&#x1f50e;编程题&#x1f95d;最近公共祖先&#x1f95d;最大连续bit数 &#x1f50e;结尾 &#x1f50e;选择题 (1)下面哪个标识符是合法的&#xff1f; A.9HelloWorld B._Hello World C.Hello*World D.Hello$World D Java中标…

操作符讲解1---C语言

目录 前言&#xff1a; 1.什么是操作符 2.算术操作符 3.移位操作符 4.位操作符 5.逻辑操作符 5.1逻辑与 5.2逻辑或 5.3练习 5.4逻辑非 前言&#xff1a; 博主这几天都在积累知识&#xff0c;俗话说&#xff1a;”只有多输入才能有输出”。在写博客之前&#xff0c;也…

一文1000字从0到1实现Jenkins+Allure+Pytest的持续集成

一、配置 allure 环境变量 1、下载 allure是一个命令行工具&#xff0c;可以去 github 下载最新版&#xff1a;https://github.com/allure-framework/allure2/releases 2、解压到本地 3、配置环境变量 复制路径如&#xff1a;F:\allure-2.13.7\bin 环境变量、Path、添加 F:\…

【硬核】C语言指针是什么?深入浅出带你掌握C语言指针!

指针与底层硬件联系紧密&#xff0c;使用指针可操作数据的地址&#xff0c;实现数据的间接访问&#xff0c;本文章内容如下 1、C语言指针的作用 2、计算机的存储机制 3、如何定义指针 4、如何操作指针 5、数组与指针的关系 6、指针使用中的一些注意事项 1、C语言指针有什么作用…

企业级架构设计原则(含架构管理原则、业务架构设计原则、应用架构设计原则、数据架构设计原则、技术架构设计原则)

Togaf中的架构原则是一组用于指导企业架构设计和决策的基本准则。这些原则旨在支持组织的目标、价值观和战略&#xff0c;并提供一致性、可持续性和可扩展性的架构方案。 Togaf中提供了一些常见的架构原则&#xff0c;比如&#xff1a;保持一致性&#xff1a;确保架构与组织的目…

MySQL 性能调优及生产实战篇(二)

前言数据结构HASHBinary Search Trees、AVL TreesRed/Black TreesB TreesB Trees 数据存储InnoDBMyISAM 索引优化索引匹配方式哈希索引组合索引聚簇、非聚簇索引覆盖索引 优化细节&#xff08;important&#xff09;数据库勿做计算尽量主键查询前缀索引索引扫描排序子查询范围列…

干货满满---90条简单实用的Python编程技巧

对于Python&#xff0c;想必大家都不陌生&#xff0c;自从它问世以来得到了广大编程爱好者的追捧和喜爱&#xff0c;但是再好的东西都需要讲究技巧和策略方法&#xff0c;才能达到事半功倍的效果&#xff0c;下面是我近几年的学习心得和总结&#xff0c;希望能对大家带来一定帮…

不懂就要问,现在的物联卡还有人用吗?

很多朋友私信小编&#xff0c;现在的物联卡还能买吗&#xff1f; 当然&#xff0c;对于企业设备来讲&#xff0c;物联卡是一直可以使用的&#xff0c;而且非常稳定。 如果是用在个人手机上面&#xff0c;可以说也是可以用的&#xff0c;只不过是使用时间长短的问题。 ​ 下面…

ChatGPT为企业应用赋能

chatgpt-on-wechat和bot-on-anything两个项目都支持企业微信部署&#xff0c;其中前者功能比较丰富&#xff0c;推荐&#xff01; 如需帮助&#xff0c;可以搜索wx&#xff1a;Youngerer 找到我&#xff01; 功能展示&#xff1a; ![在这里插入图片描述](https://img-blog.csd…

【Linux升级之路】3_Linux进程概念

&#x1f31f;hello&#xff0c;各位读者大大们你们好呀&#x1f31f; &#x1f36d;&#x1f36d;系列专栏&#xff1a;【Linux升级之路】 ✒️✒️本篇内容&#xff1a;认识冯诺依曼系统&#xff0c;操作系统概念与定位&#xff0c;深入理解进程概念&#xff08;了解PCB&…

C语言函数大全-- m 开头的函数(2)

C语言函数大全 本篇介绍C语言函数大全-- m 开头的函数 1. mkdirat 1.1 函数说明 函数声明函数功能int mkdirat(int dirfd, const char *pathname, mode_t mode);它是一个 Linux 系统下的系统调用函数&#xff0c;用于在指定目录下创建新的子目录 参数&#xff1a; dirfd &a…

推荐一个一键AI抠图网站

一键去除图片背景 在这个数字化的世界里&#xff0c;我们经常需要处理各种图片&#xff0c;无论是用于个人的社交媒体&#xff0c;还是用于商业的广告设计。 然而&#xff0c;图片处理往往需要专业的技能和复杂的软件&#xff0c;这对许多人来说可能是个挑战。但现在&#xf…

3. Python字符串

文章目录 一、修改字符串大小写1.1 将字符串中每个单词的首字母改为大写1.2 将字符串中所有的字母改为大写1.3 将字符串中所有的字母改为小写 二、拼接字符串三、添加空白3.1 使用制表符添加空白3.2 使用换行符添加空白3.3 制表符和换行符同时使用 四、删除空白4.1 仅去掉字符串…

redis单机安装

1. 安装gcc 2.下载并编译redis wget http://download.redis.io/releases/redis-7.0.4.tar.gz 直接下载到虚拟机中解压 编译 安装redis 执行命令&#xff1a; make install PREFIX/usr/local/redis/ &#xff0c;会将redis安装到指定目录下,在这个目录下会生产bin目录 在安…