Skip to content

LxBox v2.25.3

Choose a tag to compare

@eleutherifer eleutherifer released this 24 Sep 16:45
· 463 commits to main since this release
ba5dbba

L×Box v2.25.3

A patch on top of v2.25.2.
The main body of changes is in
v2.25.0 — one parsing
engine shared with
singbox-launcher 2.0.0,
and the Start insurance when the core refuses a server. Read those first;
this patch does not repeat them.

This patch is mostly about the core and about connecting. Diagnostics on a
NaiveProxy server no longer closes the app. A WireGuard or AmneziaWG server whose
address is a name rather than an IP connects in about a second instead of five.
A tunnel built from several such servers is no longer switched off by its own
safety net fifteen seconds in. And the Servers screen finally keeps one list:
servers, subscriptions, folders and chains are entries of one kind, in one order.

Патч поверх v2.25.2.
Основной корпус изменений — в
v2.25.0: один движок
разбора с
лаунчером 2.0.0
и страховка кнопки Start, когда ядро отказывается от сервера. Сначала
читайте их — этот патч их не повторяет.

Этот патч в основном про ядро и про подключение. Диагностика узла NaiveProxy
больше не закрывает приложение. Сервер WireGuard или AmneziaWG, чей адрес задан
именем, а не IP, соединяется примерно за секунду вместо пяти. Туннель из
нескольких таких серверов больше не гасится собственной страховкой через
пятнадцать секунд. А экран Servers наконец держит один список: серверы,
подписки, папки и цепочки — записи одного рода, в одном порядке.


🇬🇧 English

🩹 Fixes

