菜单

跨平台支持

相关源文件

本文详细介绍了 v2rayN 如何支持包括 Windows、Linux 和 macOS 在内的多种操作系统。它涵盖了架构、平台检测、特定平台实现以及跨平台部署的构建系统。

有关 v2rayN 整体架构的信息,请参阅架构

平台支持概述

v2rayN 通过两个主要项目组件提供对多种操作系统的支持:

  1. v2rayN - 原始的基于 WPF 的 Windows 专用应用程序
  2. v2rayN.Desktop - 使用 Avalonia UI 框架实现的跨平台版本,支持 Windows、Linux 和 macOS

跨平台策略结合了共享服务库、特定平台实现和条件代码执行路径。

来源: .github/workflows/build-windows.yml .github/workflows/build-windows-desktop.yml .github/workflows/build-linux.yml .github/workflows/build-osx.yml

跨平台架构

v2rayN 中的跨平台实现基于分层架构,将平台无关的业务逻辑与特定平台实现分离。

架构图

来源: v2rayN/ServiceLib/Handler/SysProxy/SysProxyHandler.cs v2rayN/ServiceLib/Handler/SysProxy/ProxySettingOSX.cs v2rayN/ServiceLib/Common/Utils.cs

组件职责

组件描述
ServiceLib包含平台无关业务逻辑的共享核心库
v2rayNWindows 专用 WPF 应用程序
v2rayN.Desktop跨平台 Avalonia UI 应用程序
平台检测用于检测和处理平台差异的实用方法
系统代理处理器 (SysProxy Handlers)系统代理配置的特定平台实现
进程处理特定平台的进程管理
AmazTool跨平台更新工具

来源: v2rayN/ServiceLib/Handler/CoreHandler.cs v2rayN/AmazTool/Program.cs

平台检测与抽象

v2rayN 使用运行时信息检测当前操作系统并相应地执行特定平台代码路径。

平台检测机制

平台检测在 Utils 类中实现,通过简单的方法检查当前平台。

这些方法在整个代码库中用于有条件地执行特定平台代码。

来源: v2rayN/ServiceLib/Common/Utils.cs797-805

关键平台抽象方法

v2rayN 实现了几个抽象平台差异的实用方法:

方法目的
GetExeName(string name)在 Windows 上返回带 .exe 扩展的可执行文件名称,在其他平台上只返回名称
GetPath(string fileName)提供跨平台兼容的文件路径
StartupPath()返回应用程序的启动目录,考虑到平台差异
SetLinuxChmod(string fileName)在 Linux/macOS 文件上设置可执行权限
GetHomePath()以平台无关的方式获取用户主目录

来源: v2rayN/ServiceLib/Common/Utils.cs807-862

特定平台实现

系统代理配置

最依赖平台的特性之一是系统代理配置,它针对每个操作系统都有不同的实现。

SysProxyHandler.UpdateSysProxy() 方法包含条件代码,根据当前操作系统决定使用哪个特定平台实现。

来源: v2rayN/ServiceLib/Handler/SysProxy/SysProxyHandler.cs7-98 v2rayN/ServiceLib/Handler/SysProxy/ProxySettingOSX.cs1-37

核心进程管理

核心进程管理是另一个存在显著平台差异的领域。

进程处理的关键特定平台方面包括:

  1. Windows 专用:使用作业对象(Job objects)管理子进程
  2. Linux/macOS 专用:设置文件可执行权限 (chmod)
  3. Linux 专用:以 sudo 运行 TUN 模式进程
  4. 路径差异:处理可执行文件扩展名(Windows 上的 .exe)

来源: v2rayN/ServiceLib/Handler/CoreHandler.cs239-322 v2rayN/ServiceLib/Handler/CoreHandler.cs326-408

文件系统操作

文件系统操作也存在特定平台的考虑因素。

  1. 路径分隔符:Windows 使用反斜杠,Linux/macOS 使用正斜杠
  2. 存储位置:每个平台上的应用程序数据约定不同
  3. 文件权限:在 Linux/macOS 上设置可执行权限
  4. 主目录:不同的位置和环境变量

Utils 类提供了抽象这些差异的方法。

来源: v2rayN/ServiceLib/Common/Utils.cs714-739

构建系统与分发

v2rayN 使用 GitHub Actions 为多个平台构建和打包应用程序。

构建系统概述

来源: .github/workflows/build-windows.yml .github/workflows/build-windows-desktop.yml .github/workflows/build-linux.yml .github/workflows/build-osx.yml

特定平台构建命令

对于每个平台,构建过程都使用 .NET 发布来创建特定平台的构建版本。

Windows (WPF):

Windows/Linux/macOS (Avalonia):

构建版本使用不同的运行时标识符(win-x64linux-x64osx-x64 等),并且可以配置为自包含或依赖于框架。

来源: .github/workflows/build-windows.yml37-45 .github/workflows/build-linux.yml40-45 .github/workflows/build-osx.yml40-45

特定平台打包

每个平台都有自己的打包脚本和格式。

平台包格式打包工具
WindowsZIP7-Zip
LinuxDebian (.deb)、AppImage、ZIPdpkg-deb、pkg2appimage
macOSDMG、ZIPcreate-dmg

Linux Debian 包创建:打包过程创建 Debian 控制文件和桌面集成。

macOS DMG 创建:对于 macOS,应用程序被打包为包含所需 Info.plist 的 .app 捆绑包。

来源: package-debian.sh1-58 package-osx.sh1-58 package-appimage.sh1-15

平台特定考量

系统代理设置

每个平台都有不同的系统代理例外项。

来源: v2rayN/ServiceLib/Global.cs63-64

应用程序更新

更新机制使用 AmazTool 工具,该工具针对所有支持的平台进行编译。

来源: v2rayN/AmazTool/UpgradeApp.cs1-116 v2rayN/AmazTool/Utils.cs1-52

Linux 特定功能

Linux 具有几个特定平台的功能:

  1. Shell 脚本:使用 bash 脚本进行系统操作
  2. 提权:使用 sudo 或 pkexec 进行需要 root 权限的操作
  3. 自启动配置:与 Windows 不同的自启动机制
  4. TUN 模式:Linux 上 TUN 模式的特殊处理

应用程序包含用于 Linux 操作的嵌入式 shell 脚本。

来源: v2rayN/ServiceLib/Global.cs40-42 v2rayN/ServiceLib/Handler/CoreHandler.cs328-342

macOS 特定功能

macOS 也有特定平台的考虑因素:

  1. 应用程序捆绑包:带有 Info.plist 的正确 .app 捆绑包结构
  2. 系统代理:使用 macOS 专用的系统代理命令
  3. 文件权限:设置二进制文件的执行权限

例如,macOS 系统代理使用专用 shell 脚本设置。

来源: v2rayN/ServiceLib/Handler/SysProxy/ProxySettingOSX.cs1-37

结论

v2rayN 的跨平台支持通过以下组合实现:

  1. 平台抽象:抽象平台差异的实用方法
  2. 平台检测:运行时检测当前平台
  3. 条件代码执行:基于检测到的平台的特定平台代码路径
  4. 特定平台实现:针对依赖平台的功能的独立实现
  5. 跨平台 UI:用于跨平台 GUI 的 Avalonia UI
  6. 灵活的构建系统:用于为不同平台构建和打包的 GitHub Actions 工作流程

这种方法使 v2rayN 能够维护单一代码库,同时在 Windows、Linux 和 macOS 上提供类似原生体验。