菜单

架构

相关源文件

本文档描述了v2rayN的整体架构,解释了不同组件如何交互和协同工作。它提供了系统结构、设计模式和关键机制的技术概述。

有关组件特定实现的详细信息,请参阅核心组件,有关项目组织信息,请参阅项目结构

架构概览

v2rayN遵循客户端-服务器架构,其中GUI(客户端)管理和控制各种代理核心(服务器)。该应用程序使用MVVM(模型-视图-视图模型)模式构建,并由ReactiveUI提供响应式编程能力。

核心组件与数据流

来源: v2rayN/v2rayN/Views/MainWindow.xaml.cs ServiceLib/Handler/CoreHandler.cs ServiceLib/ViewModels/MainWindowViewModel.cs ServiceLib/Handler/AppHandler.cs

架构层

v2rayN被组织成几个独立的层,每一层都有特定的职责。

来源: v2rayN/v2rayN/Views/MainWindow.xaml.cs ServiceLib/ViewModels/MainWindowViewModel.cs ServiceLib/ViewModels/StatusBarViewModel.cs

展示层

表示层包含使用XAML和C#代码隐藏实现的UI组件。主要类型包括:

  • MainWindow:应用程序的主窗口,承载所有其他视图。
  • ProfilesView:显示服务器配置文件并允许管理。
  • MsgView:显示日志消息和应用程序通知。
  • ClashProxiesViewClashConnectionsView:显示Clash特定的信息。

应用程序支持通过MainGirdOrientation设置配置的不同UI布局(水平、垂直和标签式)。

来源: v2rayN/v2rayN/Views/MainWindow.xaml v2rayN/v2rayN/Views/MainWindow.xaml.cs42-68

ViewModel层

ViewModel层实现业务逻辑,并通过ReactiveUI遵循MVVM模式,将属性和命令暴露给视图。

  • MainWindowViewModel:管理主应用程序窗口并协调其他ViewModel。
  • ProfilesViewModel:处理服务器配置文件管理。
  • StatusBarViewModel:控制状态栏和系统代理设置。
  • 用于不同配置窗口的各种设置ViewModel。

ViewModel使用响应式命令和属性来处理用户交互并更新UI。

来源: ServiceLib/ViewModels/MainWindowViewModel.cs68-207 ServiceLib/ViewModels/StatusBarViewModel.cs96-182

服务层

服务层为各种应用程序功能提供服务。

  • 配置管理
  • 核心进程处理
  • 更新服务
  • 速度测试
  • 代理管理

这些服务充当ViewModel和核心层之间的中介。

来源: ServiceLib/ViewModels/MainWindowViewModel.cs235-337

核心层

核心层包含应用程序的核心功能。

  • CoreHandler:管理代理核心进程(启动、停止和监控)。
  • ConfigHandler:处理配置管理。
  • AppHandler:应用程序范围内的服务和配置的中心单例。
  • SysProxyHandler:管理系统代理设置。

这些处理器提供了应用程序的基本功能。

来源: ServiceLib/Handler/CoreHandler.cs18-184 ServiceLib/Handler/AppHandler.cs

数据层

数据层管理数据持久化和检索。

  • 用于存储配置文件、订阅和设置的SQLite数据库。
  • 用于应用程序和核心配置的JSON配置文件。
  • 运行时数据的内存缓存。

该层确保数据在需要时得到妥善存储和检索。

来源: ServiceLib/Handler/AppHandler.cs124-214 ServiceLib/Global.cs16-22

系统代理和核心进程管理

v2rayN的一个关键方面是它如何与操作系统和代理核心进程进行交互。

来源: ServiceLib/Handler/CoreHandler.cs64-100 ServiceLib/ViewModels/MainWindowViewModel.cs538-597 ServiceLib/ViewModels/StatusBarViewModel.cs332-356

核心进程管理

CoreHandler负责管理代理核心进程。

  1. LoadCore方法接收一个选定的配置文件。
  2. 为合适的内核(Xray、sing-box等)生成配置。
  3. 使用生成的配置启动核心进程。
  4. 捕获核心进程的输出并显示在UI中。
  5. 监控进程,并在需要时可以停止。

