6

米家插件平台的技术实践之路

 3 years ago
source link: https://mp.weixin.qq.com/s?__biz=MzUxMDQxMDMyNg%3D%3D&%3Bmid=2247487671&%3Bidx=1&%3Bsn=7feb7f7160cfbdf86283b6ef74866405
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

2016年小米正式发布米家品牌,此后米家开始接入第三方的智能硬件产品,小米的IoT生态也迎来了快速发展。截止到2020年Q3,小米AIoT平台已连接的IoT设备(不包括智能手机及笔记本电脑)数达到2.89亿台。如何高效的接入和管理这么多设备,是米家App一直在探索的问题。我们希望通过米家插件来解决这个问题,下面将分享米家插件平台在研发过程中的一些探索和实践。

1

米家APP介绍

米家App是一个智能硬件管理平台,不仅连接小米及生态链公司的智能产品,同时也开放接入第三方智能硬件,为用户提供智能生活整体解决方案。用户可以简单便捷地通过手机与智能硬件交互,并实现智能硬件之间的互联互通。一键实现个性化定制的智能场景,与家人朋友分享智能设备。

RjmyQnQ.png!mobile

2

什么是米家插件

米家插件是用户在米家App中用来控制设备的一段小程序。每个设备都有其相对应的插件,由开发者(通常是设备厂商)负责开发,测试,发布与维护。下面是一个灯组插件主要界面的截图。

j2URbeI.png!mobile

米家插件基于小米研发的插件框架开发。插件框架是米家为支持插件开发而提供的JavaScript接口的集合,赋予了开发者开发/调试/运行插件的能力。接入小米IoT平台的智能硬件,米家App正是通过米家插件来控制和管理设备的。

2.1 米家插件发展史

随着小米IoT业务的快速发展,米家插件也经历了三个阶段: Native插件阶段、ReactNative插件(简称RN插件)阶段、公版插件阶段。

  1. Native插件阶段

在小米IoT业务早期,接入米家生态的智能设备还不多,这个阶段的插件都是Native插件,开发者需要基于iOS和Android分别开发插件,然后米家集成插件代码(Android可以动态下载)。随着小米IoT业务的快速发展,米家APP的安装包体积快速增长,代码维护困难,迫切需要一套支持动态化的插件方案。

  1. RN插件阶段

随着IoT业务的快速发展,Native插件的弊端越来越明显。为了适应业务的发展,米家对新一代的插件方案要求是支持动态化和跨平台。2018年我们开始着手下一代插件方案的研究,结合用户体验和开发维护成本,最终我们选择基于ReactNative搭建一套插件框架,以帮助开发者快速开发米家插件。基于RN的插件框架,插件开发语言统一为JavaScript,开发者只需要一套RN插件代码,便可运行在iOS和Android双平台上,极大的减轻了开发者的开发成本。

  1. 公版插件阶段

为了进一步降低开发成本,米家启动了公版插件的研发工作。公版插件是由米家开发,支持开发者做一些个性化配置并且可以免费使用的通用插件。正如其名,某个品类的公版插件可以用来控制该品类的所有设备。目前,米家已经提供了如空气净化器、灯、电暖器、浴霸、风扇...等多个品类的公版插件。开发者在没太多自定义需求的时候,使用公版插件可以零成本接入米家。后续我们会推出更多品类的公版插件,以及更多的定制化能力支持。现阶段,公版插件也是基于RN开发,不管后面米家的插件框架如何迭代升级,使用公版插件的开发者将省去很多维护工作。

2.2 RN插件的优势

RN在Facebook官方支持和广大社区推动下,发展非常迅速。从2015.04月发布第1个版本开始,截止到2020.11月,在Github累计发布351个版本,共收到91.9k份Star。鉴于RN具有的各种优越性,米家App选择基于RN开发插件框架。相比Native插件,RN插件有很多优势:

  1. 跨平台

RN开发的应用大多用于iOS和Android平台,但通过众多开发者和社区的支持,也可用于PC、Web等平台。

mABBb23.png!mobile

  1. 可快速迭代

RN插件在使用感受上和用Objecttive-C(OC)或Java编写的应用相比几乎无法区分。RN插件可以快速迭代开发,比起传统原生应用漫长的编译过程,插件开发者可以在瞬间刷新插件,实时预览插件UI效果。

  1. JavaScript拥有大量的开发者

