写点什么

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

  • 2023-05-18
    辽宁
  • 本文字数:2429 字

    阅读完需:约 8 分钟

集赞获纸质版《作战地图》


报名 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 的目标。

用户头像

专业、简单、稳定的全球互联网通信云 2021-01-26 加入

连续 8 年,IM 即时通讯云行业第一。 关注【融云全球互联网通信云】,了解更多~

评论

发布
暂无评论
融云跨平台 SDK 自动生成技术的探索和实践_sdk_融云 RongCloud_InfoQ写作社区