对于Linux和macOS,该处理程序包含了在需要时(尤其是在TUN模式下)以提升的权限运行进程的特殊处理。

来源: ServiceLib/Handler/CoreHandler.cs64-100 ServiceLib/Handler/CoreHandler.cs183-227

系统代理配置

SysProxyHandler管理全局系统代理设置。

  1. 用户选择代理模式(直连、系统代理、PAC)。
  2. StatusBarViewModel上调用SetListenerType
  3. SysProxyHandler相应地更新系统代理设置。
  4. 对于Windows,这涉及到注册表更改。
  5. 对于Linux和macOS,使用shell脚本配置系统代理。

来源: ServiceLib/ViewModels/StatusBarViewModel.cs332-356

跨平台支持

v2rayN通过两种独立的UI实现支持多平台,并共享核心功能。

来源: v2rayN/v2rayN/Views/MainWindow.xaml.cs v2rayN/v2rayN.Desktop/Views/MainWindow.axaml.cs ServiceLib/Common/Utils.cs797-849

平台特定实现

该应用程序在几个关键领域处理平台差异

  1. UI 框架:

    • Windows:使用 WPF (v2rayN 项目)
    • 跨平台:使用 Avalonia UI (v2rayN.Desktop 项目)
  2. 系统集成:

    • Windows:使用注册表进行系统代理和自动启动
    • Linux:使用 shell 脚本和系统命令
    • macOS:使用 shell 脚本和系统命令
  3. 可执行文件管理:

    • Windows:处理 .exe 文件
    • Linux/macOS:使用 chmod 设置可执行权限
  4. 文件路径:

    • 用于配置和二进制文件的特定平台路径
    • 用于核心资源位置的环境变量

来源: ServiceLib/Common/Utils.cs797-849 ServiceLib/Handler/CoreHandler.cs326-408

Utils 类平台检测

Utils 类提供了平台检测方法,这些方法在应用程序中得到广泛使用

这些方法用于条件性地执行特定于平台的代码。

来源: ServiceLib/Common/Utils.cs799-805

配置和设置管理

该应用程序管理各种配置元素

来源: ServiceLib/Global.cs16-22 ServiceLib/Handler/AppHandler.cs3-47

配置文件和数据库

v2rayN 同时使用基于文件的配置和 SQLite 数据库

  1. 主配置文件guiNConfig.json 存储应用程序设置
  2. SQLite 数据库:存储服务器配置文件、订阅、路由规则和统计信息
  3. 核心配置文件:根据所选配置文件为每个代理核心生成

该应用程序确保这些存储机制之间的数据一致性。

来源: ServiceLib/Global.cs16-22 ServiceLib/Handler/AppHandler.cs72-75

路径管理

Utils 类提供了管理各个组件文件路径的方法

这些方法处理特定于平台的路径并确保目录存在。

来源: ServiceLib/Common/Utils.cs637-794

MVVM 实现和响应式编程

v2rayN 使用 MVVM 模式和 ReactiveUI 来创建响应式、可维护的应用程序。

视图和 ViewModel 绑定

MainWindow 在其构造函数中设置视图-ViewModel 连接

来源: v2rayN/v2rayN/Views/MainWindow.xaml.cs71-133

响应式命令和属性

ViewModels 使用 ReactiveUI 的响应式命令和属性

来源: ServiceLib/ViewModels/MainWindowViewModel.cs76-105 ServiceLib/ViewModels/MainWindowViewModel.cs55-62

用于跨组件通信的消息总线

该应用程序使用 ReactiveUI 的 MessageBus 进行组件间的通信

来源: v2rayN/v2rayN/Views/MainWindow.xaml.cs38 ServiceLib/ViewModels/StatusBarViewModel.cs203-204

结论

v2rayN 采用结构良好的架构,将关注点分为不同的层,遵循 MVVM 模式,并支持多平台。该应用程序的核心组件协同工作,可在不同操作系统上提供无缝的代理管理体验。

ReactiveUI 和基于消息的通信的使用实现了响应式的 UI 和组件之间的松耦合。特定于平台的代码的仔细分离允许应用程序在 Windows、Linux 和 macOS 上运行,同时保持一致的核心功能。