2016年小米正式发布米家品牌,此后米家开始接入第三方的智能硬件产品,小米的IoT生态也迎来了快速发展。截止到2020年Q3,小米AIoT平台已连接的IoT设备(不包括智能手机及笔记本电脑)数达到2.89亿台。如何高效的接入和管理这么多设备,是米家App一直在探索的问题。我们希望通过米家插件来解决这个问题,下面将分享米家插件平台在研发过程中的一些探索和实践。
1
米家APP介绍
米家App是一个智能硬件管理平台,不仅连接小米及生态链公司的智能产品,同时也开放接入第三方智能硬件,为用户提供智能生活整体解决方案。用户可以简单便捷地通过手机与智能硬件交互,并实现智能硬件之间的互联互通。一键实现个性化定制的智能场景,与家人朋友分享智能设备。
2
什么是米家插件
米家插件是用户在米家App中用来控制设备的一段小程序。每个设备都有其相对应的插件,由开发者(通常是设备厂商)负责开发,测试,发布与维护。下面是一个灯组插件主要界面的截图。
米家插件基于小米研发的插件框架开发。插件框架是米家为支持插件开发而提供的JavaScript接口的集合,赋予了开发者开发/调试/运行插件的能力。接入小米IoT平台的智能硬件,米家App正是通过米家插件来控制和管理设备的。
2.1 米家插件发展史
随着小米IoT业务的快速发展,米家插件也经历了三个阶段:Native插件阶段、ReactNative插件(简称RN插件)阶段、公版插件阶段。
Native插件阶段
在小米IoT业务早期,接入米家生态的智能设备还不多,这个阶段的插件都是Native插件,开发者需要基于iOS和Android分别开发插件,然后米家集成插件代码(Android可以动态下载)。随着小米IoT业务的快速发展,米家APP的安装包体积快速增长,代码维护困难,迫切需要一套支持动态化的插件方案。
RN插件阶段
随着IoT业务的快速发展,Native插件的弊端越来越明显。为了适应业务的发展,米家对新一代的插件方案要求是支持动态化和跨平台。2018年我们开始着手下一代插件方案的研究,结合用户体验和开发维护成本,最终我们选择基于ReactNative搭建一套插件框架,以帮助开发者快速开发米家插件。基于RN的插件框架,插件开发语言统一为JavaScript,开发者只需要一套RN插件代码,便可运行在iOS和Android双平台上,极大的减轻了开发者的开发成本。
公版插件阶段
为了进一步降低开发成本,米家启动了公版插件的研发工作。公版插件是由米家开发,支持开发者做一些个性化配置并且可以免费使用的通用插件。正如其名,某个品类的公版插件可以用来控制该品类的所有设备。目前,米家已经提供了如空气净化器、灯、电暖器、浴霸、风扇...等多个品类的公版插件。开发者在没太多自定义需求的时候,使用公版插件可以零成本接入米家。后续我们会推出更多品类的公版插件,以及更多的定制化能力支持。现阶段,公版插件也是基于RN开发,不管后面米家的插件框架如何迭代升级,使用公版插件的开发者将省去很多维护工作。
2.2 RN插件的优势
RN在Facebook官方支持和广大社区推动下,发展非常迅速。从2015.04月发布第1个版本开始,截止到2020.11月,在Github累计发布351个版本,共收到91.9k份Star。鉴于RN具有的各种优越性,米家App选择基于RN开发插件框架。相比Native插件,RN插件有很多优势:
跨平台
RN开发的应用大多用于iOS和Android平台,但通过众多开发者和社区的支持,也可用于PC、Web等平台。
可快速迭代
RN插件在使用感受上和用Objecttive-C(OC)或Java编写的应用相比几乎无法区分。RN插件可以快速迭代开发,比起传统原生应用漫长的编译过程,插件开发者可以在瞬间刷新插件,实时预览插件UI效果。
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插件、公版插件、插件开发环境和插件发布环境。涉及插件开发、调试、发布各个环节。
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里面去,不仅可以减少插件包的大小,对于减少插件的打开时间也有帮助。
RN-SDK封装了米家提供的设备管理能力、网络通信、存储、蓝牙、WiFi、红外、视频、音频、固件更新、UI组件库等。开发者可基于该SDK开发富有差异性的业务功能。UI组件库提供的各种控件,经过精心设计,不仅样式精美,而且对深色模式、无障碍、大字体等都做了适配,使用起来非常方便。如下图展示了UI组件库里面提供的一些常用的控件。
如果有些功能在RN-SDK里不提供,React生态也有很丰富的开源的三方库,开发者可以很方便的引入到插件使用。
3.3 插件开发与调试
为了降低插件的开发难度,米家提供了一系列的工具帮助开发者快速上手插件开发。
一键安装插件开发环境
通过运行我们的脚本程序,开发者可以快速安装插件开发所需要的各种依赖,即使是从没用过RN开发的开发者都可以快速完成环境的搭建。
丰富的代码模板
这些代码模板把相应设备需要的基本功能都已经开发好,开发者只需把相关参数修改一下即可完成基本的开发。常见的WiFi设备、蓝牙设备,米家都有提供对应的插件模板,开发者可根据硬件产品的联网方式、开发能力选择使用对应的模板。
UI实时预览
插件开发过程中,开发者可以通过米家APP随时调试功能是否正常,UI是否符合设计预期。
扫码调试
为了进一步简化调试设置,米家RN插件已经支持扫码调试,开发者运行我们提供的npm指令,然后即可扫描调试,省去了很多设置步骤。
如果这些工具还不能解决开发者的问题,我们还有一个工单系统。开发者可以给我们提工单反馈问题,每个工单都会有工程师来跟进,直到问题解决。
3.4 发布插件
开发者完成插件开发后,将代码打包发布到小米IoT管理平台,通过米家测试后,即可上线发布。在Iot管理平台,开发者可以随时查看发布后的活跃用户、质量指标、用户反馈等多个维度的数据指标。
3.5 公版插件
为了提高厂商的接入效率,减少插件的开发成本,提升插件质量和用户体验,米家启动了公版插件的研发。公版插件是由米家开发,厂商可以免费使用的米家插件。以空气净化器为例,公版插件是米家综合考虑市场上主流的空气净化器的产品功能后,设计出来的一款可以适用于大多数空气净化器的插件。当然,提供给每个厂商的公版插件并不都是完全一样的,公版插件具备哪些功能还跟设备的instance(基于MIoT-Spec协议编写的定义设备功能的文件)有关。目前,米家提供了如空气净化器、灯、电暖器、浴霸、风扇等多个品类的公版插件,后续我们会推出更多品类的公版插件。下面是空气净化器的公版插件截图,公版插件也是使用RN来发开发的,对于用户来说使用上没有本质的区别。
考虑到厂商可能想做一些有差异性的功能,公版插件也支持一些定制化的能力。公版插件是基于厂商的需求生成配置文件,然后根据配置文件态生成相关的代码,以满厂商的定制化需求。
目前,我们正在开发公版插件可视化系统,厂商可以根据自己的需求独立地定制公版插件。在可视化系统里面,厂商不仅可以调整文字显示、界面布局等,还可以按照自己的想法去设计每个功能应该以何种样式展示出来,定制功能的交互方式。
对于开发能力不强的厂商,使用公版插件可以保证用户有一个良好的使用体验;对于那些自己开发插件的厂商,使用公版插件可以降低成本,缩短接入时间,让产品尽快上市。
截止2020年底,已经有上百家厂商在使用公版插件。相比厂商自研插件需要多次验收才能通过米家测试,公版插件大多一次验收就能通过测试;从后台统计的到插件crash率来看,公版插件的crash率相比厂商自研插件减少了80%,稳定性更好;相比自研一款插件需要动辄3-4周的开发时间,使用公版插件只需要在IoT平台花几分钟简单配置一下即可自动生成,真正的实现了零成本接入。
4
插件监控运维
插件发布后,运维是非常重要的一项工作。做好运维工作离不开好的运维工具的支持,米家提供的监控运维可以分为平台运维和开发者运维两部分。
平台运维可以分为发布运维、业务监控和质量监控。
发布运维:RN-SDK灰度/上线/下线、插件灰度/上线/下线、下发配置等;
业务监控:用户活跃统计、API调用热度分布、新功能的使用情况等;
质量监控:插件启动成功率、插件启动耗时、API执行成功率和耗时、米家后台服务监控、插件crash统计等。
开发者可使用的运维工具集中在IoT管理平台,在这里开发者可以创建插件、调试插件功能、发布插件、用户画像、插件质量指标、查看用户反馈、crash日志等。
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慢节点监控及处理