【问题标题】:Difference between Android's Instant Run vs Flutter's Hot Reload and React Native's Hot Reload?Android 的 Instant Run vs Flutter Hot Reload 和 React Native Hot Reload 的区别?
【发布时间】:2019-02-02 15:52:54
【问题描述】:

目前,我正在开发 React Native 项目,当我在运行项目后摇晃手机时,它会为我提供实时更新。因为我也使用过 Flutter,所以它也为我提供了相同的输出。但是,在 Android 中有一个称为 Instant Run 的功能。

我用谷歌搜索了 Instant Run。并且某些结果不同 Instant Run 不是 Android Studio 的 Hot Reload。

所以,我想知道 Instant Run 和 Hot Reload 在工作和功能上的显着差异是什么?

【问题讨论】:

  • “Hot Reload”是网络开发中常用的一个短语。 “Instant Run”是 Android Studio 独有的功能。两者是等价的,但实现方式不同

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


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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


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


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


    在功能上,Instant RunHot Reload 应该非常相似。但是,在实践中,我发现 Flutter 的 Hot Reload相当Instant Run 快很多,尤其是对于任何大小的应用程序。

    此外,我发现 Flutter 处理状态的方式比 Android 活动的工作方式更适合重新计算类。在 Flutter 中,您有许多与 UI 相关的类,每个类都有自己的状态,只需更改其中的几个就非常快。或者,在 Android 中,您往往拥有更大的 Views 或 Activity UI,这需要花费更多精力来替换,并且通常会导致重新加载 Activity,而不仅仅是一个类。

    【讨论】:

    • 当 iOS 不允许时 Flutter 如何进行 JIT 编译?
    • @Pavitra 它只在调试模式下执行 JIT;在发布模式下,它是静态编译的。因此,您将获得两全其美!
    • 我不熟悉 iOS 开发,但 JIT 限制是由操作系统级别强制执行的,还是只是 Apple App Store 政策?
    • @Pavitra 这只是 App Store 的东西。浏览器严重依赖于 JavaScript 的 JIT。
    • 但是我又读到 JS 是个例外……这可能是苹果只允许浏览器使用 WebKit 引擎的原因。
    猜你喜欢
    • 2020-12-06
    • 1970-01-01
    • 2018-09-04
    • 2021-09-30
    • 2019-01-11
    • 1970-01-01
    • 2021-04-03
    • 2018-08-24
    • 2018-10-15
    相关资源
    最近更新 更多