Zapret KVN — самый быстрый VPN который ты знаешь
  • Kotlin 87.3%
  • Shell 9.6%
  • Batchfile 1.3%
  • Java 0.9%
  • Go 0.7%
  • Other 0.2%
Find a file
2026-07-25 01:33:04 +03:00
.github/workflows Make stable publication resumable 2026-07-24 23:20:48 +03:00
app Support legacy XHTTP XMUX lifetime 2026-07-25 01:33:04 +03:00
app-updater Move documentation into docs directory 2026-07-24 19:17:38 +03:00
audit Flatten core audit fixtures 2026-07-24 19:20:58 +03:00
core-patches Fix Android VPN health gate 2026-07-23 20:25:06 +03:00
docs Support legacy XHTTP XMUX lifetime 2026-07-25 01:33:04 +03:00
gradle Complete CI dependency verification 2026-07-22 16:36:14 +03:00
network-bootstrap Move documentation into docs directory 2026-07-24 19:17:38 +03:00
rulesets Flatten documentation and rule-set paths 2026-07-24 19:23:19 +03:00
scripts Prepare 0.2.15 release notes 2026-07-24 23:59:52 +03:00
testdata Clamp Android TUN MTU for WireGuard 2026-07-24 01:37:22 +03:00
wireguard-import Use Android MTU for WireGuard endpoints 2026-07-22 20:16:11 +03:00
.gitattributes Rewrite Android WireGuard data plane 2026-07-23 00:04:15 +03:00
.gitignore Stop tracking local Codex skills 2026-07-24 19:19:04 +03:00
build.gradle.kts Initial Zapret KVN Android MVP 2026-07-22 14:44:50 +03:00
core.properties Fix Android VPN health gate 2026-07-23 20:25:06 +03:00
gradle.properties Initial Zapret KVN Android MVP 2026-07-22 14:44:50 +03:00
gradlew Initial Zapret KVN Android MVP 2026-07-22 14:44:50 +03:00
gradlew.bat Initial Zapret KVN Android MVP 2026-07-22 14:44:50 +03:00
release.properties Publish stable releases locally 2026-07-24 20:54:45 +03:00
settings.gradle.kts Retry blocked updates through temporary VPN route 2026-07-22 21:11:29 +03:00

Zapret KVN

image

VPN, который пропускает только необходимое

Zapret KVN — быстрый и бережный VPN-клиент для Android на базе sing-box-extended. Он позволяет выбрать не только VPN-профиль, но и конкретные приложения и сайты, которым нужен VPN.

Получить ключи можно тут: https://t.me/zapretvpns_bot

Обычный VPN-клиент часто отправляет в туннель весь трафик телефона. При подключении Zapret KVN передаёт Android список выбранных приложений, и система направляет в TUN только их соединения. Отдельный список позволяет полностью запретить выбранным приложениям выход в сеть, пока подключён Zapret KVN.

Например, через VPN можно пустить YouTube, Discord и зарубежные сервисы, а Ozon, банки, доставку и другие локальные приложения оставить на обычном подключении. Они не занимают канал VPN-сервера и не получают зарубежный IP без необходимости.

Stable 0.2.4 опубликован. Физическая матрица слабых устройств, IPv6/NAT64, операторов и энергии продолжается; целевые 12 секунды подключения остаются целью performance-gate, а не обещанием для каждой сети и конфигурации.

Скачать stable 0.2.4 · Посмотреть архитектуру · Изучить маршрутизацию

Что происходит по умолчанию

При первом запуске Zapret KVN использует режим «Только выбранные». В список добавляются установленные приложения, которым VPN обычно действительно нужен: поддерживаемые браузеры, клиенты Telegram и YouTube, а также известные зарубежные сервисы.

Ozon и большинство российских магазинов, банков, доставок, государственных и других локальных приложений автоматически в VPN не добавляются. Они продолжают работать напрямую, вне TUN и вне VPN-сервера. Это не блокировка и не попытка определить страну каждого приложения: пользователь в любой момент может добавить или убрать любое приложение вручную.

Список полной блокировки приложений по умолчанию пуст: обновление и первый запуск ничего не блокируют автоматически.

