【问题标题】:How does Dart/Flutter get compiled to Android?Dart/Flutter 如何编译到 Android 上?
【发布时间】:2019-01-27 14:05:51
【问题描述】:

我在这方面找不到任何具体的资源,Dart 是否被编译到 JVM,或者 Google 的团队是否编译了 Dart VM 以在 JVM 上运行,然后在 JVM 内部的 Dart VM 中运行 Dart?

前者更有意义,它符合“无桥”的口头禅,但后者似乎更符合how integration between native & flutter code looks like

【问题讨论】:

    标签: android dart flutter jvm


    【解决方案1】:

    Dart 被编译为可执行的本机机器代码(ARM、Intel、...),并与一些本机平台代码(Java、Kotlin、Objective-C/Swift)捆绑以与本机平台交互。

    另见

    Flutter 如何在 Android 上运行我的代码?引擎的 C 和 C++ 代码

    使用 Android 的 NDK 编译。 Dart 代码(SDK 和 yours) 被提前 (AOT) 编译成原生的 ARM 库。 该库包含在“运行器”Android 项目中,并且整个 东西内置在APK中。启动时,应用程序会加载 Flutter 图书馆。任何渲染、输入或事件处理等都是 委托给编译好的 Flutter 和 app 代码。这类似于 许多游戏引擎的工作方式。

    调试模式构建使用虚拟机 (VM) 来运行 Dart 代码(因此 他们展示的“调试”横幅提醒人们他们有点 较慢)以启用有状态的热重载。

    Flutter 如何在 iOS 上运行我的代码?引擎的 C 和 C++ 代码是

    使用 LLVM 编译。 Dart 代码(SDK 和你的)是 提前 (AOT) 编译到本机 ARM 库中。那个图书馆 包含在一个“跑步者”iOS项目中,整个东西都构建好了 进入.ipa。启动时,应用程序会加载 Flutter 库。任何 渲染、输入或事件处理等都委托给 编译 Flutter 和应用程序代码。这类似于许多游戏的方式 引擎工作。

    调试模式构建使用虚拟机 (VM) 来运行 Dart 代码(因此 他们展示的“调试”横幅提醒人们他们有点 较慢)以启用有状态的热重载。

    https://flutter.io/docs/resources/faq#how-does-flutter-run-my-code-on-android

    另见https://proandroiddev.com/flutters-compilation-patterns-24e139d14177

    【讨论】:

    • 这里提到dart代码被编译成原生ARM库。为什么它被称为库而不是应用程序?并且可以编译成非ARM库吗? ARM 不是唯一适用于安卓的芯片吗?
    • @BenB 我猜这是因为Android应用程序不仅仅是一个exe文件。它是一个 APK,由几个组件组成。 flutter.dev/docs/resources/faq#run-android 可能会提供更多见解。
    • 感谢您的回复,我想我现在才看到它。除非我忘记了这一切?
    • 但是在这里 - dart.dev/overview#runtime 被告知“在本机平台上,Dart 运行时自动包含在自包含的可执行文件中,并且是 dart run 命令提供的 Dart VM 的一部分。” .所以看起来它甚至在生产构建中也使用了 VM。
    • @user2134488 运行时并不意味着虚拟机。运行时例如垃圾收集器。 VM 仅在解释代码时(在开发期间)使用,当它编译为二进制时,不使用 VM。
    【解决方案2】:

    有时你一问就马上找到答案-_- Found this reddit answer

    两者都有!

    开发时,Flutter 使用 VM,因此您可以获得诸如此类的好东西 热重载。但对于 production,它会编译 (AOT) 为 native ARM 库然后使用 Android 上的 NDK 和 iOS 上的 LLVM 嵌入 本机应用程序(跑步者)。

    这就是您在右上角看到调试/慢速模式横幅的原因, 请记住,您正在使用虚拟机。

    查看https://flutter.io/faq/#technology

    还有https://www.youtube.com/watch?v=FUxV4MIhS3g

    附:这并不意味着 Dart VM 不适合生产环境 环境中,您仍然可以在服务器端或长时间运行的环境中使用它 任务,就像 JVM、CRL、Node.js 等。我个人将它用于 HTTP API,非常喜欢它。

    【讨论】:

      猜你喜欢
      • 2020-08-17
      • 2021-03-20
      • 2020-04-08
      • 2018-10-11
      • 2022-01-25
      • 1970-01-01
      • 2021-09-18
      • 2021-09-16
      • 2021-03-10
      相关资源
      最近更新 更多