程序开发开发:使用VSCode远程开发开发Flutter应用程序

关于程序开发开发的问题,在android studio remote development中经常遇到, 我已经搜索了一段时间,一个很好的解决方案,但似乎没有很多其他人与我有相同的设置。

我已经搜索了一段时间,一个很好的解决方案,但似乎没有很多其他人与我有相同的设置。

我的设置包括一台低规格的笔记本电脑(Suce Pro 3)和一台运行 ProxMox(这是我的 Ubuntu 22.04 开发虚拟机所在的位置)的服务器(更高的规格)。

我想要实现的是使用 VS Code 远程开发使用远程开发在服务器上开发 Flutter 应用程序,同时在我的 Suce 上查看应用程序的输出。我的表面本身不够强大,无法很好地运行 Android 模拟器,所以如果服务器可以处理繁重的工作并将视觉输出转发到我的 Suce,那将是非常棒的。

我目前唯一的成功是通过将 Flutter 应用程序作为 Web 服务器运行,然后使用 Dart 调试扩展通过 Chrome 访问实例。这不是很理想。我的一部分认为我可能必须使用物理 Android 设备并将 ADB 转发到它或其他东西,但我不确定这是否是最好的选择。

我会感谢任何帮助,谢谢。

6

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-toolsplatform-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-servernodeadb的所有正在运行的实例。

启动 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)。

此代码枚举使使用的端口保持繁忙状态的进程,然后将其杀死。

本站系公益性非盈利分享网址,本文来自用户投稿,不代表码文网立场,如若转载,请注明出处

(73)
Cdr箭头符号在哪里:符号etext edata和end在哪里定义
上一篇
欧盟ce认证费用:AzureDatadog欧盟下文
下一篇

相关推荐

发表评论

登录 后才能评论

评论列表(66条)