本文详细介绍了 v2rayN 如何支持包括 Windows、Linux 和 macOS 在内的多种操作系统。它涵盖了架构、平台检测、特定平台实现以及跨平台部署的构建系统。
有关 v2rayN 整体架构的信息,请参阅架构。
v2rayN 通过两个主要项目组件提供对多种操作系统的支持:
跨平台策略结合了共享服务库、特定平台实现和条件代码执行路径。
来源: .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 | 包含平台无关业务逻辑的共享核心库 |
| v2rayN | Windows 专用 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
核心进程管理是另一个存在显著平台差异的领域。
进程处理的关键特定平台方面包括:
来源: v2rayN/ServiceLib/Handler/CoreHandler.cs239-322 v2rayN/ServiceLib/Handler/CoreHandler.cs326-408
文件系统操作也存在特定平台的考虑因素。
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-x64、linux-x64、osx-x64 等),并且可以配置为自包含或依赖于框架。
来源: .github/workflows/build-windows.yml37-45 .github/workflows/build-linux.yml40-45 .github/workflows/build-osx.yml40-45
每个平台都有自己的打包脚本和格式。
| 平台 | 包格式 | 打包工具 |
|---|---|---|
| Windows | ZIP | 7-Zip |
| Linux | Debian (.deb)、AppImage、ZIP | dpkg-deb、pkg2appimage |
| macOS | DMG、ZIP | create-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 操作的嵌入式 shell 脚本。
来源: v2rayN/ServiceLib/Global.cs40-42 v2rayN/ServiceLib/Handler/CoreHandler.cs328-342
macOS 也有特定平台的考虑因素:
例如,macOS 系统代理使用专用 shell 脚本设置。
来源: v2rayN/ServiceLib/Handler/SysProxy/ProxySettingOSX.cs1-37
v2rayN 的跨平台支持通过以下组合实现:
这种方法使 v2rayN 能够维护单一代码库,同时在 Windows、Linux 和 macOS 上提供类似原生体验。