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

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

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

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