likes
comments
collection
share

flutter 热重载与热更新

作者站长头像
站长
· 阅读数 43

热重载与热更新

在Flutter中,热重载(Hot Reload)和热重启(Hot Restart)是加速开发周期的两个强大功能,它们允许开发者快速查看对代码所做更改的效果。下面是这两个特性的工作原理的解释:

热重载(Hot Reload)

原理: 当开发者在Flutter应用中修改源代码并保存后,热重载功能可以将这些更改快速推送到已经运行的Flutter应用上,而无需重新启动应用或丢失应用状态。这是如何实现的:

  1. 更改检测: 当保存文件时,Flutter工具会检测到更改,并确定哪些文件被修改。
  2. 增量编译: Flutter工具链使用增量编译技术,只编译修改过的Dart源文件,生成一个更新的内存映像(kernel binary),这个过程非常快速。
  3. 传输快照: 这个更新后的程序快照会被发送到正在运行的Dart虚拟机(VM)。
  4. 更新类定义: Dart VM更新堆上的类定义,并且用新的定义替换旧的。这包括新添加的字段和方法。
  5. 状态保持:热重载设计为保持应用状态。这意味着在热重载过程中,应用的状态(如变量的值、导航堆栈等)被保留,不会重置。这是通过Dart的隔离区(Isolate)机制实现的,它允许在不影响正在运行的隔离区的情况下更新代码。
  6. 界面更新:一旦新的代码加载并生效,Flutter框架会自动重新构建受影响的widget,以反映代码的变更。这通常涉及到调用build方法来重新绘制界面。

限制

  • 热重载无法应用全局变量初始化更改和静态字段更改。
  • 构造函数和初始化器列表的更改也不会被热重载捕获。

热重启(Hot Restart)

原理: 热重启会重置Flutter运行时的状态,几乎相当于完全重新启动应用,但是速度更快。

  1. 重置Dart VM: 执行热重启时,会重置Dart VM,这意味着清除了所有的缓存和状态。
  2. 全量编译: 整个应用程序会被完全编译,生成一个全新的快照。
  3. 重新加载: 这个全新的程序快照被加载到Dart VM中。
  4. 重建状态: 与热重载不同,热重启会丢失应用的状态,因为全局变量和静态字段会被重置。应用必须重新构建其状态。

适用场景

  • 当热重载无法应用或无效时,比如静态字段和全局变量更改后。
  • 当执行大规模的架构更改,或者更改了main()函数。

通过使用热重载和热重启,Flutter开发者可以在不重新启动整个应用或丢失当前状态的情况下,快速迭代和调试他们的应用。这极大地提高了开发效率和体验。

增量编译

Dart的增量编译功能是由Dart的编译器实现的,主要依赖于Dart的前端服务器(Frontend Server,简称FEServer)。下面是一个简化的概述,说明Dart的增量编译是如何实现的:

1. 初始编译

当你第一次运行或构建你的Flutter应用时,Dart编译器会进行完整编译,将你的Dart代码编译成内存中的程序快照(snapshot)或其他格式的可执行文件。这个过程包括解析源代码、进行静态分析、生成中间表示(IR),以及最终生成机器代码或字节码。

2. 监听更改

在开发过程中,当你保存对Dart代码的更改时,Dart的工具链(比如Flutter的热重载机制)会通知FEServer哪些文件被修改了。FEServer会跟踪这些更改,并准备进行增量编译。

3. 增量编译

FEServer使用以下步骤进行增量编译:

  • 增量解析:FEServer只解析更改的文件和受影响的依赖,而不是重新解析整个项目。
  • 增量静态分析:基于更改的代码,重新进行静态分析,但只限于受影响的部分。
  • 增量代码生成:FEServer生成更改代码的新中间表示(IR),并将其与之前的IR合并。然后,它只针对更改的部分生成新的机器代码或字节码。
  • 快照更新:生成的新代码会被合并到原来的程序快照中,或者以其他方式准备供运行时使用。

4. 应用更新

对于Flutter应用,更新后的程序快照会被发送到正在运行的Dart虚拟机(VM)中。Dart VM会加载新的快照,并根据需要更新内存中的类定义和函数实现,以反映代码的更改。然后,Flutter框架会触发UI的重新构建,以展示新的代码更改。

优化

为了优化增量编译的性能,Dart编译器使用了各种技术,比如缓存中间结果、使用增量静态分析和增量代码生成等。这些优化有助于减少每次增量编译所需的时间,使得热重载能够快速响应开发者的更改。

总之,Dart的增量编译功能是通过Dart的前端服务器和编译器的协作实现的,它利用了增量解析、增量静态分析和增量代码生成等技术,以及运行时的动态更新,从而在开发过程中快速应用代码更改。

转载自:https://juejin.cn/post/7340603873604747299
评论
请登录