Для трафика, который вошёл в VPN, новый управляемый профиль получает режим «Россия напрямую»:

  • российские домены и IP идут напрямую;
  • устройства и сервисы локальной сети идут напрямую;
  • остальной трафик выбранных приложений идёт через VPN;
  • пользовательские правила могут дополнительно отправить отдельный домен или IP напрямую либо заблокировать; для обратного направления есть пресет «Россия через VPN».

В результате VPN-сервер обрабатывает только те соединения, которым действительно нужен обход.

Как работает правило «Россия напрямую»

Коротко его можно описать как «RU → direct, всё остальное → VPN». Но технически это не старое правило geoip или geosite: в используемой версии sing-box эти поля уже удалены. Zapret KVN применяет современный route.rule_set.

Вместе с APK поставляются два локальных бинарных набора:

  • zapret-ru-domains — доменные зоны .ru, .su и .рф (.xn--p1ai);
  • zapret-ru-ip — российские IPv4- и IPv6-сети из закреплённого снимка SagerNet/sing-geoip. Текущий снимок содержит 10 842 агрегированных CIDR.

Оба набора объединены в одно правило маршрутизации:

{
  "rule_set": [
    "zapret-ru-domains",
    "zapret-ru-ip"
  ],
  "action": "route",
  "outbound": "direct"
}

Если адрес совпал хотя бы с одним набором, соединение идёт через обычную сеть Android, минуя VPN-сервер. Пакет выбранного приложения при этом сначала входит в TUN, но после локальной проверки получает outbound direct. Если совпадения нет, срабатывает route.final = выбранный VPN.

Это означает:

  • сайт в зоне .ru, .su или .рф идёт напрямую;
  • сайт в другой доменной зоне тоже идёт напрямую, если его IP входит в российский набор;
  • зарубежный сайт идёт через выбранный VPN;
  • LAN и частные адреса также идут напрямую;
  • пользовательское правило direct может дополнительно вывести из VPN отдельный домен, IP или CIDR;
  • пользовательская блокировка может отклонить соединение до проверки RU-наборов.

Пример с браузером

Допустим, Chrome выбран в разделе «Область VPN». Android направляет соединения Chrome в TUN, но это не означает, что весь браузер всегда работает через VPN-сервер. Zapret KVN принимает решение отдельно для каждого открываемого адреса:

Что открывается в выбранном браузере Маршрут
ozon.ru или другой домен .ru напрямую
домен .com с IP из российского набора напрямую
YouTube или другой адрес вне RU-наборов через выбранный VPN
адрес из пользовательского списка блокировки блокируется

Поэтому да: браузер может быть выбран для VPN, но российские сайты внутри него продолжат открываться напрямую. Сам браузер не получает один постоянный маршрут — маршрут выбирается заново для каждого соединения.

Одна веб-страница может обращаться сразу к нескольким доменам. Например, основной ozon.ru пойдёт напрямую, а сторонняя аналитика или зарубежный CDN, не совпавшие с RU-наборами, могут пойти через VPN. Это ожидаемая раздельная маршрутизация, а не переключение всего браузера целиком.

Приложения, которые вообще не выбраны в «Области VPN», работают ещё проще: Android не направляет их в TUN, поэтому весь их трафик сразу идёт напрямую и не обрабатывается Zapret KVN.

Правила проверяются по порядку. Сначала обрабатываются служебный DNS и health-check, затем блокировки, пользовательские правила direct, LAN и RU-наборы, после них пользовательские правила VPN и в конце route.final. Первое подходящее правило определяет маршрут соединения.

Поэтому правило «Через VPN» внутри пресета «Россия напрямую» не переопределяет уже совпавший RU-адрес. Чтобы отправить российские ресурсы в туннель, нужно выбрать пресет «Россия через VPN», «Всё через VPN» или настроить нужный порядок вручную в расширенном JSON.

Домены и IP проверяются отдельно. Управляемый DNS сохраняет обратное сопоставление ответа с доменным именем, поэтому ядро может узнать, что полученный адрес относится, например, к .ru. После разрешения имени также проверяется сам IP. Если приложение использует собственный встроенный DoH и скрывает домен от системного DNS, остаётся проверка по IP-набору; поэтому один только доменный список не является полноценным firewall.

