github Leadaxe/LxBox v2.0.0
LxBox v2.0.0

latest releases: v2.25.20, v2.25.19, v2.25.19-rc.3...
5 months ago

L×Box v2.0.0

Мажорный релиз: L×Box переходит на собственное ядро — fork sing-box-lx с поддержкой AmneziaWG 2.0 и нативного XHTTP. Плюс полностью переработанные фильтры списка нод, drag-reorder подписок, персистентная ручная сортировка и фикс гонки, из-за которой подписка могла «выпасть» из конфига на старте.

Кому актуально: всем. Это первый релиз на новом ядре — AWG/XHTTP-конфиги работают из коробки; UX главного экрана заметно изменился (фильтры, сортировка, подзаголовки нод).

Quick links:
🎯 Highlights ·
🆕 New features ·
🔧 Behavior changes ·
🐛 Fixes ·
🛠 Tools / internals ·
🔬 Verified ·
📲 Install ·
🇷🇺 На русском


🎯 Highlights

  • Собственное ядро sing-box-lx (§097/§104): bundled libbox теперь — fork sing-box 1.13.13-lx.5 с build-тегами with_awg + with_xhttp. AAR поставляется из GitHub Releases форка с SHA256-верификацией (пин версии в репо, скачивание в CI и локальной сборке).
  • AmneziaWG / AWG 2.0 (§097): WireGuard с DPI-обфускацией — awg://-ссылки, AmneziaWG .conf (INI) и JSON-конфиги парсятся, эмитятся и round-trip'ятся целиком (jc/jmin/jmax, s1–s4, h1–h4, CPS-пакеты i1–i5). Клиентский MTU автоматически клампится до 1280.
  • XHTTP — нативный транспорт (§097): Xray «splithttp» (type: xhttp, режимы auto/packet-up/stream-up/stream-one, x_padding_bytes, no_grpc_header) — без прежнего fallback'а в httpupgrade.
  • Filter mode (§095/§096/§103): фильтр-панель стала рабочей зоной с табами Regex · Protocol · Subscribes · Settings, сводкой активных фильтров чипами, единым !-negate у каждой категории и новой строкой чипов по транспорту/безопасности (tcp/ws/grpc/h2/xhttp/… · TLS/Reality/awg2/…). Detour-фильтр — tri-state: всё / скрыть detour / только detour.
  • Подзаголовок ноды: протокол·транспорт·security (§102): VLESS·xhttp·TLS, VLESS·tcp·Reality+Vision, WG·awg2 — видно, что внутри, не открывая JSON.
  • Drag-reorder подписок (§098) и персистентная ручная сортировка нод (§100) — порядок переживает рестарт; Custom в карусели сортировок.
  • Фикс: подписка «из кеша» не попадала в конфиг (§101): закрыта стартовая гонка, из-за которой конфиг мог собраться раньше, чем ноды восстановились из HTTP-кеша — и молча оставался без подписки до ручного rebuild'а.
  • Stale-соединения после смены сети WiFi↔LTE (§087): genuine-смена интерфейса теперь дёргает resetNetwork() — старые сокеты закрываются сразу, без TCP-таймаутов.

🆕 New features

§097 + §104 — Ядро sing-box-lx: AWG2 + XHTTP

Feature spec · task 104.

Bundled-ядро заменено на fork Leadaxe/sing-box-lx (база sing-box 1.13.13): build-теги with_awg (AmneziaWG 2.0 поверх Leadaxe/wireguard-go) и with_xhttp (Xray-совместимый XHTTP). Kotlin-мост (VpnPlugin/BoxService) совместим без правок.

