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

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

1.3.3 iOS 依赖的Flutter 库的抽取

1.iOS 中的Flutter 依赖文件是如何产生的

      执行编译命令“flutter build ios”,最终会执行Flutter 的编译脚本[xcode_backend.sh],而这个脚本主要做了下面几件事:

      获取各种参数,如project_path、target_path、build_mode 等,主要来自Generated.xcconfig 的各种定义。

      删除Flutter 目录下的App.framework 和app.flx。

      对比Flutter/Flutter.framework 与FLUTTER_ROOT/bin/cache/artifacts/engine {artifact_variant}目录下的Flutter.framework,若不相等,则用后者覆盖前者。

      获取生成App.framework 命令所需参数, 包括build_dir 、local_engine_flag、preview_dart_2_flag 和aot_flags。

      生成App.framework , 并将生成的App.framework 和AppFrameworkInfo.plist 拷贝到Xcode 工程的Flutter 目录下。

2.iOS 的Flutter 依赖抽取实现

      编译Flutter 工程,生成App.framework。

echo "===清理flutter 历史编译==="

./flutter/bin/flutter clean

echo "===重新生成plugin 索引==="

./flutter/bin/flutter packages get

echo "===生成App.framework 和flutter_assets==="

./flutter/bin/flutter build ios --release

      将各插件打包为静态库。这里主要有两步:一是将插件打包成二进制库文件,二是将插件的注册入口打包成二进制库文件。

echo "===生成各个插件的二进制库文件==="

cd ios/Pods

#/usr/bin/env xcrun xcodebuild clean

#/usr/bin/env xcrun xcodebuild build -configuration Release

ARCHS='arm64 armv7' BUILD_AOT_ONLY=YES VERBOSE_SCRIPT_LOGGING=YES

-workspace Runner.xcworkspace -scheme Runner BUILD_DIR=../build/ios

-sdk iphoneos

for plugin_name in ${plugin_arr}

do

    echo "生成lib${plugin_name}.a..."

    /usr/bin/env xcrun xcodebuild build -configuration Release

ARCHS='arm64 armv7' -target ${plugin_name}

BUILD_DIR=../../build/ios -sdk iphoneos -quiet

    /usr/bin/env xcrun xcodebuild build -configuration Debug

ARCHS='x86_64' -target ${plugin_name} BUILD_DIR=../../build/ios

-sdk iphonesimulator -quiet

    echo "合并lib${plugin_name}.a..."

    lipo -create

"../../build/ios/Debug-iphonesimulator/${plugin_name}/lib${plugin

_name}.a"

"../../build/ios/Release-iphoneos/${plugin_name}/lib${plugin_name

}.a" -o

"../../build/ios/Release-iphoneos/${plugin_name}/lib${plugin_name

}.a"

done

echo "===生成注册入口的二进制库文件==="

for reg_enter_name in "flutter_plugin_entrance"

"flutter_service_register"

do

    echo "生成lib${reg_enter_name}.a..."

    /usr/bin/env xcrun xcodebuild build -configuration Release

ARCHS='arm64 armv7' -target ${reg_enter_name}

BUILD_DIR=../../build/ios -sdk iphoneos

    /usr/bin/env xcrun xcodebuild build -configuration Debug

ARCHS='x86_64' -target ${reg_enter_name} BUILD_DIR=../../build/ios

-sdk iphonesimulator

    echo "合并lib${reg_enter_name}.a..."

    lipo -create

"../../build/ios/Debug-iphonesimulator/${reg_enter_name}/lib${reg_

enter_name}.a"

"../../build/ios/Release-iphoneos/${reg_enter_name}/lib${reg_enter

_name}.a" -o

"../../build/ios/Release-iphoneos/${reg_enter_name}/lib${reg_enter

_name}.a"

done

      将这些上传到远程仓库,并生成新的标签。对于纯Native 项目,只需要更新Pod 依赖即可。

1.3.4 Flutter 混合工程的持续集成流程

      按上述方式,就可以解除Native 工程对Flutter 工程的直接依赖了,但是在日常开发中还存在一些其他问题:

  • Flutter 工程更新,远程依赖库更新不及时。
  • 版本集成时,容易忘记更新远程依赖库,导致版本没有集成最新的Flutter 功能。
  • 多条线并行开发Flutter 时,版本管理混乱,容易出现远程库被覆盖的问题。
  • 需要最少一名开发人员持续跟进发布,人工成本较高。

      针对这些问题,闲鱼引入了CI 自动化框架,从两方面来解决:一方面是通过自动化降低人工成本,也减少人为失误;另一方面是用自动化的形式做好版本控制。

      首先,在每次需要构建纯Native 工程之前,自动完成Flutter 工程对应的远程库的编译发布工作,整个过程不需要人工干预。其次,在开发测试阶段,采用五段式的版本号,最后一位自动递增产生,这样就可以保证测试阶段所有并行开发的Flutter 库的版本号不会产生冲突。最后,在发布阶段,采用三段式或四段式的版本号,可以和App 版本号保持一致,便于后续问题追溯。

      整个流程如图1-18 所示。

