闲鱼对Flutter-Native混合工程解耦的探索

简介: 分手快乐,祝你快乐~

作者:祈晴

1. 闲鱼Flutter现状

闲鱼是第一个使用Flutter混合开发的大型应用,但闲鱼客户端开发最深入体会的痛点就是编译时长影响开发体验。在Flutter+Native这种开发模式下,Native编译速度慢,模块开发无法突破。闲鱼集成了集团众多中间件,很多功能无法通过flutter直接调用,需使用各种channel到native去调用对应功能。总而言之,闲鱼目前Flutter开发面临如下几个痛点:

  • Flutter侧混合编译速度慢,Android首次编译10min+,iOS首次编译20min+
  • 混合栈编程中历史包袱导致IOS/Android双端返回给Flutter侧的数据可能存在不一致性
  • 集成模块开发效率相比模块开发较低,单模块页面测试性能数据无法展开;

2.解决方案一

2.1方案概述

此项目从立项至今已经很长一段时间,由于业务迭代快,native插件满天飞情况下,想要做到工程模块化拆分难度可想而知;如下图是项目立项为模块化拆分,业务方需要将各个业务拆分解耦合,拆分集团中间件,业务封装组件,Native业务代码,Flutter桥代码,Flutter组件库,Flutter侧业务代码等多个模块;项目初衷就是整理代码,提供一个Flutter可运行的干净环境,同时需要让flutter可以获取到native几乎所有能力,但是编译开发调试时候有想要速度快,效率高。能想到的最直接解决方案就是拆包,从0-1建立一个最小壳工程,然后拆分集团基本中间件,封装业务组件,Flutter插件等,如下是整个项目架构:
undefined

日常模块化单页面级需要使用最小壳工程,其内部又channel的声明和实现,通过运行最小壳工程运行得到结果,Flutter侧模块开发通过IOC调用到最小壳工程的channel得到返回结果,最后将模块化开发以一种pub或者git依赖方式集成到闲鱼FWN主工程即可;

2.2 阶段性产出

业务模块化拆分从来都是一种吃力不讨好的活,明知道拆出来有收益,但是投入产出比不足,因此历史包袱代码越来越厚重,以至于下一个接收的人都不敢轻易修改代码;在模块化拆分时候,开始项目时候提出过新起一个干净的工程,然后一步步拆分集团中间件,期间拆出了Mtop/Login/FlutterBoost/UI Plugin,耗时3周/2人,得到部分结果就是新业务,新界面开发满足基本快速迭代开发,缺点也很明显如下所示:

  • 拆分梳理Native的中间件繁琐,工作量巨大,最小化壳工程耗时3周/2人
  • 推动业务方拆分基础组件库更难,目前项目进展不顺
  • 维护成本高,拆分壳工程运行结果和主工程可能不一致
  • 业务迫切其结果,但投入产出比不足,比如Flutter单页面性能测试,Flutter侧模块化拆分,Fass工程一体基石

3.解决方案二

3.1 换位思考

(1)若自己是业务方,需要为Flutter侧去拆分包,去构建一个最小化壳工程,其成本是巨大的。
(2)Fass工程一体化依赖一个最小化壳工程的Native运行环境去运行Flutter侧代码,可是并非所有的业务方都会提供一个最小化壳工程去运行Fass,那么Fass工程一体化/模块开发如果在集团其他运行环境下进展?
(3)最小化壳工程运行环境无法紧跟Native侧的各种版本,会导致运行结果不一致情况下也不敢随便使用;

如果解决此问题呢?个人提出过跨进程实现方式,在Android端侧跨进程调用实现方式一直很常见的场景,client访问server得结果,而Flutter侧和Native侧不就是client和server双端么?如下图所示,其实Flutter获取数据就是通过MethodChannel/EventChannel获取,因此可以换一种方式思考?
undefined

3.2 IPC跨进程通信,Android Binder

期间在Android侧我使用过Android Binder去实现,新起一个APP做为壳工程,其内部实现了各种插件去访问主工程服务,获取结果然后返回给壳工程的Flutter调用,但是维护成本依然在;同时iOS侧没有对应的实现机制,因此此方式被抛弃;

