首页 > 架构设计 > 软件结构 > 京东技术中台Flutter实践之路(二)


我们的目标:解决实战开发问题,打造畅快开发体验,共建Flutter生态。


02 动态化
动态化作为顺应业务高速发展及低成本试错,实现灵活高效发版和更新的重要手段,近年来显得尤为重要,甚至成为了衡量移动端框架优劣的核心指标,RN、小程序等之所以能被大规模使用,也和支持动态更新,无需发版安装有着一定的关系。
Flutter本身在跨平台和性能方面都表现卓越,但是由于苹果对于动态代码执行的限制,导致Flutter无法实现iOS端的动态化,这可能是它的不足之处(主要是苹果的政策原因和技术无关)。经过我们的调研,目前市场上动态化实现的方式有两种,一种是以Dart作为DSL动态下发的方式来实现布局的动态化,另外一种是用JS来开发UI生成描述信息,最终由Flutter进行渲染。 JDFlutter在动态化方面也做了一些探索尝试,我们的目标是采用Flutter环境进行开发调试,使用动态化框架开发出来的代码既能动态化运行,也能在Flutter原生环境中运行,同时不入侵Flutter的底层框架,对Flutter sdk升级保持很好的兼容性。 本文简单阐述实现思路,后续将单独介绍具体的实现方法。 使用Flutter开发环境进行开发和调试程序,发布时采用dart2js技术将Flutter代码转换成js代码,发布到服务端,然后由Flutter容器从服务端下载代码,执行js逻辑,将js渲染的布局信息,传递到Flutter层,最终由Flutter渲染出来。
03 模块注入
我们在JDFlutter封装了一套应用开发所需的基础模块:包含网络,图片,异常,埋点,性能,设备,扫码,视频等业务开发所需模块,模块分为两种类型,一种是基于纯dart开发的模块,另外一种是基于native封装的模块。根据不同的编译产物我们会注入不同类型的模块来满足不同运行平台的需求,如编译成web产物,会注入纯dart的网络模块来代替封装的native模块。
04 Flutter2Web
体量及规模庞大的线上业务活动,在巨大流量冲击下,可能会面临宕机的风险,类似情况,服务端普遍会通过如集群扩容、多机房部署、限流、削峰、降级兜底等预案进行部署。同样,移动端上线新业务,在未经过大规模验证的情况下,也可能在个别场景出现异常,需要考虑兜底方案,以减少线上事故的发生。
此时除了动态化修复更新之外,我们使用了Flutter2web工具将Flutter业务转换成H5,用于降级容灾。JDFlutter容器抹平了native和web的API,在代码不用做改动的情况下,支持将Flutter应用转换web应用,运行在JDFlutter的webview中,并提供js channel的支持,web依然可以调用原生能力。
05 iOS瘦身
Flutter打出的ipa包一般会比较大,先期京东APP上线的6个Flutter业务集成后,致使iOS客户端增加了约17M。为了减少包大小,我们借鉴了字节跳动的做法,对引擎做了改造,将App.framework和Flutter.framwork的部分数据通过动态下发的方式来实现,同时剥离了资源文件。改造之后,对Flutter业务进行再次打包测试,包体积可减少约28%左右,瘦身效果明显,且随着业务数量的增加,瘦身的效果及收益会更为显著,以下是瘦身方案,后续关于iOS瘦身,也会做详细的分享。

06 混合开发
Flutter与原生的混合开发有两种情况,其一,开发 Flutter 业务的同学,需要和原生做交互,因此需要有 Flutter 和原生的混合编译环境;其二,使用原生 SDK 开发业务的同学,需要和 Flutter 业务一起集成打包,但对 Flutter 透明,无需编译Flutter的代码,以减少对 Flutter 编译环境的依赖,我们将Flutter 编译成 aar 或framework,放入原生项目中即可,以下为JDFlutter混合开发的流程介绍。

07 多团队基于容器的开发方式
容器提供了一套完整的运行环境,实现了业务组件解耦,每个业务都可以独立编译,运行,调试,待到发布时再集成主客户端,业务集成时可通过线上自动完成,这样好处上文已说明,可减少业务组件之间的交叉依赖,同时也可以提升编译调试效率。

08 Pub仓库
前一篇实践文章中分享了Pub仓库的搭建过程,2020年初京东pub仓库做了深度的定制,除了满足基础组件上传和下载功能依赖,还增加了账户认证,权限管理,组件收藏,文档,社区等功能,来完善京东Flutter的内部生态,打造更好的技术氛围,当前内部共享的组件数量已达上百个,还在不断增加中,后续我们也会将优质组件开放出来,贡献给外部社区,帮助外部的小伙伴更好地完成Flutter基础建设。

09 JDFlutter全流程支持
为了让业务开发者开发能够更方便快捷地接入的容器sdk,JDFlutter提供了配套的开发工具让用户可以一键创建工程,git仓库,配置依赖的容器sdk和工程的初始化模版代码来简化开发者的工作量,同时支持热更新与灰度发布,Flutter插件发布,在线打包,异常监控,容灾降级等一站式的服务,提供了全流程的支持。


欢迎加入JDFlutter技术专区探讨交流。
QQ群:1022619726

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/69912185/viewspace-2725936/ ,如需转载,请注明出处,否则将追究法律责任。