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

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

第1章 混合工程

1.1 Flutter 工程体系

1.1.1 混合工程研发体系介绍

      工程研发体系的关键点包括:

  • 混合工程下的Flutter 研发结构。在混合工程中,一个全局视角的研发结构是什么样的。
  • 工程结构。已有的Native 工程如何引入Flutter,工程结构如何组织,如何管理Flutter 环境,如何编译构建和集成打包等。
  • 构建优化。如何针对Flutter 的工具链(flutter_tools、IntelliJ 插件等)进行调试与优化。
  • Native 启动下的Flutter 调试。不同于Flutter 启动下的一体化调试,这种Native 启动(Xcode、Android Studio 启动,或点击图标打开应用)下的Flutter 调试,我们称为分离式调试。分离式调试可以简化flutter_tools 带来的复杂度,提高调试的稳定性和灵活性。
  • Native 启动下的Flutter 热重载。
  • 联合调试。同时调试Flutter 和Android/iOS。
  • 持续集成。混合环境下的Flutter 构建与持续集成。

1.1.2 混合工程下的Flutter 研发结构

      如图1-1 所示,在这个工程研发体系中,基于Flutter 的官方仓库,开发者可以获取引擎依赖,进行适当修改,以满足定制化场景下的需求。开发完毕各模块后发布到私有Pub 仓库,再通过pubspec.yaml 被业务代码依赖和集成。在构建时,首先将Dart 代码编译成产物(App.framework 或Snapshot),再通过标准的Pod(iOS)依赖或者Gradle(Android)依赖集成到IPA(iOS)和APK(Android)中去。对于Native 开发人员,无须关注Flutter 部分的细节;对于Flutter 开发人员,可以通过启动Flutter 工程调试,也可以在Native 工程启动后打开Flutter 页面(Observatory 开始监听),利用Dart 远程连接的方式实现调试。

1.jpg

图1-1

1.1.3 工程结构

      这部分的核心逻辑是如何在最小改动已有iOS 或Android 工程的前提下运行Flutter。可以将Flutter 部分理解为一个单独的模块,通过Pod 库(iOS)或AAR 库(Android)的方式,由CocoaPods 和Gradle 引入主工程,如图1-2 所示。

2.jpg

图1-2

1.1.4 构建优化

      问题:Android 在由Flutter 启动时构建缓慢。

      原因: 在Flutter 工具链( flutter_tools ) 的逻辑中, 当未找到android/app/build.gradle 时,会运行gradle build,从而执行多个编译配置的构建,而不是gradle assembleDebug。

      解法:重构Android 工程,使工程应用Module 对应的build.gradle 位于android/app 下,从而符合flutter_tools 的逻辑。

      flutter_tools 的调试方法如下。

      (1)修改flutter_tools.dart,使之可打印参数。

import 'package:flutter_tools/executable.dart' as executable;

void main(List<String> args) {

  print('[KWLM]:${args.join(' ')}');

  executable.main(args);

}

      (2)删除flutter/bin/cache/fluttertools.stamp,使得fluttertools 可以被重建。

# Invalidate cache if:

# * SNAPSHOT_PATH is not a file, or

# * STAMP_PATH is not a file with nonzero size, or

# * Contents of STAMP_PATH is not our local git HEAD revision, or

# * pubspec.yaml last modified after pubspec.lock

if [[ ! -f "$SNAPSHOT_PATH" || ! -s "$STAMP_PATH" || "$(cat

"$STAMP_PATH")" != "$revision" || "$FLUTTER_TOOLS_DIR/pubspec.yaml"

-nt "$FLUTTER_TOOLS_DIR/ pubspec.lock" ]]; then

    rm -f "$FLUTTER_ROOT/version"

    touch "$FLUTTER_ROOT/bin/cache/.dartignore"

    "$FLUTTER_ROOT/bin/internal/update_dart_sdk.sh"

    VERBOSITY="--verbosity=error"

    echo Building flutter tool...

    if [[ "$CI" == "true" || "$BOT" == "true" ||

"$CONTINUOUS_INTEGRATION" == "true" || "$CHROME_HEADLESS" == "1" ]];

then

    PUB_ENVIRONMENT="$PUB_ENVIRONMENT:flutter_bot"

    VERBOSITY="--verbosity=normal"

fi

export PUB_ENVIRONMENT="$PUB_ENVIRONMENT:flutter_install"

if [[ -d "$FLUTTER_ROOT/.pub-cache" ]]; then

  export PUB_CACHE="${PUB_CACHE:-"$FLUTTER_ROOT/.pub-cache"}"

fi

  retry_upgrade

  "$DART" $FLUTTER_TOOL_ARGS --snapshot="$SNAPSHOT_PATH"

--packages= "$FLUTTER_TOOLS_DIR/.packages" "$SCRIPT_PATH"

  echo "$revision" > "$STAMP_PATH"

fi

      (3)从Flutter 运行构建,获取其入口参数。

Building flutter tool...

[KWLM]:--no-color run --machine --track-widget-creation

--device-id= GWY7N16A31002764 --start-paused lib/main.dart

Running "flutter packages get" in hello_world...

0.4s

Launching lib/main.dart on MHA AL00 in debug mode...

Initializing gradle...

Resolving dependencies...

      (4)用IntelliJ(或Android Studio,下同)打开flutter_tools 工程,新建Dart Command Line App,并基于步骤(3)获得的入参来配置“Program arguments”,如图1-3 所示。

3.jpg

图1-3

      (5)开始flutter_tools 调试,如图1-4 所示。

4.jpg

图1-4


相关文章
|
12天前
|
域名解析 存储 网络协议
深入解析网络通信关键要素:IP 协议、DNS 及相关技术
本文详细介绍了IP协议报头结构及其各字段的功能,包括版本、首部长度、服务类型、总长度、标识、片偏移、标志、生存时间(TTL)、协议、首部检验和等内容。此外,还探讨了IP地址的网段划分、特殊IP地址的应用场景,以及路由选择的大致流程。最后,文章简要介绍了DNS协议的作用及其发展历史,解释了域名解析系统的工作原理。
49 5
深入解析网络通信关键要素:IP 协议、DNS 及相关技术
|
17天前
|
负载均衡 5G 网络性能优化
深入解析LTE(长期演进技术)的基本架构及其关键组件
深入解析LTE(长期演进技术)的基本架构及其关键组件
85 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天前
|
传感器 机器学习/深度学习 自动驾驶
未来出行的革新:无人驾驶技术深度解析
在当今科技飞速发展的时代,无人驾驶技术正逐步从科幻走向现实,成为未来交通领域最具革命性的变化之一。本文旨在深入探讨无人驾驶技术的工作原理、关键技术组件以及面临的伦理与法律挑战,并展望其对社会经济和日常生活的深远影响。通过分析感知、决策和执行三个核心环节,本文揭示了无人驾驶汽车如何利用先进的传感器阵列、复杂的算法和精密的机械控制来实现自主行驶。同时,文章也讨论了数据安全、隐私保护及责任归属等问题,呼吁建立相应的法规框架以促进技术的健康发展。最后,无人驾驶技术被预测将为减少交通事故、缓解拥堵、提高能效及推动共享经济等方面带来显著益处,预示着一个更加智能、高效和可持续的出行未来。

推荐镜像

更多
下一篇
无影云桌面