3.3 具体方案:Hook代理+Socket服务

Android开发应该都熟悉hook和插件化技术,其实从之前的Flutter到Native的Chanel架构就可以想到一种思路,既然解决不了Native问题,那就解决Channel的问题吧,Native端侧的IPC方式无法实现,换到Flutter侧和Native侧的Channel通信侧去实现IPC吧。参考业务对于插件化hook机制/IPC机制的理解,结合自身对于flutter channel的理解,可以实现一种利用socket服务去hook method channel和event channel实现方式,去代理客户端的method channel和event channel,将处理结果通过socket交给服务端去处理拿到服务端真正的method channel和event channel数据即可,这才是我心中想要的实现方式就是如此,整个架构图如下:

undefined

客户端是一台手机,服务端也是一台手机,服务端跑闲鱼FWN主工程,客户端跑一个干净的Flutter工程;客户端先通过Flutter侧代码去找使用本端有对应的Channel,如果有则使用返回结果,如果没有则通过Socket请求结果到服务端主工程上,主工程根据Socket定义的协议字段去解析然后发起一个channel拿结果,之后通过socket将解决返回给客户端,客户端拿到了socket结果数据后执行想要的渲染方式即可;

或许你有质疑点:比如为什么要用2台手机,使用一台不可以么?
这里我推荐使用2台手机有如下2个原因:
(1)一台手机运行2个APP,如果server在后台可能会导致进程资源被回收,Socket通信中断;
(2)使用2台手机有一个极大好处是,你运行Android的Flutter侧Client代码,但是往往你需要验证Native侧双端Server代码数据,如果客户端手机/服务端手机是2台,只需要改下客户端的IP地址去请求Android手机的Server还是IOS手机的Server就可以验证结果;

3.4 尝试验证

比如如下的method channel代码如下:

Future<T> invokeMethod<T>(String method, [ dynamic arguments ]) async {assert(method != null);final ByteData result = await binaryMessenger.send(name,codec.encodeMethodCall(MethodCall(method, arguments)),);if (result == null) {throw MissingPluginException('No implementation found for method $method on channel $name');}final T typedResult = codec.decodeEnvelope(result);return typedResult;}

修复result == null的场景,如果是我们指定的客户端,则通过socket去拿server数据,重点理解Fish MOD:START到Fish MOD:END代码思想就理解了;