RU-наборы встроены в APK: приложение не скачивает их при подключении, не обновляет по таймеру и не создаёт для них отдельную фоновую службу. Новая версия наборов приходит только вместе с обновлением Zapret KVN.

Важно: GEO-классификация не может быть абсолютно точной. Российский сервис может использовать зарубежный CDN, домен .com и IP, которого нет в RU-наборе. Такой адрес пойдёт через VPN, пока пользователь не добавит своё правило direct.

Режим «Россия напрямую» автоматически добавляется только в новые управляемые профили, созданные из поддерживаемых ссылок и конфигураций. Импортированный пользовательский sing-box JSON не переписывается: его собственные правила остаются источником истины.

Нужно ли держать приложение открытым

Нет. После нажатия «Подключить» окно Zapret KVN можно закрыть. Android оставляет активным штатный VpnService и созданный им TUN-интерфейс, а встроенное VPN-ядро продолжает обрабатывать трафик выбранных приложений.

Отдельная фоновая работа интерфейса для этого не нужна: Zapret KVN не держит WakeLock, не запускает периодические alarm/job/WorkManager-задачи, не опрашивает сервер по таймеру и обновляет экранную статистику только тогда, когда открыт главный экран. Системное уведомление VPN при этом остаётся — так требует Android.

Стабильность фонового VPN зависит от прошивки устройства. Если производитель ограничивает или замедляет стандартный VpnService, может потребоваться разрешить Zapret KVN работу без ограничений батареи. Само приложение не пытается обходить системные правила Android скрытыми фоновыми службами.

Основные возможности

  • Популярные протоколы. Поддерживаются VLESS, VMess, Trojan, Shadowsocks, Hysteria2, TUIC, WireGuard и AmneziaWG, включая совместимые конфигурации WARP.
  • Удобный импорт. Профиль можно добавить из sing-box JSON, WireGuard/AWG .conf, обычной ссылки, подписки, QR-кода, буфера обмена или файла.
  • Только нужные приложения. В режиме «Только выбранные» остальные приложения отсекаются средствами Android ещё до TUN. Их не видят VPN-ядро, DNS приложения и VPN-сервер.
  • Обратный режим. Можно выбрать «Приложения напрямую»: отмеченные приложения останутся вне TUN, а все остальные будут использовать VPN.
  • Полная блокировка приложений. Отдельный пустой по умолчанию список запрещает выбранным приложениям DNS, WiFi и мобильный трафик во время активной VPN-сессии.
  • Пять готовых режимов маршрутизации. «Всё через VPN», «Обход LAN», «Только выбранные сайты», «Россия напрямую» и «Россия через VPN».
  • Свои правила. Для домена, IP, CIDR или rule-set можно выбрать действие: через VPN, напрямую или блокировать.
  • Управляемый DNS. В автоматическом режиме сначала используется DNS профиля, затем DNS Android и только после подтверждённой DNS-ошибки — защищённый DoH через VPN.
  • Проверка до подключения. Импортированная конфигурация показывается в preview и проверяется встроенным ядром до сохранения.
  • Понятная диагностика. Ошибки получают стабильные коды, например DNS-101, VPN-200 или AUTH-100; redacted-отчёт не включает профиль и credentials.
  • Обновления внутри приложения. Можно выбрать Stable или Beta, посмотреть описание выпуска, скачать APK и передать его штатному установщику Android.
  • Rootless hardening. Дополнительные localhost proxy/API закрываются до запуска ядра, внешние Clash/V2Ray control API удаляются из runtime-копии, а сохранённый профиль не переписывается.
  • Нативный интерфейс. Компактный Material 3 на стандартных компонентах Android, без тяжёлого dashboard.

Чем Zapret KVN отличается от обычного VPN

  • не заставляет весь телефон использовать один зарубежный IP;
  • отсекает невыбранные приложения до VPN-ядра, а не после обработки их пакетов;
  • позволяет отдельно маршрутизировать приложения, сайты, IP и локальную сеть;
  • использует один Android VPN service, один TUN и один экземпляр ядра;
  • не создаёт второй туннель, локальный SOCKS для WireGuard или отдельный VPN service;
  • не выполняет постоянные health-check, бесконечный reconnect и фоновую синхронизацию;
  • сохраняет настоящий sing-box JSON без скрытой копии и потери незнакомых extended-полей.

