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

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

1.3 混合工程与持续集成

      本节重点介绍Flutter 混合工程中解除Native 工程对Flutter 的直接依赖的具体实现方法。

1.3.1 背景思考

      因为闲鱼采用的是Flutter 和Native 混合开发的模式,所以存在一部分开发人员只做Native 开发,并不熟悉Flutter 技术。

      (1)如果直接采用Flutter 工程结构作为日常开发,则Native 开发人员也需要配置Flutter 环境,了解Flutter 技术,成本比较高。

      (2)目前阿里巴巴集团的构建系统并不支持直接构建Flutter 项目,这也要求闲鱼解除Native 工程对Flutter 的直接依赖。

      基于这两点考虑,闲鱼希望设计一个Flutter 依赖抽取模块,可以将Flutter 的依赖抽取为一个Flutter 依赖库并发布到远程,供纯Native 工程引用,如图1-16 所示。


16.jpg

图1-16

1.3.2 实现方法

      1.Native 工程依赖的Flutter 分析

      分析Flutter 工程,会发现Native 工程对Flutter 工程的依赖主要有三部分:

  • Flutter 库和引擎。Flutter 的Framework 库和引擎库。
  • Flutter 工程。我们自己实现的Flutter 模块功能,主要为在Flutter 工程lib 目录下,由Dart 代码实现的这部分功能。
  • 自己实现的Flutter Plugin。

      解开Android 和iOS 的App 文件,可以发现Flutter 依赖的主要文件如图1-17 所示。

17.jpg

图1-17

      (1)Android 的Flutter 依赖的文件

  • Flutter 库和引擎。包括icudtl.dat、libflutter.so,以及一些class 文件。它们都被封装在flutter.jar 中,这个jar 文件位于Flutter 库目录下的[flutter/bin/cache/artifacts/engine]中。
  • Flutter 工程产物。包括isolate_snapshot_data、isolate_snapshot_instr、vm_snapshot_data、vm_snapshot_instr 和flutter_assets。
  • Flutter Plugin 。各个Plugin 编译出来的AAR 文件, 包括:isolate_snapshot_data(应用程序数据段)、isolate_snapshot_instr(应用程序指令段)、vm_snapshot_data (虚拟机数据段)、vm_snapshot_instr(虚拟机指令段)。

      (2)iOS 的Flutter 依赖的文件

  • Flutter 库和引擎。Flutter.framework。
  • Flutter 工程的产物。App.framework。
  • Flutter Plugin。编译出来的各种Plugin 的Framework,以及图1-17 中的其他Framework。

      我们只需要将编译结果抽取出来,打包成一个SDK 依赖的形式提供给Native 工程,就可以解除Native 工程对Flutter 工程的直接依赖。

      2.Android 依赖的Flutter 库抽取

      (1)Android 中Flutter 编译任务分析

      Flutter 工程的Android 打包,其实只是在Android 的Gradle 任务中插入了一个flutter.gradle 任务,而flutter.gradle 主要做了三件事(这个文件可以在Flutter 库中的[flutter/packages/flutter_tools/gradle]目录下能找到):

  • 增加flutter.jar 的依赖。
  • 插入Flutter Plugin 的编译依赖。
  • 插入Flutter 工程的编译任务,得到的产物包括两个isolate_snapshot 文件、两个vm_snapshot 文件和flutter_assets 文件夹。然后将产物拷贝到mergeAssets.outputDir,最后合并到APK 的assets 目录下。

      (2)Android 的Flutter 依赖抽取实现

      对Android 的Flutter 依赖抽取步骤如下:

      (a)编译Flutter 工程

      这部分的主要工作是编译Flutter 的Dart 和资源部分,可以用AOT 和Bundle 命令编译。

echo "Clean old build"

find . -d -name "build" | xargs rm -rf

./flutter/bin/flutter clean

echo "Get packages"

./flutter/bin/flutter packages get

echo "Build release AOT"

./flutter/bin/flutter build aot --release --preview-dart-2

--output-dir= build/flutteroutput/aot

echo "Build release Bundle"

./flutter/bin/flutter build bundle --precompiled --preview-dart-2

--asset-dir=build/flutteroutput/flutter_assets

      (b)将flutter.jar 和Flutter 工程的产物打包成一个AAR

      主要工作是将flutter.jar 和第1 步编译的产物封装成一个AAR 文件。

      添加flutter.jar 依赖。

project.android.buildTypes.each {

    addFlutterJarImplementationDependency(project,

releaseFlutterJar)

}

project.android.buildTypes.whenObjectAdded {

    addFlutterJarImplementationDependency(project,

releaseFlutterJar)

}

private static void addFlutterJarImplementationDependency(Project

project, releaseFlutterJar) {

    project.dependencies {

         String configuration

         if (project.getConfigurations().findByName("api")) {

            configuration = "api"

         } else {

            configuration = "compile"

         }

         add(configuration, project.files {

            releaseFlutterJar

         })

    }

}

      将Flutter 的产物合并到assets。

// 合并 flutter assets

def allertAsset

="${project.projectDir.getAbsolutePath()}/flutter/assets/ release"

Task mergeFlutterAssets = project.tasks.create(name:

"mergeFlutterAssets${variant.name.capitalize()}", type: Copy) {

     dependsOn mergeFlutterMD5Assets

     from (allertAsset){

           include "flutter_assets/**"

           include "vm_snapshot_data"

           include "vm_snapshot_instr"

           include "isolate_snapshot_data"

           include "isolate_snapshot_instr"

     }

     into variant.mergeAssets.outputDir

}

variant.outputs[0].processResources.dependsOn(mergeFlutterAssets)

      (c)同时将AAR 文件和Flutter Plugin 编译出来的AAR 文件一起发布到Maven 仓库

      发布Flutter 工程产物打包的AAR 文件。

echo 'Clean packflutter input(flutter build)'

rm -f -r android/packflutter/flutter/

# 拷贝flutter.jar

echo 'Copy flutter jar'

mkdir -p android/packflutter/flutter/flutter/android-arm-release &&

cp

flutter/bin/cache/artifacts/engine/android-arm-release/flutter.ja

r "$_"

# 拷贝asset

echo 'Copy flutter asset'

mkdir -p android/packflutter/flutter/assets/release && cp -r build/

flutteroutput/aot/* "$_"

mkdir -p android/packflutter/flutter/assets/release/flutter_assets

&& cp -r build/flutteroutput/flutter_assets/* "$_"

# 将Flutter 库和flutter_app 打成AAR 文件,同时发布到Ali-maven

echo 'Build and publish idlefish flutter to aar'

cd android

if [ -n "$1" ]

then

      ./gradlew :packflutter:clean :packflutter:publish

-PAAR_VERSION=$1

else

      ./gradlew :packflutter:clean :packflutter:publish

fi

cd ../

      发布Flutter Plugin 的AAR 文件。

# 将Plugin 发布到Ali-maven

echo "Start publish flutter-plugins"

for line in $(cat .flutter-plugins)

do

    plugin_name=${line%%=*}

    echo 'Build and publish plugin:' ${plugin_name}

    cd android

    if [ -n "$1" ]

    then

         ./gradlew :${plugin_name}:clean :${plugin_name}:publish

-PAAR_VERSION =$1

    else

         ./gradlew :${plugin_name}:clean :${plugin_name}:publish

    fi

    cd ../

done

      (d)纯粹的Native 项目只需要依赖我们发布到Maven 的AAR 文件即可。

      在平时开发阶段,需要实时地依赖最新的AAR 文件,所以采用snapshot 版本。

configurations.all {

    resolutionStrategy.cacheChangingModulesFor 0, 'seconds'

}

ext {

    flutter_aar_version = '6.0.2-SNAPSHOT'

}

dependencies {

    //Flutter 主工程依赖:包含基于Flutter 开发的功能、Flutter 引擎lib

compile("com.taobao.fleamarket:IdleFishFlutter:${getFlutterAarVer

sion(project)}") {

         changing = true

    }

    //其他依赖

}

static def getFlutterAarVersion(project) {

    def resultVersion = project.flutter_aar_version

    if (project.hasProperty('FLUTTER_AAR_VERSION')) {

       resultVersion = project.FLUTTER_AAR_VERSION

    }

    return resultVersion

}

相关文章
|
3天前
|
传感器 人工智能 物联网
穿戴科技新风尚:智能服装设计与技术全解析
穿戴科技新风尚:智能服装设计与技术全解析
118 85
|
4天前
|
人工智能 API 开发者
HarmonyOS Next~鸿蒙应用框架开发实战:Ability Kit与Accessibility Kit深度解析
本书深入解析HarmonyOS应用框架开发,聚焦Ability Kit与Accessibility Kit两大核心组件。Ability Kit通过FA/PA双引擎架构实现跨设备协同,支持分布式能力开发;Accessibility Kit提供无障碍服务构建方案,优化用户体验。内容涵盖设计理念、实践案例、调试优化及未来演进方向,助力开发者打造高效、包容的分布式应用,体现HarmonyOS生态价值。
62 27
|
4天前
|
人工智能 API 语音技术
HarmonyOS Next~鸿蒙AI功能开发:Core Speech Kit与Core Vision Kit的技术解析与实践
本文深入解析鸿蒙操作系统(HarmonyOS)中的Core Speech Kit与Core Vision Kit,探讨其在AI功能开发中的核心能力与实践方法。Core Speech Kit聚焦语音交互,提供语音识别、合成等功能,支持多场景应用;Core Vision Kit专注视觉处理,涵盖人脸检测、OCR等技术。文章还分析了两者的协同应用及生态发展趋势,展望未来AI技术与鸿蒙系统结合带来的智能交互新阶段。
55 31
|
22天前
|
数据采集 JSON 数据可视化
JSON数据解析实战:从嵌套结构到结构化表格
在信息爆炸的时代,从杂乱数据中提取精准知识图谱是数据侦探的挑战。本文以Google Scholar为例,解析嵌套JSON数据,提取文献信息并转换为结构化表格,通过Graphviz制作技术关系图谱,揭示文献间的隐秘联系。代码涵盖代理IP、请求头设置、JSON解析及可视化,提供完整实战案例。
JSON数据解析实战:从嵌套结构到结构化表格
|
4天前
|
编解码 监控 网络协议
RTSP协议规范与SmartMediaKit播放器技术解析
RTSP协议是实时流媒体传输的重要规范,大牛直播SDK的rtsp播放器基于此构建,具备跨平台支持、超低延迟(100-300ms)、多实例播放、高效资源利用、音视频同步等优势。它广泛应用于安防监控、远程教学等领域,提供实时录像、快照等功能,优化网络传输与解码效率,并通过事件回调机制保障稳定性。作为高性能解决方案,它推动了实时流媒体技术的发展。
|
5天前
|
数据采集 机器学习/深度学习 存储
可穿戴设备如何重塑医疗健康:技术解析与应用实战
可穿戴设备如何重塑医疗健康:技术解析与应用实战
35 4
|
10天前
|
机器学习/深度学习 人工智能 自然语言处理
AI技术如何重塑客服系统?解析合力亿捷AI智能客服系统实践案例
本文探讨了人工智能技术在客服系统中的应用,涵盖技术架构、关键技术和优化策略。通过感知层、认知层、决策层和执行层的协同工作,结合自然语言处理、知识库构建和多模态交互技术,合力亿捷客服系统实现了智能化服务。文章还提出了用户体验优化、服务质量提升和系统性能改进的方法,并展望了未来发展方向,强调其在客户服务领域的核心价值与潜力。
51 6
|
9天前
|
机器学习/深度学习 人工智能 Java
Java机器学习实战:基于DJL框架的手写数字识别全解析
在人工智能蓬勃发展的今天,Python凭借丰富的生态库(如TensorFlow、PyTorch)成为AI开发的首选语言。但Java作为企业级应用的基石,其在生产环境部署、性能优化和工程化方面的优势不容忽视。DJL(Deep Java Library)的出现完美填补了Java在深度学习领域的空白,它提供了一套统一的API,允许开发者无缝对接主流深度学习框架,将AI模型高效部署到Java生态中。本文将通过手写数字识别的完整流程,深入解析DJL框架的核心机制与应用实践。
29 2
|
14天前
|
监控 负载均衡 安全
静态IP代理与动态IP代理:提升速度与保障隐私的技术解析
本文探讨了静态IP代理和动态IP代理的特性和应用场景。静态IP代理通过高质量服务提供商、网络设置优化、定期更换IP与负载均衡及性能监控提升网络访问速度;动态IP代理则通过隐藏真实IP、增强安全性、绕过封锁和提供独立IP保障用户隐私。结合实际案例与代码示例,展示了两者在不同场景下的优势,帮助用户根据需求选择合适的代理服务以实现高效、安全的网络访问。
41 1
|
21天前
|
编解码 人工智能 并行计算
基于 Megatron 的多模态大模型训练加速技术解析
Pai-Megatron-Patch 是一款由阿里云人工智能平台PAI 研发的围绕英伟达 Megatron 的大模型训练配套工具,旨在帮助开发者快速上手大模型,打通大模型相关的高效分布式训练、有监督指令微调、下游任务评估等大模型开发链路。本文以 Qwen2-VL 为例,从易用性和训练性能优化两个方面介绍基于 Megatron 构建的 Pai-Megatron-Patch 多模态大模型训练的关键技术

热门文章

最新文章

  • 1
    【Flutter 开发必备】AzListView 组件全解析,打造丝滑索引列表!
    41
  • 2
    flutter3-wetrip跨平台自研仿携程app预约酒店系统模板
    44
  • 3
    通过外部链接启动 Flutter App(详细介绍及示例)
    40
  • 4
    【01】噩梦终结flutter配安卓android鸿蒙harmonyOS 以及next调试环境配鸿蒙和ios真机调试环境-flutter项目安卓环境配置-gradle-agp-ndkVersion模拟器运行真机测试环境-本地环境搭建-如何快速搭建android本地运行环境-优雅草卓伊凡-很多人在这步就被难倒了
    218
  • 5
    零基础构建即时通讯开源项目OpenIM移动端-Flutter篇
    116
  • 6
    flutter3-dart3-dymall原创仿抖音(直播+短视频+聊天)商城app系统模板
    80
  • 7
    【11】flutter进行了聊天页面的开发-增加了即时通讯聊天的整体页面和组件-切换-朋友-陌生人-vip开通详细页面-即时通讯sdk准备-直播sdk准备-即时通讯有无UI集成的区别介绍-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
    190
  • 8
    【09】flutter首页进行了完善-采用android studio 进行真机调试开发-增加了直播间列表和短视频人物列表-增加了用户中心-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
    64
  • 9
    当flutter react native 等混开框架-并且用vscode-idea等编译器无法打包apk,打包安卓不成功怎么办-直接用android studio如何打包安卓apk -重要-优雅草卓伊凡
    91
  • 10
    【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
    193
  • 推荐镜像

    更多