android - Flutter 如何将自己的 DartVM 用于原生应用程序
问题描述
我读过 Dart 使用它自己的 DartVM。因此,Flutter 可以在开发您的应用程序和 AOT 时使用 JIT(用于热重载之类的事情)将后者构建为“本机”应用程序(.apk/.ipa)。
根据两个平台的文档(Android/iOS):
提前 (AOT) 编译到本机 ARM 库中
但是,如果应用程序已经通过 Dalvik/ART 运行,Flutter 如何使用它自己的 DartVM,例如在 Android 上?虚拟机是否内置在我们的.apk中,因此可以交付给真正的 Android 设备?
如果 DartVM 不用于最终构建,那么 GC 的东西呢?Flutter 倾向于创建许多短期对象,这对 DartVM 的分代 GC来说很好,但对 ART 来说就不是很好。
解决方案
Flutter 引擎以两种不同的模式使用 Dart VM :
- 在开发时以调试模式运行,该
flutter run
命令监视主机文件系统对 Dart 源的更改,当它检测到此类更改时,快速将 Dart 源编译为内核(中间)格式。然后通过热重载将其同步到设备上运行的引擎,并在 JIT 模式 (Android) 或解释模式 (iOS) 下执行。 - 在配置文件或发布模式下运行,Dart 源代码首先被编译为内核中间形式,然后运行通过
gen_snapshot
,它发出 AOT ARM 机器代码,然后链接到最终的应用程序中。您可以在我们的 wiki 上找到AOT 模式操作的详细说明。
请注意,有一组用 Java 编写的 Android 平台绑定通过 JNI 与引擎交互,但 Flutter 引擎的核心是用 C++ 编写并使用 NDK 构建的,因此这些位不依赖于 Dalvik/ART .
推荐阅读
- c++ - main 已在 main.obj 中定义
- javascript - Grid.MVC 将选定的列数据发送到控制器
- python - 如何确定用于在 Windows 中启动我的 python 脚本的方法?
- docker - 如何将共享卷或共享映像推送到 ECR
- css - Safari 不会渲染字体,但在 chrome 中
- tfs - 是否可以为自定义变量设置条件?
- php - 在 Google Analytics 中调用 reports->batchGet 时 PHP 停止运行(?)
- getstream-io - 当 activity_count 大于 N 时限制聚合提要返回
- c++ - CStdioFile 句柄泄漏
- laravel - 使用 Axios 和 Laravel 上传图片时出现问题