Android 的 Instant Run vs Flutter Hot Reload 和 React Native Hot Reload 的区别?
Posted
技术标签:
【中文标题】Android 的 Instant Run vs Flutter Hot Reload 和 React Native Hot Reload 的区别?【英文标题】:Difference between Android's Instant Run vs Flutter's Hot Reload and React Native's 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 独有的功能。两者是等价的,但实现方式不同 【参考方案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 Run 和 Hot 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 引擎的原因。以上是关于Android 的 Instant Run vs Flutter Hot Reload 和 React Native Hot Reload 的区别?的主要内容,如果未能解决你的问题,请参考以下文章
Android Studio 3.3 中缺少 Instant Run
如何为 Android Studio 3.0 禁用 Instant Run
Instant Run requires 'Tools | Android | Enable ADB integration' to be enabled.
WebView JavaScript 接口似乎只能通过 Android Studio 的 Instant-Run 工作,但不能通过常规 gradle 编译