Skip to content

Устройство приложения ​

Путь трафика ​

ПриложенияТрафик всех приложений, кроме исключённых
VpnService · TUNСистемный интерфейс VPN, случайная подсеть /30
Xray-coreВстроенный TUN-вход, правила профиля, DNS через туннель
или amneziawg-goОтдельный процесс :awg, весь трафик в туннель
СерверЧерез VPN — по правилам, остальное — напрямую

Дескриптор TUN передаётся прямо в ядро: ни SOCKS, ни HTTP-прокси на 127.0.0.1 не поднимаются.

Процессы ​

ПроцессЧто в нём
com.makdren.rvcИнтерфейс, VpnService, Xray-core (рантайм Go из AndroidLibXrayLite), Rust-модуль
com.makdren.rvc:awgТолько amneziawg-go. Запускается при подключении к AmneziaWG и при запросе версии

AmneziaWG вынесен в отдельный процесс, потому что два рантайма Go (Xray и amneziawg-go) в одном процессе несовместимы: загрузка второго роняет приложение. Процессы общаются через Binder: VPN-сервис передаёт копию дескриптора TUN, а обратно получает сокеты туннеля, чтобы защитить их от петли через VPN.

Компоненты ​

КомпонентТехнология
ИнтерфейсKotlin, Jetpack Compose, «живое стекло» на RenderEffect
ЯдроXray-core 26.10.21 (AndroidLibXrayLite), TUN-вход без локальных портов
AmneziaWGamneziawg-go 3.1 (libwg-go.so из amneziawg-android) в процессе :awg
СетьRust: reqwest + rustls (подписки, геобазы, обновления), tokio на двух потоках (TCP-пинг), ICMP-сокеты, ручной DoH (RFC 8484), memmap2 (обрезка геобаз)
ХранениеЗашифрованные файлы (AES-256-GCM, ключ в Android Keystore)
Фоновые задачиWorkManager раз в час: подписки, autorouting, геобазы, push, обновления
Флагиcircle-flags (MIT), 265 картинок WebP в APK

Windows ​

КомпонентТехнология
ИнтерфейсKotlin, Compose Multiplatform (Desktop), общий модуль shared: парсеры, сборка конфигурации, маршрутизация
Ядроrvc-core.exe — Xray-core 26.10.21 как библиотека Go в отдельном процессе. Команды и конфигурация — строки JSON через stdin, без файлов и портов управления. Закрытие stdin (выход или падение приложения) останавливает ядро с уборкой маршрутов
TUNTUN-вход Xray на wintun: адаптер «RVC», 10.33.0.2/30, DNS 10.33.0.1. Маршруты (autoSystemRoutingTable), привязку исходящих к физическому адаптеру и фильтры WFP настраивает само ядро
Сетьrvcnet.dll — тот же Rust-модуль, что на Android, через C ABI и JNA
ХранениеОдин JSON, зашифрованный DPAPI (%LOCALAPPDATA%\RVC\state.bin)
ПингВременный экземпляр Xray внутри rvc-core: при поднятом TUN его исходящие тоже идут мимо туннеля
ТрейСобственное окно-меню поверх java.awt.TrayIcon; второй запуск передаёт ссылки первому через папку inbox (WatchService)

Пока окно скрыто в трей, оно уничтожается целиком, счётчики трафика не опрашиваются, а неиспользуемая память возвращается системе: в трее процесс RVC занимает 10–20 МБ, ядро — около 30 МБ.

Энергопотребление ​

  • В покое интерфейс не рисует ни одного кадра: анимации живут только пока что-то меняется.
  • Скорость в приложении обновляется раз в секунду, только пока её видно. Свёрнутому приложению хватает уведомления раз в 3 секунды, при выключенном экране счётчики опрашиваются раз в 10 секунд.
  • Проверка туннеля будит радиомодуль: раз в минуту при открытом приложении, раз в 3 минуты при включённом экране, раз в 5 минут при выключенном.
  • Уведомление перерисовывается только при изменении текста.
  • Живой фон растрируется один раз в текстуру; карточки в прокручиваемых списках рисуются без захвата и размытия фона и без теней. При прокрутке средний кадр — около 6 мс при бюджете 8,3 мс на 120 Гц.
  • Сжатие карточки при нажатии появляется только после тап-таймаута, поэтому начало прокрутки не дёргает список.
  • Чужой VPN отслеживается подпиской на изменения сети, без опроса.
  • Перед подключением из геобаз вырезаются только нужные теги: ядру нужно меньше памяти.

В простое с подключённым VPN приложение тратит меньше 1% одного ядра процессора.