Android Studio 如何使用 Flatpak Chromium 运行 Flutter?
可以用可执行脚本连接 Flutter 和 Flatpak
将 CHROME_EXECUTABLE 指向宿主机上的可执行脚本,让脚本调用 flatpak run,并将 Flutter 传入的参数完整转交给 Ungoogled Chromium。可执行脚本可以用作这个配置的启动入口。
不要把 CHROME_EXECUTABLE 直接设置为 flatpak run ...:Flutter 会把它作为可执行文件路径处理,不会解析整条 shell 命令。
这样可以解决浏览器发现和启动入口的问题。能否完成调试,还取决于 Flatpak 的网络和文件权限,以及浏览器对远程调试的支持。
日志说明了什么
当前环境中,Android Studio 通过 Pacman 安装,浏览器通过 Flatpak 安装。日志中的错误是:
[✗] Chrome - develop for the web (Cannot find Chrome executable at google-chrome)
! Cannot find Chrome. Try setting CHROME_EXECUTABLE to a Chrome executable.
Flutter 没有在宿主环境中找到默认的 Chrome 启动入口,所以 Chrome 没有出现在设备列表中。
CMake is required for Linux development 属于 Linux desktop 工具链检查。运行 Flutter Web 不需要先解决这项报错。
Flutter 启动浏览器时会传入 --user-data-dir、--remote-debugging-port 等参数,因此包装脚本必须保留这些参数。相关逻辑可见 Flutter 浏览器启动源码。
1. 确认 Flatpak 应用 ID
先查看已安装的应用:
flatpak list --app
Flathub 的 Ungoogled Chromium 包使用以下应用 ID:
io.github.ungoogled_software.ungoogled_chromium
后续示例使用这个 ID。如果本机显示的 ID 不同,请按实际结果替换。
2. 创建启动脚本
创建目录:
mkdir -p "$HOME/.local/bin"
将下面的内容保存到 ~/.local/bin/flutter-chromium:
#!/bin/bash
set -e
app_id='io.github.ungoogled_software.ungoogled_chromium'
flatpak_options=(--share=network)
# 让沙箱能够访问 Flutter 创建的浏览器配置目录。
for arg in "$@"; do
case "$arg" in
--user-data-dir=*)
profile_dir="${arg#--user-data-dir=}"
flatpak_options+=("--filesystem=$profile_dir")
;;
esac
done
exec flatpak run "${flatpak_options[@]}" "$app_id" "$@"
赋予执行权限:
chmod +x "$HOME/.local/bin/flutter-chromium"
脚本中的 "$@" 会逐个保留原始参数,避免路径中的空格或其他字符被重新拆分。
脚本还设置了两项沙箱权限:
--share=network:共享宿主机网络,使浏览器能够访问本地开发服务,Flutter 能够连接浏览器的调试端口。--filesystem=...:按 Flutter 传入的--user-data-dir=...开放对应目录,避免宿主机和沙箱看到不同的临时配置目录。
这些参数只作用于此次启动。Flatpak 的文件访问和网络共享选项见 Flatpak 命令参考。文档也说明,宿主机 /tmp 默认不会因 host 等权限而自动开放,参见沙箱文件权限说明。
脚本按 Flutter 常见的 --user-data-dir=路径 参数形式编写。如果详细日志显示参数形式不同,应相应调整。
3. 在终端验证浏览器入口
设置环境变量,值应为脚本的绝对路径:
export CHROME_EXECUTABLE="$HOME/.local/bin/flutter-chromium"
"$CHROME_EXECUTABLE" --version
flutter doctor -v
flutter devices
配置生效后,flutter devices 应能列出 Chrome Web 设备。即使实际启动的是 Ungoogled Chromium,设备名称也可能显示为 Chrome。
然后在 Flutter 项目目录中运行:
flutter run -d chrome
设备被发现并不代表调试已经成功。如果设备已出现,但启动失败,可查看详细日志:
flutter run -d chrome -v
检查浏览器是否报告配置目录不可写、远程调试启动失败或连接失败。浏览器窗口打开并不能证明 Flutter 已经连接成功。
4. 让 Android Studio 继承环境变量
终端里的 export 不会改变已经运行的 Android Studio 的环境变量。
完全退出 Android Studio,再从设置好 CHROME_EXECUTABLE 的同一个终端启动它。例如,如果本机的启动命令是 android-studio:
export CHROME_EXECUTABLE="$HOME/.local/bin/flutter-chromium"
android-studio
启动命令以本机安装情况为准。重新打开项目并等待设备列表刷新后,选择 Chrome 运行。
如果希望以后从桌面图标启动也能生效,需要在桌面会话或 Android Studio 启动入口中设置同一个环境变量。只写入 .bashrc 或 .zshrc 未必能影响桌面启动的程序。
5. 仅在项目缺少 Web 支持时补充配置
原始信息只说明项目没有配置 Linux desktop,无法据此判断是否缺少 Web 支持。
如果项目确实没有 web/ 目录,可先提交或备份现有改动,再在项目根目录执行:
flutter create . --platforms web
随后检查生成的文件。Flutter 官方文档说明,这个命令可为现有项目添加 Web 启动资源,参见为现有项目添加 Web 支持。
无法连接调试时,用 web-server 运行
如果包装脚本能够启动浏览器,但当前 Flatpak 包或浏览器配置仍无法完成远程调试,可以先运行:
flutter run -d web-server
再在 Ungoogled Chromium 中手动打开终端输出的本地 URL。这种方式绕过了 Flutter 自动启动 Chrome 的流程,但调试支持有限,无法完全替代 Android Studio 的 Chrome 调试体验,参见 Flutter Web 环境配置说明。
如果需要持续使用 IDE 的运行和断点调试功能,而 Flatpak 方案一直无法连接,也可以使用宿主机安装的兼容浏览器,并将 CHROME_EXECUTABLE 指向它的可执行文件。
备注:内容仅供参考。
