android - flutter pub 在 docker 中获取失败

标签 android flutter docker cirrus-ci

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

我的系统是 m1 mac,配备 macOS 12.6 和

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 cmd,因此无法运行到底

在其他实验中,flutter pub get 失败,尝试使用 diff 架构从干净的 debian 开始

我有一种感觉,cirrusci/flutter 失败是由于与我的系统 arm/m1 有关的一些问题(尽管我的系统是新的/干净的)~ docker 可能无法上网吗?但是 wget https://google.com 可以工作 ~ flutter pub get 使用哪个端口?但即使我运行一个开放的 docker docker run --network host,同样的错误仍然存​​在

最终,我正在尝试为我的 flutter android 应用程序设置 ci

要做什么?为什么 cirrusci/flutter:stable 在 m1 上不起作用?

最佳答案

回答为什么它在 M1 上不起作用

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

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

回答要做什么

Dart 人员没有计划进一步分析这个问题,因为问题出在 qemu 上,并且问题没有在 docker 外部使用 qemu 重现。

还值得注意的是,带有 qemu 的 docker 仅作为尽力而为提供,并且 docker 项目本身也不太可能解决该问题,即使已报告。

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

基本上有两种选择:

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

对于 flutter,这将在一定程度上发挥作用,但接下来你必须解决的是针对 Linux 的基于 ARM 的 Android 构建,这是一个全新的蠕虫 jar 头。参见例如谷歌的 Android 错误跟踪器,Please support Linux aarch64 for building apps以及其他。

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

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

关于android - flutter pub 在 docker 中获取失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73751274/

相关文章:

java - Android 登录线程

偏好 Activity 中的 Android 更新语言

android - 是否可以使用 Flutter 阅读谷歌地图导航通知?

elasticsearch - 在Docker中运行Elasticsearch

python - 如何在 Docker 容器上运行 Python 服务器

python - Docker容器网络偶尔失败

android - 布局按钮,使每个按钮平均分配空间

android - Textview 没有截断文本

flutter - 从火焰游戏导航到 flutter 小部件而不丢失游戏状态

view - 在 flutter 上模态显示自定义 View