Flutter技术解析与实战——闲鱼技术演进与创新-第1章(5)

本文涉及的产品
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: 本书将详细讲解闲鱼Flutter&FaaS云端一体化架构,以及闲鱼基于Flutter的架构演进与创新,学习一套全面的Flutter架构应用方案。本书介绍闲鱼技术团队利用Flutter技术改造和上线复杂业务的混合工程改造实践,抽取Flutter依赖到远程的实现细节,以及使用Plugin桥接获取设备信息、使用基础网络库等混合开发实践指南。这些实践遍布闲鱼各大业务线和应用场景,为读者使用Flutter打造自己的研发体系探索一条实践之路。除了介绍闲鱼Flutter应用框架Fish Redux、开发利器AspectD、FlutterBoost等一众开源工具与开发实践指南,你还将在......

1.2.3 方案的制定

1.两种模式

      首先将Native 工程处于独立目录环境下称为Standalone 模式,处于Flutter 目录下称为Flutter 模式。纯Native 开发或平台打包就处于Standalone模式,Flutter 对开发人员和打包平台来说是透明的,不会影响构建与调试。而Flutter 的代码则在Flutter 模式下进行开发,其相关库的生成、编译和调试都执行Flutter 定义的流程,如图1-13 所示。

10.jpg

图1-13 两种工程模式

2.厘清依赖

      从模式的定义来看,既然改造的核心就是把Standalone 模式提取出来,那么就要厘清Standalone 模式对Flutter 的依赖,并将其提取成第三方的库、资源或源码文件。以iOS 为例,通过阅读Flutter 构建的源码,可知Xcode工程对Flutter 有如下依赖:

      1)App.framework:Dart 业务源码相关文件。

      2)Flutter.framework:Flutter 引擎库文件。

      3)pubs 插件目录及用于索引的文件:Flutter 下的插件,包括各种系统的插件和自定义的channels(桥接通道)

      4)flutter_assets:Flutter 依赖的静态资源,如字体和图片等。

3.依赖引入的策略

      在改造过程中,闲鱼尝试过两种依赖引入策略,下面分别进行阐述。

(1)本地依赖。通过修改Flutter 构建流程,将其库文件、源码和资源直接放置到Native 工程的子目录中进行引用,以iOS 为例,就是将Flutter.framework 及相关插件等做成本地的Pod 依赖,也将资源复制到本地进行维护。由此,Standalone 模式便具备了独立构建和执行的能力,对于纯Native 开发人员来说,Flutter 只是一些二方库与资源的合集,无须关注。而在Flutter 模式下,Dart 源码的构建流程不变,不影响编译和调试。同时,由于是本地依赖,在Flutter 模式下的各种改动也可以实时地同步到Native 工程的子目录中。提交修改后,Standalone 模式也就拥有了最新的Flutter 相关功能。

      优点:将Flutter 相关内容的改动同步到Standalone 模式也比较方便;

      缺点:需要对Flutter 原有的构造流程进行稍复杂的改动,并且与后续的Flutter 代码合并会有冲突,且Native 工程与Flutter 的代码、库及资源等内容还是耦合在本地,不够独立。

      (2)远程依赖。远程依赖的想法是将Flutter 所有依赖内容都放在独立的远端仓库中,在Standalone 模式下引用远程仓库中的相关资源、源码和库文件,在Flutter 模式下的构建流程和引用方式不变,如图1-14 所示。

优点:对Flutter 自身的构建流程改动较少,较彻底地解决了本地耦合的问题。

 缺点:同步的流程变得更烦琐,Flutter 内容的变动需要先同步到远程仓库后再同步到Standalone 模式方能生效。

14.jpg

图1-14

1.2.4 改造的实现过程

1.目录的组织

      在Flutter 模式下,父工程目录下的iOS 和Android 的子目录分别包含对应的Native 工程。在代码管理上,子工程可以使用Git 的Submodule 形式,保证目录间的独立。

2.远程依赖的实现

      在Standalone 模式下,Flutter 的依赖内容都指向远程仓库中的对应文件,而在Flutter 模式下依赖的方式不变。

      (1)向Standalone 模式同步Flutter 的变更。由于远程依赖的问题是同步变动比较麻烦,为此闲鱼开发了一系列脚本工具,使该过程尽量自动完成。假设Flutter 的内容(可能是业务源码、引擎库或某些资源文件)发生变化,那么在Flutter 模式下构建结束后,脚本会提取生成好的所有依赖文件并将其复制到远程仓库,提交并打标签,然后依据打出的标签生成新的远程依赖说明(如iOS 下的podspec 文件),最后在Standalone 模式下将Flutter 的依赖修改至最新的版本,从而完成整个同步过程,如图1-15 所示。