Сравнение с v2rayNG

v2rayNG — зрелый универсальный клиент для Xray-core и v2fly-core. Zapret KVN решает более узкую задачу: дать готовый Android-клиент, в котором выбор приложений, маршрутизация российских ресурсов, DNS и WireGuard/AWG работают как один сценарий.

Оба приложения умеют per-app VPN. В обоих случаях Android может допустить в TUN только выбранные приложения или, наоборот, оставить отмеченные приложения снаружи. Оба клиента также умеют маршрутизировать домены и IP внутри уже выбранного приложения. Поэтому пример «браузер через VPN, но ozon.ru внутри браузера напрямую» технически можно собрать и в v2rayNG. Разница прежде всего в настройке и значениях по умолчанию.

Возможность Zapret KVN v2rayNG
Основное ядро sing-box-extended Xray-core и v2fly-core
Выбор приложений Режимы «Только выбранные» и «Приложения напрямую» через Android VpnService Per-app proxy с обычным и bypass-режимом через Android VpnService
Маршрутизация внутри браузера Готовые пресеты и правила direct / VPN / reject Гибкие правила Xray по домену, IP, процессу, протоколу и другим признакам
Российские сайты по умолчанию В новых управляемых профилях RU domain/IP и LAN → direct, остальное → VPN Специального пресета Zapret KVN нет; нужные GEO-данные и правила можно настроить или импортировать
GEO-данные Два закреплённых локальных .srs внутри APK; фоновой загрузки нет geoip.dat / geosite.dat, ручной импорт и загрузка сторонних наборов
WireGuard WireGuard .conf и URI, AmneziaWG/AWG 2.0 и совместимые WARP-конфигурации WireGuard .conf, URI и ручная настройка через Xray; отдельного AmneziaWG-движка в текущем исходном коде нет
Подписки Импорт поддерживается, но периодического фонового обновления пока нет Зрелое управление группами, фоновое обновление по интервалу, тестирование и обслуживание конфигураций
Дополнительные режимы Один rootless Android VPN service и один TUN VPN, Proxy-only; также есть отдельные экспертные возможности для root и раздачи прокси в LAN
Фоновая активность Нет периодических health-check, обновления подписок и служебной синхронизации Фоновое обновление подписок доступно как опция
Диагностика Стабильные коды ошибок, bounded-логи и redacted-экспорт без профиля и credentials Обычные логи ядра, тесты соединений и экспорт логов
Минимальная версия Android Android 8 / API 26 Android 7 / API 24
Зрелость Молодой проект и пока ограниченная физическая матрица устройств Давно развиваемый проект с большой аудиторией и частыми выпусками

Плюсы Zapret KVN относительно v2rayNG

  • после импорта поддерживаемой ссылки или .conf уже создан понятный маршрут: выбранное приложение входит в TUN, RU и LAN идут напрямую, остальное — через VPN;
  • не нужно отдельно подбирать российские GEO-файлы и собирать базовое правило маршрутизации;
  • отдельный AmneziaWG-движок и AWG 2.0 участвуют в тех же правилах приложений, сайтов и IP, что и остальные профили;
  • граница приложений, RU-маршрутизация и DNS собираются в один готовый сценарий, а не настраиваются пользователем по отдельности;
  • приложение не запускает периодическое обновление подписок, опрос серверов или синхронизацию;
  • диагностика сразу даёт стабильный код и безопасный отчёт, рассчитанный на отправку разработчику;
  • интерфейс специально ограничен основными сценариями и не требует разбираться во всех параметрах Xray.

Минусы Zapret KVN относительно v2rayNG

  • проект заметно моложе и проверен на меньшем количестве реальных устройств, прошивок и сетей;
  • управление подписками пока проще: нет периодического обновления, автоматического тестирования и очистки конфигураций;
  • нет Proxy-only и root-режимов, раздачи локального прокси другим устройствам и части экспертных возможностей v2rayNG;
  • поддерживается Android 8+, тогда как v2rayNG работает начиная с Android 7;
  • Clash YAML и Hysteria v1 URI пока не импортируются;
  • Always-on/Lockdown и shared UID пока не заявлены как гарантированный per-app режим;
  • готовые пресеты намеренно проще, чем полный набор маршрутизации Xray.