AWG / AWG2 end-to-end:

  • Поля обфускации на wireguard-endpoint'е: jc/jmin/jmax (junk-пакеты), s1–s4 (padding хендшейков и transport), h1–h4 (magic headers), i1–i5 (CPS decoy-пакеты AWG 2.0, tag-формат <b 0xHEX><r N>…, регистр сохраняется).
  • Три входа: wireguard:///awg:// URI query, AmneziaWG .conf ([Interface] Jc/Jmin/…/I1–I5), sing-box JSON endpoint. Всё round-trip'ится: парс → WireguardSpec.awg → emit в конфиг (числа как JSON numbers) и обратно в share-URI.
  • MTU-кламп: при наличии AWG-полей клиентский MTU = min(mtu, 1280); нет mtu в источнике → 1280. Явно заниженный уважается, plain WG не затронут (1408/1420 как раньше). 1280 = рекомендация AmneziaWG и минимальный IPv6 MTU — занижение лишь чуть мельчит пакеты, завышение даёт тихий облом «handshake есть, данных нет». Кламп с debug-логом.
  • В подзаголовке ноды и в variant-фильтре AWG-уровень виден как awg (1.x: jc/jmin/jmax, s1/s2, h1–h4) или awg2 (s3/s4 и/или i1–i5).

XHTTP:

  • XhttpTransport эмитит нативный transport.type: "xhttp" с mode (auto/packet-up/stream-up/stream-one), path/host/headers, x_padding_bytes, no_grpc_header. Прежний fallback в httpupgrade и UnsupportedTransportWarning убраны; httpupgrade остаётся отдельным типом.
  • Парс из URI (Xray camelCase xPaddingBytes/noGRPCHeader + snake-case sing-box), sing-box JSON и Xray xhttpSettings.
  • Совместим с TLS и Reality. ⚠ XHTTP несовместим с XTLS-Vision (ограничение протокола) — Vision остаётся для голого TCP.

Поставка ядра (§104): AAR не в git (~73 MB) — scripts/fetch-libbox.sh скачивает libbox-<ver>.aar из GitHub Releases форка и сверяет SHA256; версия пинится в app/android/libbox.version (single source для локальной сборки и CI-шага «Fetch sing-box-lx core»).

§095 — Filter mode: панель → рабочая зона

Task spec.

Открытый фильтр больше не съедает экран: прячутся стат-полоса и хедер «Nodes (N)», панель сжимается до табов Regex · Protocol · Subscribes · Settings (рендерится только активный таб) + сводка активных фильтров чипами (tap → таб, ✕ → снять). Янтарные точки на табах и на кнопке Icons.tune показывают, где фильтр активен. Эмодзи-чип в Regex — теперь тогл (повторный тап убирает из OR-паттерна). Ping-фильтр пре-заполнен реальным 200 (не серый hint) с выключенным чекбоксом.

§096 — Единый !-negate + detour tri-state

Task spec.

  • У Regex / Protocol / Subscribes — ведущая иконка ! (красная = инверсия NOT: «всё, кроме выбранного»). Инверсии запоминаются per-channel (§083).
  • Detour-фильтр: чекбокс-enable + независимый !. Выкл (старт) = показать всё; вкл + ! = скрыть detour; вкл без ! = только detour — диагностический режим «чистый список релеев». Control-узлы (selector/urltest/direct) не отсеиваются никогда.
  • Register-detour-тогглы подписки видны и в режиме Add detour (APPEND) — кейс «добавить свой detour, не заменяя детуры подписки».

§102 / §103 — Подзаголовок и variant-фильтр

Task 102 · task 103.

Подзаголовок ноды: протокол · транспорт · security, пустые слоты опускаются. Транспорт: tcp (v2ray-протокол без transport-блока) / ws / grpc / h2 / httpupgrade / quic / xhttp. Security: TLS / Reality (++Vision при flow=xtls-rprx-vision) / awg / awg2. Лейблы деривятся один раз при разборе конфига (ParsedConfig.parse).

Те же теги — вторая строка чипов на табе Protocol: фильтр по транспорту/безопасности с собственным !-negate, OR по тегам ноды, AND с остальными фильтрами, per-channel память. «Покажи все Reality-ноды» или «всё, кроме xhttp» — один тап.

§098 / §100 — Reorder и сортировка

Task 098 · task 100.

  • Подписки перетаскиваются за grab-strip (вертикальная полоска слева — тот же паттерн, что в Routing); DNS-правила переведены на этот же вид.
  • Ручная сортировка нод выбирается из меню сортировок (и из tap-карусели: Default → Ping → A-Z → Custom), порядок сохраняется на диск и переживает рестарт. В manual-режиме у нод виден grab-strip.

§099 — Copy-меню внутри View JSON