Future<T> invokeMethod<T>(String method, [dynamic arguments]) async {assert(method != null);final ByteData result = await binaryMessenger.send(name,codec.encodeMethodCall(MethodCall(method, arguments)),);if (result == null) {//Fish MOD:START//throw MissingPluginException(//      'No implementation found for method $method on channel $name');//socket从服务端手机获取值final dynamic serverData =await SocketClient.methodDataForClient(clientParams);//Fish MOD:END}final T typedResult = codec.decodeEnvelope(result);return typedResult;}

最后通过此中方式验证了MethodChannel/EventChannel数据正常收发的可行性,后续还需要在业务场景具体实验耕田;

4.结果对比和展望

结果对比:
undefined

无法方案1和方案2最终都可以解决编译运行时长的问题,但方案1在拆分模块和维护模块时候都有很高的成本,运行时长虽然降低了,但是模块化工作量却加大很多,方案2可以完美解决拆分成本和维护成本,但是不足之处就是运行环境苛刻,可操作性不足,其需要2部手机作为运行环境,另针对于一些页面跳转逻辑,可能客户端手机A触发到服务端手机B上,操作性不在同一台手机上;当然方案二虽然有一定缺陷,却可以解决很多问题,因此后续在闲鱼模块化拆分落地项目中,在思考是否有更加完美的解决方法。

 

 

原文链接
本文为阿里云原创内容,未经允许不得转载。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/515113.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

学 Python 最大的 1 个误区,看看你中招了吗?

提起 Python&#xff0c;大家总觉得很简单。但是&#xff0c;能把 Python 用好的人&#xff0c;好像并没多少。随着 Python 火了之后&#xff0c;像“ 3 天带你学会 Python ”、“快速入门到全栈”这样的教程层出不穷。很多讲了一点基础语法后&#xff0c;还没讲 http 协议和异…

Unable to make public jdk.internal.loader.Resource jdk.internal.loader.URLClassPath.getResource(jav

文章目录1. 现象2. 异常截图2. 解决方案3. 执行命令4. 启动日志5. 浏览器效果图1. 现象 执行命令 xjar.exe java -jar unified-access-center-passwd.jar运行 sprinbgboot 打包的jar包报错 具体信息如下&#xff1a; C:\Users\gblfy\Desktop\xJarDir>xjar.exe java -jar…

win10安装go开发环境

文章目录1. 下载软件2. 安装3. 验证1. 下载软件 golang官网&#xff1a;https://golang.google.cn/dl/ 2. 安装 双击go1.19.1.windows-amd64.msi一路下一步 3. 验证 go version

3 张图带你走近蚂蚁mPaaS音视频通话组件

简介&#xff1a; 远程问诊、线上开户、车载语音通话……蚂蚁 mPaaS 正在“拥抱新技术&#xff0c;探索新未来”。 音视频技术的进步&#xff0c;让线上办公不再是一时权宜之计&#xff0c;也使得线上业务的“无接触”开展成为可能。近日&#xff0c;蚂蚁集团推出的移动开发平台…

立即生效!帕特·基辛格卸任 VMware 所有职务

整理 | 苏宓出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09;心无二用&#xff0c;在帕特基辛格&#xff08;Pat Gelsinger&#xff09;成为英特尔新任 CEO 两个月后&#xff0c;他宣布辞去此前的 VMware 首席执行官的职务&#xff0c;全身心地帮助英特尔重建往日的…

云原生应用实现规范 - 初识 Operator

简介&#xff1a; 本文我们将首先了解到 Operator 是什么&#xff0c;之后逐步了解到 Operator 的生态建设&#xff0c;Operator 的关键组件及其基本的工作原理&#xff0c;下面让我们来一探究竟吧。 作者 | 匡大虎、阚俊宝 基于 Kubernetes 平台&#xff0c;我们可以轻松的…

如何基于 K8s 构建下一代 DevOps 平台?

简介&#xff1a; 当前云原生 DevOps 体系现状如何&#xff1f;面临哪些挑战&#xff1f;如何通过 OAM 解决云原生 DevOps 场景下的诸多问题&#xff1f;云原生开发应用模型 OAM(Open Application Model) 社区核心成员孙健波将为大家一一解答&#xff0c;并分享如何基于 OAM 和…

中国电子云发布专属云CECSTACK 以全栈信创赋能千行百业

2021年4月26日&#xff0c;第四届数字中国建设峰会召开之际&#xff0c;中国电子云在福州举办“云可信 创未来——中国电子云全系产品发布暨战略伙伴签约仪式”&#xff0c;重磅发布中国电子云“信创”实践和全栈自主专属云CECSTACK。中国电子副总经理、党组成员陈锡明&#xf…

idea 双击打不开了咋办

文章目录1. 文件内容还原2. 删除以前旧文件3. 删除以前缓存文件1. 文件内容还原 首先检查一下idea64.exe.vmoptions是否有改动 有的话可以把-javaagent的这一行删除&#xff0c;删除后保存再尝试看看能不能打开。 2. 删除以前旧文件 如果还是不行的话我们可以找打开 C:\Us…

使用日志审计查看MaxCompute执行过哪些操作

简介&#xff1a; MaxCompute完整地记录用户的各项操作行为&#xff0c;会自动将操作日志实时投递到ActionTrail中&#xff0c;ActionTrail针对作业&#xff08;Instance&#xff09;、表&#xff08;Table&#xff09;、函数&#xff08;Function&#xff09;、资源&#xff0…

谈“云”色变?近80%企业曾遭受数据泄露

出品 | 《大咖来了》 一边是企业上云这一毋庸置疑的发展趋势&#xff0c;但另一边&#xff0c;云数据泄露事件的频繁&#xff0c;却让不少企业谈“云”色变。 2020年2月&#xff0c;万豪酒店520万客人信息被泄露&#xff0c;英国信息专员办公室(ICO)对其进行了1840万英镑(约1.…

云网络十年:探路者阿里云的理想和坚持

简介&#xff1a; 转载自CSDN&#xff1a;专访阿里云网络产品线负责人&#xff0c;阿里云智能研究员祝顺民&#xff08;花名江鹤&#xff09;和阿里云资深产品专家吴天议。 近日&#xff0c;阿里巴巴发布强劲财季业绩后&#xff0c;高盛、摩根大通等多家机构上调阿里云估值至千…

电商搜索“随便逛逛,想知道大家都在搜什么?现在什么最热门?”

简介&#xff1a; 有时候用户只是随便逛逛&#xff0c;没有明确的搜索意图&#xff0c;如何推荐更多优质查询词&#xff0c;引导其搜索、购买那&#xff1f;本文结合实际案例运用阿里云开放搜索的解决方案实现优化。 案例背景 某O2O电商平台&#xff0c;线下覆盖上百家连锁超…

汇量科技收购热云数据,加速SaaS工具生态布局

4月28日&#xff0c;全球性技术服务平台汇量科技Mobvista(HK.1860)发布公告&#xff0c;宣布将全资收购热云数据——国内领先的第三方移动监测和营销科技公司&#xff0c;总交易对价超过15亿人民币(含现金及股票)。收购完成后&#xff0c;热云数据将作为汇量科技旗下全资子公司…

Fluid: 让大数据和 AI 拥抱云原生的一块重要拼图

简介&#xff1a; 如何驱动大数据、AI 应用在云原生场景下高效运行是一个既有理论意义又具应用价值的重要挑战性问题&#xff0c;为系统化解决相关问题&#xff0c;学术界和工业界密切合作&#xff0c;南京大学 PASALab 副研究员顾荣博士、阿里云容器服务高级技术专家车漾、All…

估值百亿独角兽爱学习教育集团:通过云原生实践与时间赛跑

简介&#xff1a; iiMedia Research&#xff08;艾媒咨询&#xff09;数据显示&#xff0c;在线教育市场规模保持逐年增长的态势&#xff0c;2019年在线教育市场规模已突破4000亿元。在疫情的助推下&#xff0c;在线教育加速渗透&#xff0c;市场空间有望进一步打开&#xff0c…

腾讯云~安装ActiveMQ

文章目录1. docker 构建2. 腾讯云防火墙策略3. 效果图1. docker 构建 docker pull webcenter/activemq mkdir /app/activemq/log -p docker run --nameactivemq \-itd \-p 8161:8161 \-p 61616:61616 \-e ACTIVEMQ_ADMIN_LOGINadmin \-e ACTIVEMQ_ADMIN_PASSWORD123456 \--res…

如何实现一个跨库连表SQL生成器?

简介&#xff1a; 用户只需在前端简单配置下指标&#xff0c;系统即可自动生成大宽表&#xff0c;让用户查询到他所需要的实时数据&#xff0c;数据源支持跨库并支持多种目标介质。这样的数据全局实时可视化如何实现&#xff1f;本文从需求分析开始&#xff0c;分享自动生成SQL…

plsql 设置字体+工具栏图标大小调整

文章目录1. 字体设置2. 工具图标大小1. 字体设置 字体&#xff08;微软雅黑&#xff09;大小&#xff08;10号&#xff09;就可以 各种字体调整 2. 工具图标大小

云原生时代老牌IDC巨头谋求转型,世纪互联成立新品牌“互联科技(NEOLINK)”

编辑 | 宋慧 出品 | CSDN云计算 头图 | 世纪互联全新子品牌战略发布会现场图 4月28日&#xff0c;世纪互联举行2021新品牌战略发布会&#xff0c;正式发布全新子品牌“互联科技”&#xff08;NEOLINK&#xff09;。此次世纪互联整合集团内新零售及第一线事业群、成立新基建IDC…