Что выбрать

Zapret KVN удобнее, если хочется один раз выбрать приложения и получить готовое поведение: YouTube и зарубежные сайты через VPN, российские сайты внутри того же браузера напрямую, без фонового обслуживания подписок.

v2rayNG удобнее, если важны зрелая экосистема Xray/v2fly, сложные правила, автоматическое обслуживание подписок, Proxy-only, root-сценарии или поддержка Android 7.

Абсолютного победителя по скорости нет. Результат сильнее зависит от сервера, протокола, маршрута провайдера, DNS и конкретной конфигурации, чем от названия GUI.

Сравнение проверено по официальным материалам v2rayNG: README и сведения о ядрах, реализация per-app VPN, VPN и Proxy-only, актуальные выпуски и настройки приложения в исходном коде. Поддержка WireGuard сверена с официальным WireguardFmt.kt. Состояние сравнения — 24 июля 2026 года.

Трафик идёт кратчайшим путём

Трафик Что с ним происходит
Невыбранное приложение Android сразу отправляет его напрямую; Zapret KVN его не обрабатывает
Выбранный трафик с правилом direct Проходит локальное правило, но не обращается к VPN-серверу
Выбранный трафик с правилом proxy Уходит через выбранный VPN-профиль
Заблокированный трафик Отклоняется локально

Так сервер обрабатывает только тот трафик, ради которого он действительно нужен. Можно направить через VPN отдельные приложения или сайты, оставить Россию напрямую, отправить через VPN только российские ресурсы либо собрать собственные правила.

WireGuard и WARP — с настоящим роутингом

Zapret KVN импортирует WireGuard и AmneziaWG .conf, включая совместимые конфигурации WARP. WireGuard здесь не означает режим «всё устройство целиком через один сервер»: профиль становится полноценным outbound и участвует в тех же правилах direct / proxy / reject.

Это позволяет, например, отправить через WARP только выбранные сайты, остальные открыть напрямую, а другой набор трафика направить через отдельный proxy-outbound в составе конфигурации. Из-за ограничений Android выбранные приложения используют один системный TUN, но решение о маршруте остаётся раздельным для каждого назначения.

У WireGuard два независимых MTU: внешний Android TUN и внутренний userspace endpoint. Endpoint без собственного MTU получает Android-совместимый внутренний MTU 1280, как в официальном клиенте Amnezia. В стандартном режиме внешний TUN ограничивается меньшим из 1500 и эффективного MTU userspace WireGuard, поэтому Android не отдаёт внутреннему туннелю слишком крупные пакеты. Явное значение endpoint из .conf или JSON имеет приоритет; если внешний tun.mtu отсутствует, даже режим «По профилю» берёт для userspace WireGuard MTU endpoint вместо Android-default 9000. Сохранённый профиль не меняется.

Android AAR применяет один открытый воспроизводимый patch поверх pinned commit. Только Android userspace WireGuard data-plane использует раздельные движки, проверенные в mihomo: metacubex/wireguard-go для обычного WireGuard и metacubex/amneziawg-go для AmneziaWG. Оба работают через один защищённый однопакетный ClientBind; второй Android TUN, локальный SOCKS и отдельный VPN service не создаются. До добавления peers отключается изменение endpoint после аутентифицированных пакетов, затем применяется IPC-конфигурация и только после неё поднимается внутренний TUN. Pinned версии модулей, upstream commit и SHA-256 patchset публикуются в build/release metadata.

Runtime-копия добавляет WireGuard только внутренний MTU 1280, если профиль не задал свой. Искусственный zapret-wireguard-direct outbound больше не создаётся: Android движок сам использует защищённый dialer sing-box, а явный пользовательский detour сохраняет своё обычное значение. Сохранённый JSON не меняется.

Нормализация внешнего Android TUN до 1500 применяется к обычным proxy-профилям. Для userspace WireGuard она дополнительно учитывает внутренний MTU: например, endpoint 1280 создаёт Android TUN 1280. Режим «По профилю» не меняет явно заданный пользователем TUN MTU; при отсутствии поля использует MTU endpoint.

Скрытие VPN без root