Task spec.

Пункты Copy из контекстного меню ноды переехали в диалог View JSON: обычная нода — кнопка Copy; нода с detour-цепочкой — выпадашка «Copy server JSON / Copy detour JSON / Copy server + detours(N)» (N учитывает multi-hop).

§105 — Сообщение «поддержи автора»

Feature spec.

Когда приложение суммарно отработало 3 часа и VPN активен прямо сейчас (текущая сессия ≥5 мин), при открытии главного экрана появится диалог с просьбой поддержать проект — звёзды репозиториям, тема на 4PDA, группа в Telegram, донат. Текст и ссылки приложение забирает из docs/support.json репозитория (правятся без релиза), удачная загрузка кэшируется. «Позже» откладывает на +10 часов активного времени, «Не показывать» гасит кампанию навсегда.

§083 / §090 / §094 — вошедшее с прошлого цикла

  • Per-channel память фильтров (§083): набор match-фильтров запоминается отдельно для каждого канала (selector group) на сессию.
  • Эмодзи-теги (§090/§094): вкладки Settings/JSON в настройках ноды, эмодзи-пикер, авто-эмодзи по протоколу при создании; «Later» в плашке обновления.

🔧 Behavior changes

  • Конфиги с AWG-полями / XHTTP теперь валидны — на прежнем стоковом ядре они отвергались. Обратное тоже верно: даунгрейд на ≤v1.9.0 с настроенными AWG/XHTTP-нодами сломает запуск ядра (конфиг пересоберётся после любого изменения).
  • AWG MTU: нода с AWG-полями получает MTU 1280, если в источнике не задан меньший (раньше — WG-дефолт 1408). На пропускную способность bulk-трафика влияет минимально, на надёжность — сильно.
  • Фильтр подписок — prefix-based (§091): chip показывается только для подписок с непустым tag_prefix; ноды подписок без префикса попадают в общий пул (раньше — reverse-parse тега, источник класса багов).
  • Подписка, отдавшая HTTP 200 с нераспознаваемым телом (заглушка провайдера, challenge), теперь помечается failed с сохранением рабочих нод и кеша (§101). Раньше — ok с 0 нод и затёртым кешем.
  • Синтетический chip «Custom» убран из фильтра подписок (§095).
  • Detour-фильтр: вместо тогла «Show detour» — tri-state (см. §096); дефолт = показать всё.

🐛 Fixes

§101 — Подписка «в кеше есть, в конфиге нет»

Task spec.

Стартовая гонка: bootstrap-rebuild ждал фикс. 100 мс и мог собрать конфиг раньше, чем ноды подписки восстановились из HTTP-кеша (они не персистятся — только тело подписки). Итог — конфиг без подписки, помеченный «чистым», и так до ручного rebuild'а. Теперь bootstrap ждёт фактического завершения восстановления (rehydrationDone), а заодно:

  • восстановление переведено на by-ref паттерн — drag-reorder подписок во время старта больше не может подменить список чужой записи;
  • кеш, распарсившийся в 0 нод, логируется (раньше — молча);
  • HttpCache пишет атомарно (tmp → rename) — kill процесса не оставляет обрезанное тело;
  • ошибка старта HomeController больше не убивает AutoUpdater на сессию.

§087 — Stale-соединения после смены сети (WiFi↔LTE)

Genuine-смена дефолтного интерфейса теперь дёргает resetNetwork() ядра (debounced 1.5s): старые сокеты на мёртвом NIC закрываются сразу. Раньше «старое висит, новое грузится» до TCP-таймаута.

§084 — Аудит-фиксы (High-блок)

Все 6 high-находок 46-агентного аудита: dangling detour-ссылки ловятся валидатором (fatal), hysteria2 up/down_mbps round-trip, дедуп форматтеров, полнота tcpClose в профайлере и др. Подробности в CHANGELOG.

§077–§080 — Класс prefix/detour багов закрыт структурно

TagResolver + ConfigNode/ParsedConfig (§085/§091): display-tag логика собрана в одном месте, протокол/detour берутся из конфига по точному тегу — reverse-parse тега, порождавший баги §077/§079/§080 (включая «detour-override ломал конфиг при непустом префиксе»), удалён как механизм.


