Устройство приложения
Путь трафика
ПриложенияТрафик всех приложений, кроме исключённых
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-вход без локальных портов |
| AmneziaWG | amneziawg-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% одного ядра процессора.