开发者社区> 博文视点Broadview> 正文

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

简介: 本书将详细讲解闲鱼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

}

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
阿里云ECS云服务器初始化设置教程方法
阿里云ECS云服务器初始化是指将云服务器系统恢复到最初状态的过程,阿里云的服务器初始化是通过更换系统盘来实现的,是免费的,阿里云百科网分享服务器初始化教程: 服务器初始化教程方法 本文的服务器初始化是指将ECS云服务器系统恢复到最初状态,服务器中的数据也会被清空,所以初始化之前一定要先备份好。
13730 0
flutter 布局实战01
flutter 布局实战01
32 0
阿里云服务器怎么设置密码?怎么停机?怎么重启服务器?
如果在创建实例时没有设置密码,或者密码丢失,您可以在控制台上重新设置实例的登录密码。本文仅描述如何在 ECS 管理控制台上修改实例登录密码。
19111 0
带你读《Flutter技术入门与实战》之三:Dart语言简述
本书的定位适合小白程序员,入门加实战,既有基础知识,又有丰富示例,包括详细的操作步骤,实操性强。由于Flutter大量使用组件,所以对组件的讲解很详细,包括基本概念、属性及代码示例。每个组件都配有小例子,力求精简,还提供了配套网站提供完整代码,复制完整代码就可以立即看到效果。在轻松掌握基础知识的同时快速进入实战。
1190 0
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,阿里云优惠总结大概有三种登录方式: 登录到ECS云服务器控制台 在ECS云服务器控制台用户可以更改密码、更换系.
23940 0
Flutter交互实战-即刻App探索页下拉&拖拽效果
Flutter交互实战-即刻App探索页下拉&拖拽效果
2408 0
阿里云ECS云服务器初始化设置教程方法
阿里云ECS云服务器初始化是指将云服务器系统恢复到最初状态的过程,阿里云的服务器初始化是通过更换系统盘来实现的,是免费的,阿里云百科网分享服务器初始化教程: 服务器初始化教程方法 本文的服务器初始化是指将ECS云服务器系统恢复到最初状态,服务器中的数据也会被清空,所以初始化之前一定要先备份好。
14095 0
《TensorFlow技术解析与实战》——1.3 深度学习的入门方法
本节书摘来自异步社区《TensorFlow技术解析与实战》一书中的第1章,第1.1节,作者李嘉璇,更多章节内容可以访问云栖社区“异步社区”公众号查看 第1章 人工智能概述 1.3 深度学习的入门方法 要想入门深度学习,需要两个工具,即算法知识和大量的数据,外加一台计算机,如果有GPU就更好了,但是因为许多入门初学者的条件有限,没有GPU也可以,本书的许多讲解都是基于Mac笔记本完成的。
5373 0
+关注
博文视点Broadview
博文视点( Broadview )是电子工业出版社下属旗舰级子公司。在IT出版领域打磨多年,以敏锐眼光、独特视角密切关注技术发展趋势及变化,致力于将技术大师之优秀思想、一线专家之一流经验集结成书,为众多朋友奉献经典著作,助力个人、团队成长。
55
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
OceanBase 入门到实战教程
立即下载
阿里云图数据库GDB,加速开启“图智”未来.ppt
立即下载
实时数仓Hologres技术实战一本通2.0版(下)
立即下载