15.jpg

图1-15

      (2)同步的时机

      建议在提测及灰度期间,每次Flutter 业务的提交都能够触发同步脚本的执行和App 打包;在开发期间,保持每日一次的同步即可。

      为解决引入Flutter 后的工程适配问题,闲鱼抽取了Flutter 的相关依赖放到远程供纯Native 工程进行引用,从而保证了Flutter 与纯Native 开发的相互独立与并行执行。

      该方案已在闲鱼施行了几个版本,并反向输出给了Flutter 团队,为其后续的hybrid 工程组织计划提供了方向和参考。同时,相信该方案也可以为转型Flutter 的团队提供帮助,虽然项目间的差异也会导致方案的不同,但是实施的思路依然有借鉴价值。

目录
打赏
0
0
0
0
28
分享
相关文章
AI技术深度解析:从基础到应用的全面介绍
人工智能(AI)技术的迅猛发展,正在深刻改变着我们的生活和工作方式。从自然语言处理(NLP)到机器学习,从神经网络到大型语言模型(LLM),AI技术的每一次进步都带来了前所未有的机遇和挑战。本文将从背景、历史、业务场景、Python代码示例、流程图以及如何上手等多个方面,对AI技术中的关键组件进行深度解析,为读者呈现一个全面而深入的AI技术世界。
287 10
DeepSeek技术报告解析:为什么DeepSeek-R1 可以用低成本训练出高效的模型
DeepSeek-R1 通过创新的训练策略实现了显著的成本降低,同时保持了卓越的模型性能。本文将详细分析其核心训练方法。
485 11
DeepSeek技术报告解析:为什么DeepSeek-R1 可以用低成本训练出高效的模型
保单AI识别技术及代码示例解析
车险保单包含基础信息、车辆信息、人员信息、保险条款及特别约定等关键内容。AI识别技术通过OCR、文档结构化解析和数据校验,实现对保单信息的精准提取。然而,版式多样性、信息复杂性、图像质量和法律术语解析是主要挑战。Python代码示例展示了如何使用PaddleOCR进行保单信息抽取,并提出了定制化训练、版式分析等优化方向。典型应用场景包括智能录入、快速核保、理赔自动化等。未来将向多模态融合、自适应学习和跨区域兼容性发展。
DeepSeek模型的突破:性能超越R1满血版的关键技术解析
上海AI实验室周伯文团队的最新研究显示,7B版本的DeepSeek模型在性能上超越了R1满血版。该成果强调了计算最优Test-Time Scaling的重要性,并提出了一种创新的“弱到强”优化监督机制的研究思路,区别于传统的“从强到弱”策略。这一方法不仅提升了模型性能,还为未来AI研究提供了新方向。
437 5
深度干货 如何兼顾性能与可靠性?一文解析YashanDB主备高可用技术
数据库高可用(High Availability,HA)是指在系统遇到故障或异常情况时,能够自动快速地恢复并保持服务可用性的能力。如果数据库只有一个实例,该实例所在的服务器一旦发生故障,那就很难在短时间内恢复服务。长时间的服务中断会造成很大的损失,因此数据库高可用一般通过多实例副本冗余实现,如果一个实例发生故障,则可以将业务转移到另一个实例,快速恢复服务。
深度干货  如何兼顾性能与可靠性?一文解析YashanDB主备高可用技术
智能文件解析:体验阿里云多模态信息提取解决方案
在当今数据驱动的时代,信息的获取和处理效率直接影响着企业决策的速度和质量。然而,面对日益多样化的文件格式(文本、图像、音频、视频),传统的处理方法显然已经无法满足需求。
106 4
智能文件解析:体验阿里云多模态信息提取解决方案
鸿蒙Flutter实战:14-现有Flutter 项目支持鸿蒙 II
本文介绍了如何将现有 Flutter 项目适配鸿蒙系统,详细步骤包括安装 FVM、使用 FVM 安装 Flutter SDK、搭建开发环境、创建项目架构和壳工程等。
343 4
鸿蒙Flutter实战:14-现有Flutter 项目支持鸿蒙 II
入门级容器技术解析:Docker和K8s的区别与关系
本文介绍了容器技术的发展历程及其重要组成部分Docker和Kubernetes。从传统物理机到虚拟机,再到容器化,每一步都旨在更高效地利用服务器资源并简化应用部署。容器技术通过隔离环境、减少依赖冲突和提高可移植性,解决了传统部署方式中的诸多问题。Docker作为容器化平台,专注于创建和管理容器;而Kubernetes则是一个强大的容器编排系统,用于自动化部署、扩展和管理容器化应用。两者相辅相成,共同推动了现代云原生应用的快速发展。
253 11

推荐镜像

更多
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等