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

本文涉及的产品
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 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


目录
打赏
0
0
0
0
28
分享
相关文章
AI技术深度解析:从基础到应用的全面介绍
人工智能(AI)技术的迅猛发展,正在深刻改变着我们的生活和工作方式。从自然语言处理(NLP)到机器学习,从神经网络到大型语言模型(LLM),AI技术的每一次进步都带来了前所未有的机遇和挑战。本文将从背景、历史、业务场景、Python代码示例、流程图以及如何上手等多个方面,对AI技术中的关键组件进行深度解析,为读者呈现一个全面而深入的AI技术世界。
287 10
DeepSeek技术报告解析:为什么DeepSeek-R1 可以用低成本训练出高效的模型
DeepSeek-R1 通过创新的训练策略实现了显著的成本降低,同时保持了卓越的模型性能。本文将详细分析其核心训练方法。
485 11
DeepSeek技术报告解析:为什么DeepSeek-R1 可以用低成本训练出高效的模型
保单AI识别技术及代码示例解析
车险保单包含基础信息、车辆信息、人员信息、保险条款及特别约定等关键内容。AI识别技术通过OCR、文档结构化解析和数据校验,实现对保单信息的精准提取。然而,版式多样性、信息复杂性、图像质量和法律术语解析是主要挑战。Python代码示例展示了如何使用PaddleOCR进行保单信息抽取,并提出了定制化训练、版式分析等优化方向。典型应用场景包括智能录入、快速核保、理赔自动化等。未来将向多模态融合、自适应学习和跨区域兼容性发展。
DeepSeek模型的突破:性能超越R1满血版的关键技术解析
上海AI实验室周伯文团队的最新研究显示,7B版本的DeepSeek模型在性能上超越了R1满血版。该成果强调了计算最优Test-Time Scaling的重要性,并提出了一种创新的“弱到强”优化监督机制的研究思路,区别于传统的“从强到弱”策略。这一方法不仅提升了模型性能,还为未来AI研究提供了新方向。
437 5
深度干货 如何兼顾性能与可靠性?一文解析YashanDB主备高可用技术
数据库高可用(High Availability,HA)是指在系统遇到故障或异常情况时,能够自动快速地恢复并保持服务可用性的能力。如果数据库只有一个实例,该实例所在的服务器一旦发生故障,那就很难在短时间内恢复服务。长时间的服务中断会造成很大的损失,因此数据库高可用一般通过多实例副本冗余实现,如果一个实例发生故障,则可以将业务转移到另一个实例,快速恢复服务。
深度干货  如何兼顾性能与可靠性?一文解析YashanDB主备高可用技术
智能文件解析:体验阿里云多模态信息提取解决方案
在当今数据驱动的时代,信息的获取和处理效率直接影响着企业决策的速度和质量。然而,面对日益多样化的文件格式(文本、图像、音频、视频),传统的处理方法显然已经无法满足需求。
106 4
智能文件解析:体验阿里云多模态信息提取解决方案
鸿蒙Flutter实战:14-现有Flutter 项目支持鸿蒙 II
本文介绍了如何将现有 Flutter 项目适配鸿蒙系统,详细步骤包括安装 FVM、使用 FVM 安装 Flutter SDK、搭建开发环境、创建项目架构和壳工程等。
343 4
鸿蒙Flutter实战:14-现有Flutter 项目支持鸿蒙 II
入门级容器技术解析:Docker和K8s的区别与关系
本文介绍了容器技术的发展历程及其重要组成部分Docker和Kubernetes。从传统物理机到虚拟机,再到容器化,每一步都旨在更高效地利用服务器资源并简化应用部署。容器技术通过隔离环境、减少依赖冲突和提高可移植性,解决了传统部署方式中的诸多问题。Docker作为容器化平台,专注于创建和管理容器;而Kubernetes则是一个强大的容器编排系统,用于自动化部署、扩展和管理容器化应用。两者相辅相成,共同推动了现代云原生应用的快速发展。
253 11

推荐镜像

更多
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等