Android的Instant Run与Flutter的Hot Reload和React Native的Hot Reload之间有何区别?

时间:2018-08-28 05:25:51

标签: android react-native flutter android-instant-run hot-reload

当前,我正在从事React Native Project,当我在运行Project之后摇动手机时,它会为我提供实时更新。因为我也曾与Flutter合作,所以它也为我提供了相同的OutPut。但是,在Android中有一个称为“即时运行”的功能。

我已经搜索了“即时运行”。并且某些结果有所不同。AndroidStudio的“即时运行”不是“热重装”。

所以,我想知道即时运行和热重装的工作方式和功能上的显着区别是什么?

2 个答案:

答案 0 :(得分:4)

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

  • Flutter Hot Reload比Instant Run快很多
  • 即时运行有时会失败并导致完全重建,这可能需要几分钟的时间。
  • 在您保存文件时自动计划Flutter Hot Reload,并且没有延迟。即时运行会导致很多延迟,这会分散注意力。
  • Flutter Hot Reload不会丢失任何状态,而在使用Instant Run时,经常会发生应用重置的情况
  • Flutter还允许您在不到一秒钟的时间内重新启动应用程序(重置状态)(在Android中可能需要几分钟)
  • 在后台运行应用程序时,Flutter Hot Reload也可以工作
  • 在对Flutter应用程序的本机Android和iOS Shell进行更改时,Flutter Hot Reload不能为您提供帮助。您必须使用Gradle / XCode进行完全重建(这也会重置状态)

答案 1 :(得分:4)

Flutter的 Hot Reload 与Android Studio的 Instant Run 的工作方式实际上几乎没有区别。

它们都检查代码是否更改,仅对已更改的内容执行编译步骤,然后将其发送至手机以运行。 Android和Flutter应用程序都运行VM(jvm或dart vm),该VM能够即时更改类。


执行Flutter Hot Reload 时,它会执行快速的增量编译步骤,然后将您的dart代码发送到手机上,并在该手机上立即运行它。之所以这么快,部分是因为Flutter在调试模式下运行时会使用JIT编译模型,这意味着编译所花的时间更少,但可能无法优化方法的第一次运行(或前几次运行)。在许多情况下,状态是在变化之间保持不变的,这是因为抖动的工作方式,而不是通过飞镖JIT处理固有的任何方式。对于某些事情(想到静态和initState函数),您实际上必须执行 Full Reload (完全重新加载),该操作会重新初始化应用程序的状态,但仍然几乎是即时的。


用于即时运行的Android Studio非常相似,但始终经过完全编译。 VM具有某种检测功能,因此在调用方法时,VM会检查是否已注入新类。 Instant Run会尽量减少更换。如果它可以简单地替换某些类,那么它将替换,但是它通常需要替换整个活动,有时甚至替换整个应用程序。这是this blog中的一个很好的图表(如果您想更深入地理解,值得阅读): Instant Run Workflow


在功能上,即时运行热重载应该非常相似。但是,在实践中,我发现flutter的 Hot Reload Instant Run 快得多[strong>相当,特别是对于任何大小的应用程序。

此外,我发现与国家打交道的方式比Android活动的方式更适合于重新计算的类。在Flutter中,UI中涉及许多类,每个类都有各自的状态,并且只需更改其中几个即可。另外,在Android中,您倾向于具有更大的“视图”或“活动UI”,这需要花费更多的精力进行替换,并且常常导致重新加载活动,而不仅仅是在这里和那里的类。