The core — v1.14.1-lx.10

  • Diagnostics on a NaiveProxy server no longer closes the app. With the
    tunnel up, opening Diagnostics on a naive server shut the app down on the
    spot: the core read the connection's address, which a connection of that kind
    does not have. Diagnostics now returns status, response and timing for such a
    server like any other, and the address field stays empty — which is how it
    should be. Traffic through those servers and the latency check were never
    affected.
  • WireGuard and AmneziaWG servers addressed by name connect in a second
    instead of five.
    When the server address is a domain rather than an IP, the
    first handshake used to be lost and the connection took an extra five seconds.
    It now goes through on the first attempt.
  • XHTTP connections are no longer marked as failed when you switch servers.
    When you changed server, or the core closed an XHTTP connection it no longer
    needed, it took its own closure for a break from the server's side: a line
    about a closed response body landed in the log on every request, and a
    perfectly good XMUX session was marked unusable and rebuilt from scratch. A
    local cancellation is now recognised for what it is — the log of a working
    XHTTP server is clean, and switching servers costs no extra session rebuild. A
    real break on the server's side is still reported as before
    (#148).
  • Synced with upstream sing-box — fixes around DNS, IPv6 and shutdown.

The config schema, the set of fields and the behaviour of other servers did not
change.

Connecting

  • A VPN built from several WireGuard/AmneziaWG servers no longer switches
    itself off after 15 seconds.
    The core brings such servers up one at a time,
    7–9 seconds each, while the safety net against a stuck start waited a fixed 15
    seconds for any configuration. On four servers or more it managed to kill a
    connection that was already established: the handshake had happened, the
    tunnel was up — and immediately put out. No reason was visible either; from the
    outside it looked like "I pressed Connect and nothing happened". The allowance
    now grows with the number of such servers, and if the safety net does fire it
    names the reason and the threshold instead of switching off in silence. For
    configurations without WireGuard servers the threshold is unchanged.

Servers screen

  • One list of entries of every kind. Servers, subscriptions, folders and
    chains are now a single ordered list rather than three different mechanisms:
    the screen used to assemble the list from three separate places on every
    frame, and one drag wrote the settings twice. Deleting and dragging are now one
    entry, one record.
  • Chains travel with servers in a backup. In the export a chain used to be
    ticked under Routing — together with routing rules rather than with the
    servers it stands next to in the list. It now goes under "Server lists". Older
    archives where chains were exported as Routing still read as before; restore
    those with the Routing tick.
  • The Debug API sees every kind. GET /subs now returns the same list you
    see on screen, chains included.

The settings file, the backup format and the settings themselves did not change;
servers, routes and list order stay as they were.

Config editor

  • The Cut/Copy/Paste menu no longer piles up or hangs around after you clear
    the selection.
    Several menus could end up on screen at once — two or three
    stacked, the last one clipped by the screen edge — and tapping an empty spot to
    clear the selection did not dismiss them. The editor was rebuilding the menu's
    controlling object on every repaint of the screen, leaving an already-shown
    menu with no owner and nobody to close it. The editor now keeps one such object
    for the lifetime of the screen, and the menu closes when the selection is
    cleared, when you tap away, when you scroll, and when you leave the screen.
    Tapping the menu's own buttons still does not drop the selection: what gets
    copied is exactly what you selected.

DNS

  • DNS preset Shield: the Yandex server over DoT really takes part in the
    group.
    It used to drop out silently — it was listed as a member, but the
    server entry itself was missing from the template, so on every config build the
    member disappeared with a warning and the "shield" polled five providers
    instead of six. This was most visible to people behind a whitelist: Yandex
    answers on such a network and the other members do not, so resolution did not
    work at all. The server is now declared: Yandex over DNS-over-TLS, direct,
    outside the tunnel — so it works even when the tunnel is down, and queries
    still go encrypted, with no leak into plain UDP. Existing configurations are
    not migrated: the group's membership is taken from the template on the next
    config build.

Stability

  • "Check all servers" no longer runs out of memory on lists with several
    WireGuard/AmneziaWG servers.
    The check starts the core, and the core reserves
    buffers in advance for every WireGuard server in the configuration rather than
    only the one being measured: around 17 MB per server, so close to 200 MB on a
    dozen. The check broke the memory limit and the app closed instead of showing
    the latencies. Such servers are now checked four at a time: between batches the
    core restarts and the buffers are released. Every server is still measured and
    the list order does not change — the check simply takes a little longer. Lists
    with no WireGuard servers work as before.
  • The diagnostic report on server problems no longer skips servers with
    identical names.
    Providers often call every server the same thing — plainly
    proxy, say — and one and the same server can arrive twice under different
    protocols with a shared name. In the parsing problem report such servers
    overlaid one another: only the last survived and the notes on the rest
    vanished. There was no way to notice, because the server count shown next to
    them was right: twelve servers, eight lines of notes. Namesake servers are now
    told apart the same way they are in the server list, and no note is lost.

🔧 Under the hood

A corpus of real public subscriptions now guards the parser: snapshots of 68
public lists — about 74,000 servers as text, exactly as the sources hand them
over — plus the machinery to run parsing across them. Every change to the
protocol registry is checked against a reference: if the number of parsed servers
drops or the rejection codes change, it shows immediately and per subscription
rather than after a complaint. The run only reads text — not one server from the
corpus is connected to or checked for reachability, no config is built and the
core is never started. Contract 1.1.52 (unchanged). Core v1.14.1-lx.10.

🧪 Tests

The release gate is CI checks (analyze, the full test set, four l10n checkers,
docs parity). Added by this patch: the start threshold against the number of
WireGuard endpoints, namesake servers in the warnings report, the config editor
menu against duplicate overlays and every dismissal path, the single sources[]
list round-trip, the dns_shield preset membership, and probe batching on
WireGuard servers.

📚 Documentation

The trial methodology for the public-subscriptions corpus is written down, along
with the specs for this patch's changes. The Debug API reference records that
GET /subs returns every kind of entry.

🇷🇺 Русский

🩹 Исправления

Ядро — v1.14.1-lx.10

  • Диагностика узла NaiveProxy больше не закрывает приложение. При живом
    туннеле Диагностика узла naive закрывала приложение сразу же: ядро читало
    адрес соединения, которого у соединения этого типа нет. Теперь Диагностика
    такого узла отдаёт статус, ответ и время, как у любого другого, а поле адреса
    остаётся пустым — так и должно быть. Трафик через такие узлы и проверка
    задержки не страдали и раньше.
  • Серверы WireGuard и AmneziaWG с адресом по имени подключаются за секунду
    вместо пяти.
    Когда адрес сервера задан доменом, а не IP, первая попытка
    рукопожатия терялась и подключение занимало лишние пять секунд. Теперь оно
    проходит с первой попытки.
  • XHTTP-соединения больше не считаются сбойными при переключении серверов.
    Когда вы меняли сервер или ядро само закрывало уже ненужное XHTTP-соединение,
    оно принимало собственное закрытие за обрыв со стороны сервера: в лог на
    каждый запрос падала строка о закрытом теле ответа, а рабочая XMUX-сессия
    помечалась негодной и пересобиралась заново. Локальная отмена теперь
    распознаётся и не считается сбоем — лог рабочего XHTTP-узла чистый, а
    переключение сервера не обходится лишней пересборкой сессии. Настоящий обрыв
    на стороне сервера сообщается как раньше
    (#148).
  • Синк с апстримом sing-box — правки по DNS, IPv6 и завершению работы.

Схема конфига, набор полей и поведение остальных узлов не менялись.

Подключение

  • VPN из нескольких WireGuard/AmneziaWG-узлов больше не отключается сам через
    15 секунд.
    Ядро поднимает такие узлы по одному, 7–9 секунд на каждый, а
    страховка от зависшего старта ждала фиксированные 15 секунд на любой конфиг. На
    четырёх и более узлах она успевала прибить уже установленное соединение:
    рукопожатие состоялось, туннель поднят — и тут же погашен. Причины при этом
    видно не было, снаружи это выглядело как «нажал Connect, ничего не
    произошло». Теперь запас времени растёт вместе с числом таких узлов, а если
    страховка всё же срабатывает — она называет причину и порог, вместо того чтобы
    молча отключиться. Для конфигов без WireGuard-узлов порог прежний.

Экран Servers

  • Единый список записей всех родов. Серверы, подписки, папки и цепочки
    теперь один упорядоченный список, а не три разных механизма: раньше экран
    собирал список из трёх разных мест на каждый кадр, а одно перетаскивание
    записывало настройки дважды. Удаление и перетаскивание — одна запись.
  • Цепочки в бэкапе едут вместе с серверами. В экспорте цепочка отмечалась
    галкой Routing — вместе с правилами маршрутизации, а не вместе с серверами,
    рядом с которыми она стоит в списке. Теперь она едет галкой «Server lists».
    Старые архивы, где цепочки экспортировались как Routing, читаются
    по-прежнему — восстанавливать их надо галкой Routing.
  • Debug API видит все рода. GET /subs теперь отдаёт тот же список, что
    видит пользователь, включая цепочки.

Файл настроек, формат бэкапа и сами настройки не менялись; узлы, маршруты и
порядок списка остаются как были.

Редактор конфига

  • Меню Cut/Copy/Paste больше не размножается и не висит после снятия
    выделения.
    На экране могло оказаться сразу несколько меню — два-три
    экземпляра друг поверх друга, последний ещё и обрезанный краем экрана, — а
    снятие выделения тапом по пустому месту их не убирало. Редактор заново создавал
    управляющий объект меню при каждой перерисовке экрана, и уже показанное меню
    оставалось без хозяина — закрыть его было некому. Теперь у редактора один такой
    объект на всё время жизни экрана, а меню закрывается и по снятию выделения, и
    по тапу мимо, и при скролле, и при уходе с экрана. Тап по самим кнопкам меню
    по-прежнему выделение не сбрасывает: копируется ровно то, что выделено.

DNS

  • Пресет DNS Shield: сервер Яндекса по DoT реально участвует в группе.
    Раньше он молча выпадал: в группе он был записан, но самой записи сервера в
    шаблоне не было — при каждой сборке конфига участник исчезал с
    предупреждением, и «щит» опрашивал пять провайдеров вместо шести. Заметно это
    было тем, у кого доступ ограничен белыми списками: Яндекс в такой сети
    отвечает, а остальные участники группы — нет, и резолв не работал вовсе.
    Теперь сервер объявлен: Яндекс по DNS-over-TLS, напрямую, без туннеля — то
    есть работает и когда туннель не поднялся, а запросы всё равно идут
    шифрованными, без утечки в открытый UDP. Существующие конфиги не мигрируются:
    состав группы берётся из шаблона при следующей сборке конфига.

Стабильность

  • «Проверка всех серверов» больше не падает на списках с несколькими
    WireGuard/AmneziaWG-узлами.
    Проверка поднимает ядро, а оно заранее резервирует
    буферы под каждый WireGuard-узел конфига, а не только под тот, который меряется
    в данный момент: около 17 МБ на узел, то есть под 200 МБ на десятке. Лимит
    памяти проверка пробивала — и приложение закрывалось вместо того, чтобы
    показать задержки. Теперь такие узлы проверяются порциями по четыре: между
    порциями ядро перезапускается и буферы освобождаются. Все узлы по-прежнему
    меряются, порядок списка не меняется, проверка просто идёт чуть дольше. Списки
    без WireGuard-узлов работают как раньше.
  • Диагностический отчёт о проблемах узлов больше не пропускает узлы с
    одинаковыми именами.
    Провайдеры нередко зовут все узлы одинаково — например,
    просто proxy, — а один и тот же сервер может прийти дважды под разными
    протоколами с общим именем. В отчёте о проблемах разбора такие узлы
    накладывались друг на друга: оставался только последний, а замечания к
    остальным исчезали. Заметить это было нельзя, потому что число узлов рядом
    показывалось верное: двенадцать узлов — восемь строк замечаний. Теперь
    узлы-тёзки различаются так же, как в списке узлов, и ни одно замечание не
    теряется.

🔧 Под капотом

Разбор теперь стоит за корпусом реальных публичных подписок: снимки 68 публичных
списков — около 74 000 узлов текстом, ровно в том виде, в каком их отдают
источники, — и механизм прогона разбора по ним. Каждое изменение реестра
протоколов сверяется с эталоном: если число разобранных узлов упало или сменились
коды отбраковки, это видно сразу и по конкретной подписке, а не после жалобы.
Прогон только читает текст: ни один сервер из корпуса не подключается и не
проверяется на доступность, конфиг не собирается, ядро не запускается. Контракт
1.1.52 (без изменений). Ядро v1.14.1-lx.10.

🧪 Тесты

Релизный гейт — CI checks (analyze, полный набор тестов, четыре l10n-чекера,
паритет доков). Добавленное этим патчем: порог ожидания старта против числа
WireGuard-endpoint'ов, узлы-тёзки в отчёте предупреждений, меню редактора конфига
против дублей оверлея и все пути его закрытия, круг единого списка sources[],
состав пресета dns_shield и порционная проверка WireGuard-узлов.

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

Методика испытаний на корпусе публичных подписок записана, вместе со спеками
изменений этого патча. В справочнике Debug API зафиксировано, что GET /subs
отдаёт записи всех родов.


Install / Установка

adb install -r LxBox-v2.25.3-arm64-v8a.apk

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

No uninstall needed — install over the existing one. Settings and subscriptions
are preserved.


Previous release / Предыдущий релиз: v2.25.2.
The main body of changes is in / Основной корпус изменений —
v2.25.0.