В «Настройки → Скрытие VPN» находятся меры, которые реально доступны обычному Android-приложению: запрет дополнительных localhost inbounds, удаление внешних Clash/V2Ray control API, нейтральное имя VPN-сессии и безопасный MTU TUN по умолчанию (1500 либо меньший MTU userspace WireGuard). Постоянная защита включена по умолчанию, работает только при сборке runtime JSON и не добавляет фоновой нагрузки. Сохранённый профиль не переписывается.

Android всё равно показывает системный VpnService, TRANSPORT_VPN, TUN-интерфейс и VPN indicator. Zapret KVN не называет rootless-режим полной невидимостью и не пытается подменять API других приложений. Точные границы и release-gate описаны в VPN Hiding ADR.

Быстрый и лёгкий — по архитектуре

Внутри приложения один Android VPN service, один TUN и один экземпляр ядра. Здесь нет второго туннеля, дублирующих таблиц правил и постоянного опроса состояния. Конфигурация проверяется до запуска, а при ошибке соединение полностью закрывается вместо бесконечных повторов в фоне.

Автоматизированные проверки уже подтвердили:

  • 165/165 JVM-тестов и 14/14 целевых instrumented-тестов блокировки на Android API 36; ранее полный базовый прогон API 36 прошёл 67/67;
  • полные матрицы на API 26 и 29;
  • 100 циклов connect/stop и 50 переходов Wi-Fi ↔ cellular на API 29/36;
  • отсутствие собственного периодического сетевого трафика в idle-сценариях;
  • обход TUN невыбранным трафиком: в тесте 5 × 8 MiB дали 0 UID RX+TX приложения и медиану 0 TUN bytes.

Физические проверки энергии, OEM-поведения, DNS/NAT64 и финальной скорости подключения ещё входят в release-gate. Подробные результаты и границы измерений опубликованы в GATE8_RESULTS.md.

Профиль добавляется так, как удобно

Можно импортировать JSON, WireGuard/AWG .conf, VLESS, VMess, Trojan, Shadowsocks, Hysteria2 и TUIC из ссылки, подписки, QR-кода, буфера обмена или файла. Перед сохранением приложение показывает preview и проверяет конфигурацию встроенным ядром.

Настоящий sing-box JSON остаётся единственным источником сетевой конфигурации: Zapret KVN не создаёт скрытую копию правил и не теряет незнакомые extended-поля.

Сборки

Stable-сборки используют package io.github.zapretkvn.android и постоянный production key. 0.2.3 обновляет 0.2.1, 0.2.2 и 0.2.1-beta.30 без потери app-private данных. Ручные debug-сборки публикуются в GitHub Releases как prerelease; у них отдельный package io.github.zapretkvn.android.debug и Android debug key, поэтому они устанавливаются рядом и не обновляют production-приложение.

При ошибке главная сразу показывает стабильный код и понятное описание. AUTH-100 выдаётся только при явном отказе сервера в авторизации. Если VLESS-сервер молча закрывает соединение или не отвечает, отличить отключённый UUID от блокировки, поломки сервера или транспорта невозможно, поэтому остаётся общий VPN-200. В «Настройки → Диагностика» видны этот же код, безопасная техническая причина, длительности этапов, bounded-логи и последний Kotlin/Java crash. Кнопка «Экспортировать диагностику» вверху экрана формирует redacted-отчёт без профиля и credentials.

Для объективного физического замера stable APK используйте collect-stable-gate-windows.cmd. Скрипт не меняет VPN, DNS, профили или сети: он последовательно собирает idle без VPN, idle с VPN, воспроизведение видео и Wi-Fi ↔ mobile, сохраняя CPU, PSS, scheduler trace, счётчики интерфейсов, batterystats, connectivity и logcat в один ZIP на рабочем столе.

Что дальше

В следующих версиях мы планируем поддержать фрагментацию мультиплексированных соединений в LSM, а также продолжить дополнительную бустификацию WireGuard, Hysteria2 и других протоколов. В дальнейшем также появится полноценная поддержка подписок.