自1996年JavaScript发布第1版以来,JavaScript在互联网中广泛使用。近年在各大机构的编程语言排行榜中JavaScript基本都在Top 10,拥有数据庞大的开发者。

2.3 RN插件的挑战

RN的设计初衷是成为JS和Native应用之间的桥梁,核心模块就是JSBridge。JSBridge完美的隔离了JS和Native应用,提供了足够的灵活性,但却导致页面性能存在一些问题,尤其是复杂页面的渲染性能较差。JS和Native交互使用JSON数据,数据的传输效率不高,消息通道容易阻塞。RN也意识到这些问题,提出了一系列的重构计划来解决这些性能瓶颈。

3

米家插件体系

米家插件是米家App中智能设备的控制中枢。如下图所示,米家插件体系包含6大部分:平台服务、RN-SDK、RN插件、公版插件、插件开发环境和插件发布环境。涉及插件开发、调试、发布各个环节。

MR36Zr2.png!mobile

3.1 米家平台服务

依托Android和iOS的系统能力,米家插件具备了丰富的IoT能力。在此基础上,我们还针对网络、储存、安全等模块进行加固和封装,插件不用担心通信安全和数据隐私泄露等问题。米家后台提供了如消息推送、多设备联动、语音控制、云计算等丰富的IOT设备管理能力。有了这些基础能力,插件开发者只需专注于插件的开发即可,大多设备甚至都不需要开发自家的后台服务即具有强大的后端能力。

3.2  RN-SDK

默认情况下,RN会将所有的JS代码打包成一个Bundle,App可以把Bundle文件放在本地或者从服务器下载。 我们结合米家插件自身的业务特点,对RN的编译脚本进行定制化开发,可以打包成多个Bundle。 每个插件打包成2个Bundle: 由一个main.bundle和一个sdk.bundle组成。 其中main.bundle是由插件代码编译打包的生成的,不同的插件对应不同的main.bundle,由厂商负责迭代更新; sdk.bundle是由米家开发的RN-SDK的代码编译打包生成的,不同的插件共用同一个sdk.bundle,由米家负责迭代更新。 通过深度定制编译脚本,米家的RN-SDK是向后兼容的。 基于低版本RN-SDK开发的插件,可以在高版本的RN-SDK上运行。 这样插件和RN-SDK就可以按自己的节奏去发布新版本。 把公共的代码和资源放到RN-SDK里面去,不仅可以减少插件包的大小,对于减少插件的打开时间也有帮助。

mINNbmR.png!mobile

RN-SDK封装了米家提供的设备管理能力、网络通信、存储、蓝牙、WiFi、红外、视频、音频、固件更新、UI组件库等。开发者可基于该SDK开发富有差异性的业务功能。UI组件库提供的各种控件,经过精心设计,不仅样式精美,而且对深色模式、无障碍、大字体等都做了适配,使用起来非常方便。如下图展示了UI组件库里面提供的一些常用的控件。

2UVVBvb.png!mobile

如果有些功能在RN-SDK里不提供,React生态也有很丰富的开源的三方库,开发者可以很方便的引入到插件使用。

3.3 插件开发与调试

为了降低插件的开发难度,米家提供了一系列的工具帮助开发者快速上手插件开发。

URn6rmF.png!mobile

  • 一键安装插件开发环境

通过运行我们的脚本程序,开发者可以快速安装插件开发所需要的各种依赖,即使是从没用过RN开发的开发者都可以快速完成环境的搭建。

  • 丰富的代码模板

这些代码模板把相应设备需要的基本功能都已经开发好,开发者只需把相关参数修改一下即可完成基本的开发。常见的WiFi设备、蓝牙设备,米家都有提供对应的插件模板,开发者可根据硬件产品的联网方式、开发能力选择使用对应的模板。

bAfErqI.png!mobile

  • UI实时预览

插件开发过程中,开发者可以通过米家APP随时调试功能是否正常,UI是否符合设计预期。

  • 扫码调试

为了进一步简化调试设置,米家RN插件已经支持扫码调试,开发者运行我们提供的npm指令,然后即可扫描调试,省去了很多设置步骤。