10.jpg

图1-18


相关文章
|
机器学习/深度学习 JSON 自然语言处理
Flutter敏感词过滤实战:基于AC自动机的高效解决方案
在社交、直播等场景中,敏感词过滤至关重要。本文介绍基于AC自动机的Flutter高效敏感词过滤方案,通过构建Trie树与失败指针实现线性时间复杂度的多模式匹配,支持干扰字符处理与动态优化。代码实战结合性能对比,助你打造毫秒级响应的过滤系统,适用于聊天、评论、内容审核等场景,保障平台安全。
667 69
|
11月前
|
前端开发 Java 开发者
SpringBoot 3 + Flutter3 实战低代码运营管理
Spring Boot 3 与 Flutter 3 强强联合,助力现代 Web 与移动应用开发。Spring Boot 3 提升后端开发效率,支持最新 Java 特性;Flutter 3 实现跨平台高性能 UI,热重载加速前端迭代。两者结合打造高效、可扩展的应用开发新体验。
391 0
|
人工智能 API 开发者
HarmonyOS Next~鸿蒙应用框架开发实战:Ability Kit与Accessibility Kit深度解析
本书深入解析HarmonyOS应用框架开发,聚焦Ability Kit与Accessibility Kit两大核心组件。Ability Kit通过FA/PA双引擎架构实现跨设备协同,支持分布式能力开发;Accessibility Kit提供无障碍服务构建方案,优化用户体验。内容涵盖设计理念、实践案例、调试优化及未来演进方向,助力开发者打造高效、包容的分布式应用,体现HarmonyOS生态价值。
929 27
|
数据采集 JSON 数据可视化
JSON数据解析实战:从嵌套结构到结构化表格
在信息爆炸的时代,从杂乱数据中提取精准知识图谱是数据侦探的挑战。本文以Google Scholar为例,解析嵌套JSON数据,提取文献信息并转换为结构化表格,通过Graphviz制作技术关系图谱,揭示文献间的隐秘联系。代码涵盖代理IP、请求头设置、JSON解析及可视化,提供完整实战案例。
858 4
JSON数据解析实战:从嵌套结构到结构化表格
|
数据采集 机器学习/深度学习 存储
可穿戴设备如何重塑医疗健康:技术解析与应用实战
可穿戴设备如何重塑医疗健康:技术解析与应用实战
818 4
|
机器学习/深度学习 人工智能 Java
Java机器学习实战:基于DJL框架的手写数字识别全解析
在人工智能蓬勃发展的今天,Python凭借丰富的生态库(如TensorFlow、PyTorch)成为AI开发的首选语言。但Java作为企业级应用的基石,其在生产环境部署、性能优化和工程化方面的优势不容忽视。DJL(Deep Java Library)的出现完美填补了Java在深度学习领域的空白,它提供了一套统一的API,允许开发者无缝对接主流深度学习框架,将AI模型高效部署到Java生态中。本文将通过手写数字识别的完整流程,深入解析DJL框架的核心机制与应用实践。
951 3
|
索引
【Flutter 开发必备】AzListView 组件全解析,打造丝滑索引列表!
在 Flutter 开发中,AzListView 是实现字母索引分类列表的理想选择。它支持 A-Z 快速跳转、悬浮分组标题、自定义 UI 和高效性能,适用于通讯录、城市选择等场景。本文将详细解析 AzListView 的核心参数和实战示例,助你轻松实现流畅的索引列表。
734 7
|
运维 Shell 数据库
Python执行Shell命令并获取结果:深入解析与实战
通过以上内容,开发者可以在实际项目中灵活应用Python执行Shell命令,实现各种自动化任务,提高开发和运维效率。
543 20
|
供应链 搜索推荐 API
深度解析1688 API对电商的影响与实战应用
在全球电子商务迅猛发展的背景下,1688作为知名的B2B电商平台,为中小企业提供商品批发、分销、供应链管理等一站式服务,并通过开放的API接口,为开发者和电商企业提供数据资源和功能支持。本文将深入解析1688 API的功能(如商品搜索、详情、订单管理等)、应用场景(如商品展示、搜索优化、交易管理和用户行为分析)、收益分析(如流量增长、销售提升、库存优化和成本降低)及实际案例,帮助电商从业者提升运营效率和商业收益。
625 20
|
数据采集 XML API
深入解析BeautifulSoup:从sohu.com视频页面提取关键信息的实战技巧
深入解析BeautifulSoup:从sohu.com视频页面提取关键信息的实战技巧

推荐镜像

更多
  • DNS