Известные ограничения MVP

  • Android 8+; release APK разделены на arm64-v8a, armeabi-v7a и x86_64, интерфейс рассчитан на телефоны.
  • Always-on/Lockdown и shared UID не поддерживаются как гарантированный per-app режим.
  • Полная блокировка приложений действует только во время активной VPN-сессии Zapret KVN; изменения списка применяются при следующем подключении.
  • Rootless hardening не скрывает системный TRANSPORT_VPN, TUN и установленный APK от другого приложения.
  • Managed DNS перехватывает TCP/UDP 53, но не встроенный DoH, DoT или mDNS; FakeIP выключен.
  • Явные режимы «Из JSON», «DNS Android» и «Защищённый через VPN» не переключаются автоматически. «Из JSON» сохраняет заданную DNS-секцию буквально; только когда её вообще нет, runtime использует минимальный local DNS Android. Bounded fallback профиль → Android → DoH действует только в режиме «Автоматически» и закрывает предыдущий TUN/core перед следующей попыткой.
  • Domain-only block не является firewall: для гарантии нужен IP/CIDR rule-set.
  • Clash YAML и Hysteria v1 URI пока не импортируются; raw JSON остаётся ответственностью пользователя.
  • APK проверяется один раз при запуске по выбранному каналу и вручную из настроек; Beta выбирает последний опубликованный prerelease по published_at, а найденное обновление показывает release notes. Если GitHub недоступен напрямую, updater один раз временно повторяет только свой запрос через выбранный VPN-профиль и затем восстанавливает прежнее состояние VPN; постоянного правила для GitHub и влияния на другие приложения нет. Загрузка выполняется после подтверждения, установка — только штатным Android installer; silent install недоступен. Подписки не обновляются в фоне, core обновляется только вместе с APK.
  • При неработающем proxy/DNS VPN закрывается без бесконечного retry и plaintext DNS fallback.

Документация

Сборка для разработчиков

Toolchain

  • JDK 17;
  • Android Gradle Plugin 9.2.1 и Gradle 9.4.1;
  • compile/target SDK 36, min SDK 26;
  • Compose BOM 2026.06.00;
  • закреплённый sing-box-extended v1.13.14-extended-2.5.2, commit ff11f007ec798136a5de258f947a4f34011a37ea;
  • отдельные APK для arm64-v8a, armeabi-v7a и x86_64, без чужих native-библиотек внутри.

Укажите путь к Android SDK в local.properties или ANDROID_HOME, затем запустите локальный аналог CI:

scripts/ci-build.sh

Скрипт собирает закреплённые CLI/AAR, проверяет fixtures и rule-set, запускает Go/Kotlin tests и lint, собирает x86_64 debug APK и три release APK, затем проверяет ABI, stripping, R8 mapping, native symbols и security-инварианты.

Официальный stable после выполнения физических release-gates собирается и публикуется локально production-ключом:

git tag -a vMAJOR.MINOR.PATCH -m "Zapret KVN MAJOR.MINOR.PATCH"
scripts/publish-local-stable.sh vMAJOR.MINOR.PATCH --final-gate-approved

Publisher не ждёт GitHub Actions: он создаёт приватный draft, последовательно загружает и сверяет SHA-256 всех assets, публикует только полный набор и запускает независимую фоновую проверку. Прерванная загрузка возобновляется из проверенного локального bundle без замены remote assets. Production key в Actions не передаётся; system image эмулятора кешируется между verification runs. Полный контракт ключей, tag и защиты от повторной публикации описан в инструкции по подписи.

Для debug APK другой архитектуры используйте, например:

./gradlew assembleDebug -PzapretAbi=arm64-v8a

Универсальный APK намеренно не создаётся. Сборка также останавливается, если app/libs/libbox.aar отсутствует: динамическая загрузка ядра приложением запрещена.

Полная Android-матрица запускается командой ./gradlew :app:connectedDebugAndroidTest. Дополнительные device/release-проверки описаны в плане реализации и протоколе Gate 8.

Лицензия

Zapret KVN распространяется по лицензии GPL-3.0-or-later. Распространение закрытых или проприетарных APK и покрываемых производных работ запрещено: распространитель обязан предоставить полный соответствующий исходный код на условиях GPL-3.0-or-later. Подробности и точные границы требования описаны в политике лицензирования. Условия сторонних компонентов перечислены в THIRD_PARTY_NOTICES.md. GPL не предоставляет прав на название Zapret KVN, значок, логотип или фирменное оформление и не разрешает выдавать форк за официальный выпуск.