我已经搜索了一段时间,一个很好的解决方案,但似乎没有很多其他人与我有相同的设置。
我的设置包括一台低规格的笔记本电脑(Suce Pro 3)和一台运行 ProxMox(这是我的 Ubuntu 22.04 开发虚拟机所在的位置)的服务器(更高的规格)。
我想要实现的是使用 VS Code 远程开发使用远程开发在服务器上开发 Flutter 应用程序,同时在我的 Suce 上查看应用程序的输出。我的表面本身不够强大,无法很好地运行 Android 模拟器,所以如果服务器可以处理繁重的工作并将视觉输出转发到我的 Suce,那将是非常棒的。
我目前唯一的成功是通过将 Flutter 应用程序作为 Web 服务器运行,然后使用 Dart 调试扩展通过 Chrome 访问实例。这不是很理想。我的一部分认为我可能必须使用物理 Android 设备并将 ADB 转发到它或其他东西,但我不确定这是否是最好的选择。
我会感谢任何帮助,谢谢。
VS Code 确实可以用于远程开发,我能够使用code-server
和一堆 SSH 转发来实现所描述的工作流。
在这里,我将介绍如何使用用于构建和调试任务的远程机器,以及用于访问编辑器 GUI 和连接物理设备的本地机器,在 Flutter上为Android 开发设置code-server
。
已在 Ubuntu 22.04(服务器),Fedora 36(本地)和 Flutter 3.0.5 上验证。
在远程计算机上安装软件和 SDK
1.从official repo安装code-server
重要:安装code-server
后,告诉您通过运行systemctl
命令使 systemd 自动启动服务器。避免这样做,因为 VS Code 下的 ADB 不会检测到设备。我还没有想出任何解决方法,以使其在 systemd 管理的实例下工作。
2.安装 Flutter SDK 并更新您的PATH
您的系统可能还需要额外的依赖关系才能运行 Flutter SDK。我建议从official manual了解它。更喜欢那里描述的手动安装方式。
安装完成后,更新~/.bashrc
中的PATH
变量以包含 Flutter SDK 的/bin
文件夹,例如,添加如下行:
export PATH="$PATH:$HOME/path/to/flutter/bin"
之后,应用更改:
source ~/.bashrc
3.安装 Android 工具链
我假设您的服务器没有任何桌面环境,因此我们将在没有 Android Studio 的情况下安装 Android 工具链(因为 Studio 需要 DE 才能运行)。
转到Android Studio website并下载“仅命令行工具”。在所需位置使用unzip
命令解压缩它们。我建议在解压缩存档时创建此文件夹结构:
~/path/to/android-sdk/cmdline-tools
这样,当sdkmanager
下载其软件包时,将在android-sdk
文件夹中创建新文件夹。
截至 2022 年 8 月,Android 命令行工具中的sdkmanager
需要一个特殊的文件夹层次结构,这可以通过使用以下命令将cmdline-tools
文件夹的内容放入latest
文件夹中来实现:
mv ./cmdline-tools/ ./latest && mkdir cmdline-tools && mv ./latest/ ./cmdline-tools/latest/
将工具添加到.bashrc
中的PATH
,并通过添加新行指定ANDROID_SDK_ROOT
:
export ANDROID_SDK_ROOT="$HOME/path/to/android-sdk"
export PATH="$PATH:$ANDROID_SDK_ROOT/cmdline-tools/latest/bin:$ANDROID_SDK_ROOT/platform-tools"
别忘了运行source ~/.bashrc
Flutter SDK 需要安装两个包:build-tools
和platform-tools
。
sdkmanager "build-tools;33.0.0" "platform-tools"
33.0.0
是截至 2022 年 8 月的build-tools
的最新版本。通过运行以下命令了解build-tools
的最新版本:
sdkmanager --list | grep build-tools
运行sdkmanager --licenses
并按y
键接受所有许可证
VS 代码设置
安装code-server
后,您现在可以从浏览器访问编辑器。
还建议将其安装为 PWA,这样您将有更多的屏幕空间,更多的键盘快捷键选项以及从系统启动器启动编辑器的能力。
安装颤振扩展
将这些设置添加到 VS Code 用户设置:
{
"dart.flutterRunAdditionalArgs": [
// Dart Developer Service port (de)
"--dds-port=10388",
// Dart VM Service instance port (device)
"--host-vmservice-port=10389"
],
"dart.devToolsPort": 9100,
}
默认情况下,Dart 为调试器和设备之间的连接选择随机端口。通过设置这些设置,我们可以使端口保持静态,因此我们可以轻松地转发它们。
如果您的浏览器或 adblocker 阻止“本地网络入侵”,您可能希望将dart.devToolsLocation: external
添加到您的配置中,也就是阻止网站访问本地主机端口。不过,我建议您将code-server
实例添加到异常中。
在本地计算机上使用 SSH 进行端口转发
要使用 Flutter 调试 Android 应用程序,我们将不得不转发 4 个端口。该表列出了根据上面的 VS Code 设置的端口号。您可以使用自己的端口号,但随后必须相应地更改 configs。
命令
SSH 可用于转发端口。
要将端口从 localhost 转发到远程主机,请在本地计算机上运行:
ssh -R XXXX:localhost:XXXX user@host
要将端口从远程主机转发到 localhost,请在本地计算机上运行:
ssh -L XXXX:localhost:XXXX user@host
您可以将选项链接到ssh
命令,例如:
ssh -R 5037:localhost:5037 -L 10388:localhost:10388 -R 10389:localhost:10389 -L 9100:localhost:9100 user@host
在您关闭 SSH 连接之前,端口转发将处于活动状态。
确保您的防火墙设置为允许端口转发。
自动化脚本
我做了一个脚本,自动化过程中可能的怪癖:
杀死本地 ADB 并重新启动它以释放使用的端口
为到远程主机的指定端口设置端口转发。该脚本要求您使用密钥进行 SSH 身份验证。
杀死code-server
、node
和adb
的所有正在运行的实例。
启动 ADB 并启动code-server
。
打算在本地计算机上运行。
#!/bin/bash
# Remote machine
CE_MACHINE="user@host"
# Local machine, no need to change
CE_LOCALHOST="localhost"
# Default port for ADB daemon is 5037
CE_ADB_PORT="5037"
# You might need to specify exact path to adb on your
# remote system since .bashrc is not sourced for
# non-interactive sessions (see https://stackoverflow.com/a/6212684)
CE_ADB_EXECUTABLE="~/dev/tools/android-sdk/platform-tools/adb"
# "Dart Developer Service port
CE_DDS_PORT="10388"
# Dart VM Service instance port
CE_HOST_VMSERVICE_PORT="10389"
# Flutter DevTools port
CE_DEVTOOLS_PORT="9100"
#### VSCode Settings ####
# "dart.flutterRunAdditionalArgs": [
# "--dds-port=10388",
# "--host-vmservice-port=10389",
# ],
# "dart.devToolsPort": 9100
#### VSCode Settings ####
# Reset ADB on local machine
# so it releases used ports
killall adb
adb devices
# When `adb devices` is called, ADB checks the daemon port.
# If it detects there's no response on the port, it
# launches a new daemon.
#
# After killing ADB and forwarding the ADB port to local machine,
# a newly launched ADB client will bind to the existing connection
# (which is our physical device) instead of launching a daemon on
# the remote machine.
#
# Restart code-server
# ADB doesn't detect devices if code-server is managed by systemctl
# WARNING, killing all codee-server, Node, Dart, and ADB processes here. Customize if needed.
#
# 1. ADB forwarding Local -> Remote
# 2. Dart Dev Server forwarding Remote -> Local
# 3. Dart on-device de client forwarding Local -> Remote
# 4. Flutter DevTools Remote -> Local forwarding
ssh -R $CE_ADB_PORT:$CE_LOCALHOST:$CE_ADB_PORT \
-L $CE_DDS_PORT:$CE_LOCALHOST:$CE_DDS_PORT \
-R $CE_HOST_VMSERVICE_PORT:$CE_LOCALHOST:$CE_HOST_VMSERVICE_PORT \
-L $CE_DEVTOOLS_PORT:$CE_LOCALHOST:$CE_DEVTOOLS_PORT \
$CE_MACHINE "killall code-server; killall node; killall dart; killall adb; $CE_ADB_EXECUTABLE devices; code-server"
有时连接可能会意外断开,因此端口会很忙,并且转发将无常工作。您可以将adb devices
行之后的这些行添加到上面的脚本中:
payload() {
cat <<EOF
for port in $CE_ADB_PORT $CE_DDS_PORT $CE_HOST_VMSERVICE_PORT $CE_DEVTOOLS_PORT; do
pid="\$(ss -tulpn | grep ":\$port" | grep -Po 'pid=\\d+,' | grep -Po '\\d+' | uniq)"
if [ ! -z \$pid ]; then
kill "\$pid"
fi
done
EOF
}
if [ ! -z "$1" ]; then
payload | ssh $CE_MACHINE /bin/bash
fi
添加代码后,如果将任何参数传递给脚本,它将尝试释放远程计算机上使用的端口(例如script.sh kill
)。
此代码枚举使使用的端口保持繁忙状态的进程,然后将其杀死。
本站系公益性非盈利分享网址,本文来自用户投稿,不代表码文网立场,如若转载,请注明出处
评论列表(66条)