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 и XrayxhttpSettings. - Совместим с 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 analyzeclean; 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.