如果这些工具还不能解决开发者的问题,我们还有一个工单系统。开发者可以给我们提工单反馈问题,每个工单都会有工程师来跟进,直到问题解决。

3.4 发布插件

开发者完成插件开发后,将代码打包发布到小米IoT管理平台,通过米家测试后,即可上线发布。在Iot管理平台,开发者可以随时查看发布后的活跃用户、质量指标、用户反馈等多个维度的数据指标。

eANbErM.png!mobile

3.5 公版插件

为了提高厂商的接入效率,减少插件的开发成本,提升插件质量和用户体验,米家启动了公版插件的研发。 公版插件是由米家开发,厂商可以免费使用的米家插件。 以空气净化器为例,公版插件是米家综合考虑市场上主流的空气净化器的产品功能后,设计出来的一款可以适用于大多数空气净化器的插件。 当然,提供给每个厂商的公版插件并不都是完全一样的,公版插件具备哪些功能还跟设备的instance(基于MIoT-Spec协议编写的定义设备功能的文件)有关。 目前,米家提供了如空气净化器、灯、电暖器、浴霸、风扇等多个品类的公版插件,后续我们会推出更多品类的公版插件。 下面是空气净化器的公版插件截图,公版插件也是使用RN来发开发的,对于用户来说使用上没有本质的区别。

queQRjU.png!mobile

考虑到厂商可能想做一些有差异性的功能,公版插件也支持一些定制化的能力。公版插件是基于厂商的需求生成配置文件,然后根据配置文件态生成相关的代码,以满厂商的定制化需求。

Yziyuqu.png!mobile

目前,我们正在开发公版插件可视化系统,厂商可以根据自己的需求独立地定制公版插件。在可视化系统里面,厂商不仅可以调整文字显示、界面布局等,还可以按照自己的想法去设计每个功能应该以何种样式展示出来,定制功能的交互方式。

iEfeiqn.png!mobile

对于开发能力不强的厂商,使用公版插件可以保证用户有一个良好的使用体验;对于那些自己开发插件的厂商,使用公版插件可以降低成本,缩短接入时间,让产品尽快上市。

截止2020年底,已经有上百家厂商在使用公版插件。相比厂商自研插件需要多次验收才能通过米家测试,公版插件大多一次验收就能通过测试;从后台统计的到插件crash率来看,公版插件的crash率相比厂商自研插件减少了80%,稳定性更好;相比自研一款插件需要动辄3-4周的开发时间,使用公版插件只需要在IoT平台花几分钟简单配置一下即可自动生成,真正的实现了零成本接入。

4

插件监控运维

插件发布后,运维是非常重要的一项工作。做好运维工作离不开好的运维工具的支持,米家提供的监控运维可以分为平台运维和开发者运维两部分。

平台运维可以分为发布运维、业务监控和质量监控。

  • 发布运维:RN-SDK灰度/上线/下线、插件灰度/上线/下线、下发配置等;

  • 业务监控:用户活跃统计、API调用热度分布、新功能的使用情况等;

  • 质量监控:插件启动成功率、插件启动耗时、API执行成功率和耗时、米家后台服务监控、插件crash统计等。

开发者可使用的运维工具集中在IoT管理平台,在这里开发者可以创建插件、调试插件功能、发布插件、用户画像、插件质量指标、查看用户反馈、crash日志等。

eAzINvY.png!mobile

5

总结与展望

米家插件在2019年迁移到RN框架,此后所有新接入的产品都在使用RN插件接入米家,插件开发的人力成本减少50%。截止2020年Q1,RN插件已经覆盖米家所有品类的智能设备。

未来我们会继续优化米家插件开发的各个流程,尽可能帮助开发者提升开发效率,降低开发门槛。同时,我们也会持续优化米家插件的各项指标,为米家用户带来更好的使用体验。

参考文献

[1] 张小武. React Native技术及其在米家插件端实践

[2] 什么是米家扩展程序: 

https://iot.mi.com/new/doc/extension-development/overview

往期文章

No.1 日志异常检测初步实践与探索

No.2  基于chaosblade的故障注入平台实践

No.3  HDFS慢节点监控及处理

uAfiMn6.png!mobile


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK