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

}

相关文章
|
12天前
|
域名解析 存储 网络协议
深入解析网络通信关键要素:IP 协议、DNS 及相关技术
本文详细介绍了IP协议报头结构及其各字段的功能,包括版本、首部长度、服务类型、总长度、标识、片偏移、标志、生存时间(TTL)、协议、首部检验和等内容。此外,还探讨了IP地址的网段划分、特殊IP地址的应用场景,以及路由选择的大致流程。最后,文章简要介绍了DNS协议的作用及其发展历史,解释了域名解析系统的工作原理。
49 5
深入解析网络通信关键要素:IP 协议、DNS 及相关技术
|
17天前
|
负载均衡 5G 网络性能优化
深入解析LTE(长期演进技术)的基本架构及其关键组件
深入解析LTE(长期演进技术)的基本架构及其关键组件
84 2
|
15天前
|
Linux iOS开发 Docker
Docker:容器化技术的领航者 —— 从基础到实践的全面解析
在云计算与微服务架构日益盛行的今天,Docker作为容器化技术的佼佼者,正引领着一场软件开发与部署的革命。它不仅极大地提升了应用部署的灵活性与效率,还为持续集成/持续部署(CI/CD)提供了强有力的支撑。
195 69
|
26天前
|
开发工具
Flutter-AnimatedWidget组件源码解析
Flutter-AnimatedWidget组件源码解析
|
19天前
|
机器学习/深度学习 算法
概率分布深度解析:PMF、PDF和CDF的技术指南
本文将深入探讨概率分布,详细阐述概率质量函数(PMF)、概率密度函数(PDF)和累积分布函数(CDF)这些核心概念,并通过实际示例进行说明。
55 15
概率分布深度解析:PMF、PDF和CDF的技术指南
|
6天前
|
移动开发 Android开发 数据安全/隐私保护
移动应用与系统的技术演进:从开发到操作系统的全景解析随着智能手机和平板电脑的普及,移动应用(App)已成为人们日常生活中不可或缺的一部分。无论是社交、娱乐、购物还是办公,移动应用都扮演着重要的角色。而支撑这些应用运行的,正是功能强大且复杂的移动操作系统。本文将深入探讨移动应用的开发过程及其背后的操作系统机制,揭示这一领域的技术演进。
本文旨在提供关于移动应用与系统技术的全面概述,涵盖移动应用的开发生命周期、主要移动操作系统的特点以及它们之间的竞争关系。我们将探讨如何高效地开发移动应用,并分析iOS和Android两大主流操作系统的技术优势与局限。同时,本文还将讨论跨平台解决方案的兴起及其对移动开发领域的影响。通过这篇技术性文章,读者将获得对移动应用开发及操作系统深层理解的钥匙。
|
26天前
|
机器学习/深度学习 人工智能 编解码
深入探索AI文生语音技术的奥秘:从文本输入到逼真语音输出的全链条语音合成过程解析
【9月更文挑战第2天】深入探索AI文生语音技术的奥秘:从文本输入到逼真语音输出的全链条语音合成过程解析
 深入探索AI文生语音技术的奥秘:从文本输入到逼真语音输出的全链条语音合成过程解析
|
8天前
|
存储 缓存 Java
在Spring Boot中使用缓存的技术解析
通过利用Spring Boot中的缓存支持,开发者可以轻松地实现高效和可扩展的缓存策略,进而提升应用的性能和用户体验。Spring Boot的声明式缓存抽象和对多种缓存技术的支持,使得集成和使用缓存变得前所未有的简单。无论是在开发新应用还是优化现有应用,合理地使用缓存都是提高性能的有效手段。
15 1
|
13天前
|
缓存 负载均衡 Dubbo
Dubbo技术深度解析及其在Java中的实战应用
Dubbo是一款由阿里巴巴开源的高性能、轻量级的Java分布式服务框架,它致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案。
39 6
|
11天前
|
传感器 机器学习/深度学习 自动驾驶
未来出行的革新:无人驾驶技术深度解析
在当今科技飞速发展的时代,无人驾驶技术正逐步从科幻走向现实,成为未来交通领域最具革命性的变化之一。本文旨在深入探讨无人驾驶技术的工作原理、关键技术组件以及面临的伦理与法律挑战,并展望其对社会经济和日常生活的深远影响。通过分析感知、决策和执行三个核心环节,本文揭示了无人驾驶汽车如何利用先进的传感器阵列、复杂的算法和精密的机械控制来实现自主行驶。同时,文章也讨论了数据安全、隐私保护及责任归属等问题,呼吁建立相应的法规框架以促进技术的健康发展。最后,无人驾驶技术被预测将为减少交通事故、缓解拥堵、提高能效及推动共享经济等方面带来显著益处,预示着一个更加智能、高效和可持续的出行未来。

热门文章

最新文章

推荐镜像

更多
下一篇
无影云桌面