Android 的即时 运行 与 Flutter 的热重载和 React Native 的热重载之间的区别?

Difference between Android's Instant Run vs Flutter's Hot Reload and React Native's Hot Reload?

目前,我正在研究 React Native 项目,当我在 运行ning 项目后摇动 Phone 时,它会给我实时更新。因为我也曾使用过 Flutter,所以它也为我提供了相同类型的输出。但是,在 Android 中有一个名为 Instant 运行.

的功能

我用谷歌搜索了 Instant 运行。和一些结果不同 Instant 运行 不是 Android Studio 的热重载。

所以,我想知道 Instant 运行 和 Hot Reload 在工作和功能上的显着区别是什么?

我无法详细介绍技术细节,但这里有一些实际差异:

  • Flutter Hot Reload 比 Instant 快很多 运行
  • 即时 运行 有时会失败并导致完全重建,这可能需要几分钟时间。
  • Flutter Hot Reload 会在您保存文件时自动安排,没有延迟。即时 运行 会导致大量延迟,这会让人分心。
  • Flutter Hot Reload 不会丢失任何状态,而使用 Instant 运行 时经常会发生应用被重置的情况
  • Flutter 还允许您在不到一秒的时间内重启应用程序(重置状态)(可能需要几分钟 Android)
  • Flutter Hot Reload 也可以在应用程序处于后台时运行
  • 在对 Flutter 应用程序的原生 Android 和 iOS shell 进行更改时,Flutter Hot Reload 无法帮助您。您必须使用 Gradle/XCode 进行完全重建(这也会重置状态)

Flutter 的 Hot Reload 和 Android Studio 的 Instant 运行 的工作方式实际上差别很小.

他们都检查代码更改,只对更改的内容执行编译步骤,然后将其发送到 phone 成为 运行。 Android 和 Flutter 应用程序 运行 一个 VM(jvm 或 dart vm),能够动态更改 classes。


当你执行 Flutter Hot Reload 时,它会执行快速增量编译步骤,然后将你的 dart 代码发送到 phone 运行 ] 几乎是瞬间。之所以如此之快,部分原因是 Flutter 在 运行 处于调试模式时使用了 JIT 编译模型,这意味着编译花费的时间更少,但第一个 运行(或前几个 运行 s) 一个方法可能没有被优化。在许多情况下,由于 flutter 的工作方式,状态在变化之间保持不变,而不是通过 dart JIT 处理的任何固有方式。对于某些事情(想到静态和 initState 函数),您实际上必须执行 Full Reload 重新初始化应用程序的状态,但仍然几乎是即时的。


What Android Studio for Instant 运行 非常相似,但始终是完全编译的。 VM 有一些检测,以便在调用方法时,VM 检查是否已注入新的 class。 Instant 运行 会尽量少替换;如果它可以简单地替换一些 classes 它会,但它通常需要替换整个 activity,有时甚至是整个应用程序。这是来自 this blog 的一个很好的图表(如果您想更深入地理解,值得一读):


在功能上,Instant 运行Hot Reload 应该非常相似。然而,在实践中我发现 flutter 的 Hot Reload 相当Instant 运行,尤其是对于任何大小的应用程序。

此外,我发现 flutter 处理状态的方式比 Android 活动的工作方式更适合重新计算 classes。在 Flutter 中,您有许多 class 与 UI 相关,每个都有自己的状态,仅更改其中几个是非常快的。或者,使用 Android 时,您往往会拥有更大的视图或 Activity UI,这需要更多的努力来替换并且通常会导致重新加载活动,而不是简单的 class 到处都是。