扑腾酒吧在码头上失败了



我运行docker pull cirrusci/flutter:stable来获得一个安装了android和flutter的的干净docker

我的系统是带有macOS 12.6和的m1 mac

1m1@1m1s-MacBook-Air ~ % docker --version
Docker version 20.10.17, build 100c701

运行docker run -it image_id /bin/bash会发出警告:

WARNING: The requested image's platform (linux/amd64) does not match the detected host platform (linux/arm64/v8) and no specific platform was requested

在docker内部,flutter --version给出

root@74a20a5b7edf:/# flutter --version
Flutter 3.3.1 • channel unknown • unknown source
Framework • revision 4f9d92fbbd (10 days ago) • 2022-09-06 17:54:53 -0700
Engine • revision 3efdf03e73
Tools • Dart 2.18.0 • DevTools 2.15.0

运行flutter doctor --android-licenses:时出现错误

root@74a20a5b7edf:/# flutter doctor --android-licenses
===== CRASH =====
si_signo=Segmentation fault(11), si_code=1, si_addr=0x7
version=2.18.0 (stable) (Fri Aug 26 10:22:54 2022 +0000) on "linux_x64"
pid=173, thread=217, isolate_group=main(0x400305f000), isolate=main(0x40030d6000)
isolate_instructions=4001ece300, vm_instructions=4001ece300
pc 0x0000ffffa600472b fp 0x00000040103d51f0 Unknown symbol
pc 0x0000ffffa4b37411 fp 0x00000040103d5228 Unknown symbol
pc 0x0000ffffa54561fd fp 0x00000040103d5268 Unknown symbol
pc 0x0000ffffa4b37248 fp 0x00000040103d52c8 Unknown symbol
pc 0x0000ffffa58672e9 fp 0x00000040103d5318 Unknown symbol
pc 0x0000ffffa5d7f3b3 fp 0x00000040103d5360 Unknown symbol
pc 0x0000ffffa5d7f02b fp 0x00000040103d53a0 Unknown symbol
pc 0x0000ffffa5d7ef59 fp 0x00000040103d53c8 Unknown symbol
pc 0x0000ffffa5d7ee7e fp 0x00000040103d5408 Unknown symbol
pc 0x0000ffffa5d22c38 fp 0x00000040103d5448 Unknown symbol
pc 0x0000ffffa6002a0c fp 0x00000040103d54c0 Unknown symbol
pc 0x00000040020464bd fp 0x00000040103d5560 dart::DartEntry::InvokeCode(dart::Code const&, unsigned long, dart::Array const&, dart::Array const&, dart::Thread*)+0x14d
pc 0x00000040020462fc fp 0x00000040103d55c0 dart::DartEntry::InvokeFunction(dart::Function const&, dart::Array const&, dart::Array const&, unsigned long)+0x14c
pc 0x000000400204872c fp 0x00000040103d5610 dart::DartLibraryCalls::HandleMessage(long, dart::Instance const&)+0x14c
pc 0x000000400206fda0 fp 0x00000040103d5ba0 dart::IsolateMessageHandler::HandleMessage(std::__2::unique_ptr<dart::Message, std::__2::default_delete<dart::Message> >)+0x350
pc 0x00000040020992cd fp 0x00000040103d5c10 dart::MessageHandler::HandleMessages(dart::MonitorLocker*, bool, bool)+0x14d
pc 0x00000040020999af fp 0x00000040103d5c60 dart::MessageHandler::TaskCallback()+0x1df
pc 0x00000040021bc868 fp 0x00000040103d5ce0 dart::ThreadPool::WorkerLoop(dart::ThreadPool::Worker*)+0x148
pc 0x00000040021bccbd fp 0x00000040103d5d10 dart::ThreadPool::Worker::Main(unsigned long)+0x6d
pc 0x000000400212f488 fp 0x00000040103d5dd0 /sdks/flutter/bin/cache/dart-sdk/bin/dart+0x212f488
-- End of DumpStackTrace
qemu: uncaught target signal 6 (Aborted) - core dumped
Aborted

事实上,Dockerfile(https://github.com/cirruslabs/docker-images-flutter/blob/master/sdk/Dockerfile)具有flutter doctor --android-licenses作为最后一个RUN命令,因此无法运行到结束

在其他实验中,flutter pub get失败了,试图从一个干净的debian开始,使用不同的体系结构

我有一种感觉,cirrusci/flutter正在失败,因为我的系统是arm/m1(尽管我的系统很新/很干净(~码头工人可能没有上网吗?但wget https://google.com有效~flutter pub get使用哪个端口?但是,即使我运行了一个开放的dockerdocker run --network host,仍然存在同样的错误

最终,我正在尝试为我的flutter安卓应用设置ci

该怎么办?为什么cirrusci/flutter:stable不适用于m1?

回答为什么它不能在M1上工作

正如您自己所注意到的,您正在启动一个基于为另一个平台构建的镜像的docker构建,即您正在运行arm64,但镜像是linux/aamd64。这意味着docker将运行它,但使用一个仿真层,即qemu

Dart和qemu之间的一些不兼容似乎是问题所在。在您发布的stacktrace中,当Dart运行时尝试执行InvokeCode()时,qemu崩溃。这实际上是一个报告的问题,例如参见

  • dart-lang-github问题:在Mac M1上构建linux/amd64 Docker镜像(我认为最相关(
  • flutter github:基于ubuntu:18.04崩溃构建flutter(3.0.3(docker镜像
  • 另一个颤振问题:无法"发布升级"颤振工具

回答该做什么

Dart的人没有计划对此进行进一步分析,因为问题出在qemu身上,而这个问题并没有在docker之外的qemu中重现。

同样值得注意的是,提供带有qemu的docker只是为了尽最大努力,即使有报道,docker项目本身也不太可能解决这个问题。

我没有找到qemu本身的归档问题。

基本上有两种选择:

在没有qemu的情况下做这件事,这意味着在linux/arm64容器中构建

这将在一定程度上适用于flutter,但接下来你必须解决的问题是为linux构建基于arm的android,这是一个全新的蠕虫。例如,请参阅谷歌的android bug跟踪器,请支持Linux aarch64来构建应用程序和其他应用程序。

在没有arm/M1硬件的情况下进行构建

尽管意识到这一点很可悲,但在这种情况下,不交叉构建可能是一个简单的解决方案,至少对于带有android构建目标的flutter来说是这样。如果你想向可能不运行M1的同事和/或CI提供与英特尔兼容的docker映像,这可能也是一个合乎逻辑的映像。最终,这是一个问题,你的参考构建平台是什么

最新更新