🛠 Tools / internals

  • §104 — поставка ядра: scripts/fetch-libbox.sh (GH Releases форка + SHA256, идемпотентный), пин app/android/libbox.version, шаг «Fetch sing-box-lx core» в CI, вызов из build-local-apk.sh.
  • §089 — рефакторинг «монстров»: 16 из 18 крупных файлов раздроблены на слои/виджеты (home_screen 2370→518 и др.), поведение 1:1, на каждом шаге analyze clean + полный прогон тестов.
  • §091 — ParsedConfig: конфиг парсится один раз на смену configRaw; вся структурная мета ноды (тип, detour, transport/security лейблы §102) — готовые поля.
  • §085 — NodeFilterViewModel / TagResolver / LazyPersistMixin — выделенные владельцы прежде размазанной логики.
  • Диагностика: scripts/lxbox-diag.sh (one-command snapshot Debug API + Clash API + adb), playbook в docs/DIAGNOSTICS.md.

🔬 Verified

  • flutter analyze clean; 889 тестов зелёные (+~80 с v1.9.0: AWG ×17, XHTTP ×8, rehydrate-race ×7, variant-фильтр, config_node, presenter и др.).
  • Ядро lx.5 в release-APK подтверждено (1.13.13-lx.5 в libbox.so); smoke на устройстве (Android 15, arm64): AWG2-нода (awg:// с jc/s1–s4/h1–h4/i1–i3) коннектится, XHTTP-транспорт работает, обычные vless/wg — без регрессий.
  • §101 verified: порядок строк в логе Re-hydrated … from cache → Config built на холодном старте; подписка в конфиге сразу.
  • Adversarial-ревью диффов (§101: 3 линзы ×12 агентов; §103: 3 линзы) — все блокеры/should-fix закрыты до релиза.

📲 Install

adb install -r app-release.apk

Без uninstall! Поверх существующей установки. Все настройки и подписки сохранятся.

Если впервые — на Android 14+ дай в Settings → Battery → Don't optimize, иначе VPN отключится в Doze.

⚠ Даунгрейд на v1.9.0 и ниже после настройки AWG/XHTTP-нод сломает запуск ядра — удалите эти ноды перед откатом.


🇷🇺 L×Box v2.0.0 на русском

Мажорный релиз — собственное ядро и обфускация:

  • Ядро sing-box-lx: fork sing-box 1.13.13 с AmneziaWG 2.0 и XHTTP. Поставка AAR из релизов форка с проверкой SHA256.
  • AmneziaWG / AWG2: awg://-ссылки, файлы .conf и JSON — полный парс/эмит всех полей обфускации (jc/jmin/jmax, s1–s4, h1–h4, i1–i5). MTU автоматически 1280 (если в источнике не задан меньший) — это убирает «handshake есть, данных нет».
  • XHTTP: нативный транспорт (Xray splithttp) с режимами и padding'ом — больше никакого fallback'а в httpupgrade.
  • Фильтры: панель с табами и сводкой-чипами; у каждой категории !-инверсия; detour tri-state (всё / скрыть / только detour); новая строка чипов по транспорту и безопасности (tcp/ws/xhttp/…/TLS/Reality/awg2).
  • Подзаголовок ноды — VLESS·xhttp·TLS, WG·awg2: видно, что внутри, без открытия JSON.
  • Перетаскивание подписок и сохраняемая ручная сортировка нод (Custom в карусели сортировок).
  • Фикс: подписка могла «выпасть» из конфига после рестарта (конфиг собирался раньше восстановления нод из кеша) — закрыто; плюс смена сети WiFi↔LTE больше не оставляет висящие соединения.
  • Поддержка автора: когда VPN активно используется (3 часа суммарно + текущая сессия ≥5 мин), приложение попросит поддержать проект (звёзды на GitHub / 4PDA / донат) — «Позже» или «Не показывать» уважаются.

⚠ Откат на v1.9.0 и ниже после настройки AWG/XHTTP-нод сломает запуск ядра — удалите эти ноды перед даунгрейдом.

Предыдущий релиз: v1.9.0.

Don't miss a new LxBox release

NewReleases is sending notifications on new releases.