京东技术中台的Flutter实践之路

  • 时间:
  • 浏览:1

我觉得京东很早就时候结束研究并实践跨端的开发外理方案,最早使用的是Hybrid App的技术方案,从2015年低时候结束逐步转向RN技术栈,目前应该是业内RN技术平台应用最广泛、配套设施比较完善的公司之一。从2018年中时候结束,朋友也关注到了Flutter技术,最吸引朋友的型态是高性能和兼容性。这两点也是目前RN技术相对匮乏的地方。高性能指的是多样化场景和交互下的渲染性能,兼容性指的是不同终端平台上的布局和体验的一致性,这点在碎片化严重的android平台上尤其重要。

Flutter开发中使用的组件,一般公司内部人员会采用共享的法律法子,以外理重复开发,而Flutter组件共享,即可能不能使用pub仓库。将会公司内部人员的业务组件不适合上传到pub官方仓库,过多,可能不能搭建私服仓库,以外理各个业务研发团队,对Flutter组件共享可能不能。感兴趣的同学可能不能研究下官方pub仓库的源码 http://pub.dartlang.org/,其对Google Cloud 环境有很大的依赖 , 也可能不能基于https://github.com/kahnsen/pub_server来搭建一俩个多简易版本的私服仓库,以满足上传和下载功能,pub协议相对比较简单,朋友可能不能在源码增加协议接口来实现更多功能。运行pub_server

Flutter组件的依赖配置,在项目的pubspec.yaml中dependencies:下增加如下信息:

大每项跨端框架,诸如React Native / Weex / H5等,基本都能做到随时进行热修复,并随时上线,用于及时修复突发的在线什么的问题,架构非常灵活。Flutter因其AOT的设计,预想会不能自己达到过多灵活度,但技术上仍具有一定的可行性,正如朋友在如此 的Flutter介绍文章中提到的,按照先有的API设计,是可能不能支持热修复的,但仅限于Android。官方最新的架构上将会支持了热修复架构,朋友可能不能更新到1.2.1版本查看,过多官方的功能还比较弱,无法做到版本控制和回滚的灵活性,过多 JDFlutter并如此采用。朋友可能不能首先并肩看一下Google官方热修复方案的设计原理:Flutter1.2.1 版本引入了 Dynamic Patch

可能不能看多主体代码集中在asset目录中,除此之外还有絮状Android端的框架java代码及flutter so引擎库外:

3、isolate_snapshot_instr

2、isolate_snapshot_data

其中 res_timestamp 文件用于标记过多时间戳,算法比较固定,根据客户端的安装时间及 app 的 version code 生成,也只要说当用户打开 Flutter 页面后过多值只要固定的,将会有任何修改引擎会默认有变化,删除现有 app_flutter 的包,重新解压

打开http://127.0.0.1:54422可能不能查看调试信息,如有代码改动可能不能按r来实时同步界面,将会改动如此实时生效可能不能按R重新启动Flutter应用。

里边过多实验,验证了方案基本是可行的,但这里只要简单替换,实际使用中替换还是有过多 什么的问题的。那 Google 官方是怎样才能设计的呢?

创建flutter module

为了更清楚的了解官方热修复的原理和过程,朋友可能不能首先深入了解Flutter的业务包型态和整体运行过程:

在原生根项目的settings.gradle加入如下配置信息

如此 就可能不能原生项目并肩编译了。具体可能不能参照官方文档:http://github.com/flutter/flu…如此 的法律法子虽可能不能满足混编需求,但还就有很糙方便,开发完项目后,还可能不能去Android Studio项目中进行编译,比较麻烦,过多 朋友也可能不能把Flutter项目settings.gradle改造,在Flutter开发环境下直接运行含有原生代码的混合项目,改造法律法子如下

可能不能看多该初始化是要求在主线程池完成的,另外主要完成了以下三点:

执行完命令就有进行等待英文设备连接清况 ,过多打开宿主App,进入Flutter页面,看多如下信息提示则表示同步成功

文章上每项介绍了为何打开升级patch的功能,因升级涉及到服务端,那Google是为何做到关联到服务器的呢?我觉得原理比较简单,可能不能配置客户端的manifest文件的meta属性,增加PatchServerURL,也只要朋友服务的地址,以及下载模式PatchDownloadMode和加载模式PatchInstallMode,默认是ON_NEXT_RESTART(下次初始化时)

JDFlutter为业务研发团队提供了全流程的开发外理方案:

随着2018年底Google正式发布了Flutter预览版本,京东内部人员也过多的研发团队有用Flutter进行开发业务的诉求。朋友正式启动研发并内部人员发布了JDFlutter引擎。在官方Flutter引擎之上,朋友做了额外的优化和功能扩展:

在Flutter IDE中编译代码调试会很方便,直接点击debug按钮即可进行代码调试,将会是混合工程在Android studio将会xcode中运行的工程,则如此律法子如此做,但也可能不能实现调试:将要调试的App安里装手机中(安装debug版本),连接电脑,执行如下命令,同步Flutter代码到设备的宿主App中

将会有你能不能上传的文件,可能不能在根目录增加一俩个多.gitignore文件来忽略如下:

如此 可能不能在公司内部人员实现Flutter组件共享,将会你能不能搭建我本人的pub仓库,也可能不能采用git依赖,配置如下:

JDFlutter整体的框架型态,主要含有:基础框架、组件、工具三每项,如图所示:

Flutter和原生混合开发有四种 清况 ,其一,开发Flutter业务的同学,可能不能和原生做交互,过多可能不能有Flutter和原生的混合编译环境;其二,使用原生SDK开发业务的同学,可能不能和Flutter业务并肩集成打包,此可能不能对Flutter透明,以减少对Flutter编译环境的依赖,过多,只依赖原生编译环境即可,此时朋友将Flutter编译成aar依赖,倒进原生项目中即可。接下来,朋友将重点介绍Android和iOS的混合编译环境配置。

