如何替换 Flutter 中捆绑的 Dart SDK 以在 Apple Silicon (ARM64) 上原生运行?
Posted
技术标签:
【中文标题】如何替换 Flutter 中捆绑的 Dart SDK 以在 Apple Silicon (ARM64) 上原生运行?【英文标题】:How to replace the bundled Dart SDK in Flutter to run natively on Apple Silicon (ARM64)? 【发布时间】:2021-11-15 07:44:06 【问题描述】:Dart SDK 正式支持 ARM64,截至目前,2.14.2 是支持 ARM64 的最新(稳定)Dart SDK。虽然它与我的 Flutter 设置中捆绑的版本相同,但它似乎在 Intel 架构上运行(活动监视器显示在 Intel 上运行的 dart 进程)。
我手动尝试在我的 Flutter 安装中替换 dart SDK,将 flutter-directory/bin/cache/dart-sdk/
替换为从 dart.dev archive 下载的为 ARM64 制作的 Dart SDK 的 zip 文件的内容。但是尝试在 android 模拟器上运行应用程序(在 ARM64 上运行并且正在使用我的旧 Flutter 设置),会引发此错误:
Launching lib/main.dart on sdk gphone64 arm64 in debug mode...
lib/main.dart:1
Snapshot not compatible with the current VM configuration: the snapshot requires 'release no-code_comments
no-dwarf_stack_traces_mode lazy_async_stacks lazy_dispatchers
use_bare_instructions no-dedup_instructions
no-"asserts" "use_field_guards" "use_osr" x64-sysv no-null-safety' but the VM has 'release no-code_comments no-
dwarf_stack_traces_mode lazy_async_stacks
lazy_dispatchers use_bare_instructions no-dedup_instructions no-"asserts" "use_field_guards" "use_osr" arm64-sysv no-null-safety'
2
the Dart compiler exited unexpectedly.
有没有其他方法可以在 M1 设备上进行完全 ARM64 Flutter 设置?
Flutter 2.5.1 版
Dart 版本 2.14.2
设备:MacBook Air(M1,2020)
【问题讨论】:
【参考方案1】:更新:如果你使用主通道,flutter 会为你下载 ARM SDKs
在 M1 上,由于 flutter-2.11-candidate.7
Flutter 默认附带 ARM SDK。
旧答案:
-
直接从 dart.dev 下载 dart sdk:https://dart.dev/get-dart/archive -
解压后,您会看到一个
dart-sdk
文件夹
进入你的flutter安装根目录,输入这个路径:flutter-sdk-root/bin/cache
将上一步中的 dart-sdk
替换为您下载的那个
现在,这部分很老套,所以我不能保证它会一直有效。
如果你现在尝试运行应用程序,dart 编译器会崩溃。
使用flutter run -v
(启用详细模式,以获取更多日志),多亏了几次谷歌查找,我才发现问题是由位于两个地方的名为frontend_server.dart.snapshot
的快照文件引起的在 SDK 中:
flutter/bin/cache/dart-sdk/bin/snapshots
- 针对 arm 的新快照,您刚刚将其粘贴到此处
flutter/bin/cache/artifacts/engine/darwin-x64
- 仍然是x64
的旧快照
-
将名为
frontend_server.dart.snapshot
的文件从上述第一个路径复制到第二个路径,替换旧文件
我已经运行了一个非常随意的测试,让我感受一下 hello world 应用程序的编译时间是否有任何改进。我所说的随意是指我没有关闭任何后台程序。
测试过程如下:
在 ios 模拟器上运行应用程序 杀死应用并运行flutter clean 再次运行应用并记下构建时间而且初步结果很有希望:
~17s - 16" mbp i9 ~16 秒 - 通过罗塞塔空气 m1 ~12s - 空气 m1 原生 ~11s - 14" mbp m1 max native$ dart --version
Dart SDK version: 2.15.0-116.0.dev (dev) (Thu Sep 16 09:47:01 2021 -0700) on "macos_arm64"
$ flutter --version
Flutter 2.6.0-11.0.pre • channel dev • https://github.com/flutter/flutter.git
Framework • revision 4b330ddbed (5 weeks ago) • 2021-09-16 17:29:58 -0700
Engine • revision 5b81c6d615
Tools • Dart 2.15.0 (build 2.15.0-116.0.dev)
【讨论】:
确实有效。应该被接受为正确答案。非常感谢。 在 M1 Max 上也适用于我 ?? 它可以在我的机器上运行!谢谢? 它适用于flutter 2.8和dart 2.15 替换文件后得到Can't load Kernel binary: Invalid SDK hash.
【参考方案2】:
它似乎还不能与 Flutter 一起使用,如下所示:
Dart SDK 中的 Apple Silicon 支持
[...] 请注意,Dart SDK 捆绑在 Flutter SDK 中还没有这些改进。
https://medium.com/dartlang/announcing-dart-2-14-b48b9bb2fb67
[宣布 Dart 2.14][ScreenShot]:https://i.stack.imgur.com/N8Qcc.png
还有:
获取 Dart SDK
[...] 从 Flutter 1.21 开始,Flutter SDK 包含完整的 Dart SDK。所以如果你安装了 Flutter,你可能不需要显式下载 Dart SDK。考虑 如果满足以下任一条件,则下载 Dart SDK:
你不使用 Flutter。 您使用的是 1.21 之前的 Flutter 版本。 你想要 减少磁盘空间要求或下载时间,以及您的用例 不需要 Flutter。 例如,您可能有一个连续的 需要 Dart 但不需要 Flutter 的集成 (CI) 设置。
https://dart.dev/get-dart
[获取 Dart SDK][ScreenShot]:https://i.stack.imgur.com/rawJV.png
【讨论】:
【参考方案3】:使用此处的其他答案,我创建了flutter_m1_patcher。
获取 Flutter 捆绑的 Dart SDK 版本,替换为 arm64 版本。
【讨论】:
谢谢你,让生活更轻松!该软件包不支持通过fvm
安装的不同 Flutter 版本 - 为了更新不同的版本,我通过键入 fvm global
切换 fvm 默认值,选择版本然后运行 flutterpatch
命令。
从 1.5 版开始,现在可以使用 -p
option 设置 Flutter 的路径。感谢更新! :)
为我工作,谢谢以上是关于如何替换 Flutter 中捆绑的 Dart SDK 以在 Apple Silicon (ARM64) 上原生运行?的主要内容,如果未能解决你的问题,请参考以下文章
[Flutter] 如何替换so文件来动态替换Flutter代码
如何在Flutter中读取音频扩展并在ListView中显示?
flutter - 如何在 dart/flutter 中收听流值