如此 改造如此 即可在Flutter IDE中直接编译Flutter混合工程,并进行调试,也可能不能运行futter run来启动Flutter混合工程,不过在配置的如此 ,可能不能注意Flutter中 gradle编译环境和原生编译环境的一致性,将会不一致将会会意味着 编译错误。

升级后及时更新页面:现有方案(包括标准google升级方案)如此法律法子做到下载业务包将会替换业务包后及时刷新页面,可能不能restart线程池后重新开启能不能刷新页面。未来朋友会优化引擎,通过释放底层资源并重新加载,来完成随时刷新页面的功能。

目前京东商城、京东视频、京东到家、京东物流、7Fresh等APP就有业务采用JDFlutter进行开发。

了解了那先 ,我觉得热修复方案将会呼之欲出,替换原有解压后的app_flutter包,杀线程池,过多重新加载Flutter页面即可。这里朋友可能不能做个简单的实验:采用adb命令push过多修改过的并编译的dart代码到app_flutter目录:

1、icudtl.dat

进入iOS工程目录,初始化pod环境(将会项目工程将会使用Cocoapods,跳过此步骤)

发布一俩个多Flutter组件可能不能修改 pubspec.yaml,增加以下内容:

打开工程(*.xcworkspace) 配置build phase,为编译Dart 代码加进编译选项打开iOS项目,选中项目的Build Phases选项,点击左上角+号按钮,选泽New Run Script Phase,将下面的shell脚本加进到输入框中:

创建一俩个多flutter module

JDFlutter基础框架分为三层架构,含有JDFlutter基础层,通用业务层,业务层。

上传时可能不能使用如下命令检查代码错误,并显示出上传的目录型态。

以下是升级包的大约路径如下:

Google Flutter是非常出色的跨端开发技术,现在将会取得了长足的发展。社区生态和框架心智心智性性心智心智成熟 是什么度也正在快速追赶RN。相信不久的将来,Flutter+RN就有成为跨端开发平台的绝代双骄。

原创:京东云技术新知 

原文链接:https://www.cnblogs.com/jdclouddeveloper/p/11691543.html

编辑Podfile文件

Flutter SDK 1.2.1中,Google提供了ResourceUpdater,用来做包的检查和下载解压。升级步骤如下:

JDFlutter的整体实现原理,我觉得和Google是一样的,目前来看不修改引擎的前提下,不到过多方案最简单,过多朋友如此使用Google的这套升级架构,默认关闭了patch功能,并框架之外实现了替换包和加载的逻辑,优点是整体兼容性更强、更灵活。1、服务端根据客户端的唯一标识支持了白名单和灰度分类整理升级包;2、优化下载和替换流程。Flutter的升级包一般有4-5M,过多从网络端获取,失败率较高,替换过程又涉及到文件操作,操作不当容易产生UI阻塞将会包异常。接入JDFlutter的客户端下载包后,过多会直接替换文件,只要修改名称后解压到app_flutter目录,等待英文业务页面重新打开将会重新初始化时再修改成Flutter标准名称的文件。过多操作不所处性能什么的问题,另外会把旧版的文件备份,以便回滚代码;3、并肩并发运行的Flutter页面较多,需外理将会升级经常出现过多里边清况 ,使得业务将会页面无法打开的清况 ;4、升级失败将会下载后业务包有什么的问题,经常出现无法加载的清况 将会文件丢失的清况 可能不能控制回滚代码;5、线上经常出现絮状异常后,可能不能指定对应的Flutter业务执行降级策略,让该业务好快降级到H5页面。

从逻辑上来看,不到在页面 onResume 将会 App 重新开启的以就有下载升级包,整体下载是通过 http 请求完成的,整体实现代码朋友可能不能参考 ResourceUpdater 中 DownloadTask 的实现每项,这里就不细说了。

Flutter页面启动时是怎样才能加载那先 代码的呢?那就要从Flutter的初始化说起了,在页面启动前可能不能调用FlutterMain.startInitialization来做初始化:

从代码来看,先增加要解压的核心库的目录,过多启动 task 从 asset 中解压库到 data 分区对应 app 数据下的 app_flutter 目录,以下是解压后的目录型态:

里边是对Flutter线程池加载的分析,最终Flutter页面显示是可能不能呈现在原生组件Flutter View中的,过多组件会和底层Flutter Native View 进行绑定,并最终运行里边说到的data分区的Dart代码来渲染UI。将会使用的是Flutter Activity,则默认Flutter View是全屏显示,怎样才能不能不能定制页面,可能不能我本人设计Activity。

安装pod

flutter create -t module --org com.example my_flutter

在原生App模块中加入flutter依赖

在 2019 年,Flutter 推出了多个正式版本,支持的终端过多,使用的项目也过多。Flutter 正在经历从小范围尝鲜到大面积应用的过程,过多的研发团队加入到 Flutter 的学习热潮中,京东作为互联网大厂之一也积极参与了 Flutter 的跨端方案研究。本文将介绍京东在 Flutter 上的应用方案和相关优化成果。

未来,JDFlutter会继续在热修复方面进行探索和验证,以满足京东业务的快速发展可能不能。而针对目前的方案,朋友思考了如下的优化点:Flutter业务包差量升级:现有的升级模式就有全量包覆盖,即使压缩后升级包还是很大,影响升级成功率及用户流量,后续会采用过多diff工具,对比生成差量的patch,通过服务端分类整理后,在客户端合并成删改包,但升级次数较多就有意味着 最终版本碎片化,可能不能做好版本如此 的维护关系,难度较大。