ZapretKVN-android/docs/CORE_UPDATE.md
loop-uh ba7364bb95
All checks were successful
Android CI / build (push) Successful in 33m40s
Ядро: Hysteria app/v2.13.0 и автоматическая перегенерация серии патчей
Встроенная Hysteria поднята до app/v2.13.0 — версии, выбранной для Windows
0.8.16; заморозка ядер записана для пары Windows 0.8.16 / Android v0.4.11.

- scripts/update_hysteria_core.py выполняет docs/CORE_UPDATE.md сам: во
  временной копии исходников собирает серию цепочкой коммитов, поднимает
  модули Hysteria, разрешает ожидаемый конфликт go.mod версиями обновлённых
  модулей и формирует новые патчи. В репозиторий пишет, только если прежние
  патчи воспроизводятся байт в байт, go mod tidy -diff не требует изменений
  go.mod и затронутые пакеты компилируются с боевыми тегами; иначе отказывает
  без записи.
- scripts/prepare-stable-core.sh готовит ядра к стабильному релизу одной
  командой: берёт последний стабильный тег Windows и запускает общую
  подготовку, которая при отставании Android вызывает перегенерацию сама.
- Патчи 0003–0005, series.sha256, пины и уведомления о сторонних компонентах
  получены этим скриптом; результат совпал с ручным прогоном процедуры.

libbox.aar пересобран, тесты ядра (включая protocol/hysteria2) и
verify-project.sh проходят.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 00:36:36 +03:00

5.9 KiB
Raw Permalink Blame History

Обновление встроенных модулей ядра (Hysteria и другие Go-зависимости патчей)

sing-box-extended на Android собирается из исходников с серией патчей core-patches/0001…0005. Часть зависимостей живёт не в core.properties, а в go.mod/go.sum, которые эти патчи добавляют. Так устроена официальная Hysteria: github.com/apernet/hysteria/{core,extras}/v2 вшиты в libbox патчем 0003-official-hysteria2-core.patch, а 0005 снова трогает соседние строки go.mod. Поэтому новая версия Hysteria — это перегенерация серии, а не правка одной строки.

Какую версию брать, решает Windows: scripts/resolve_core_versions.py в репозитории windows выбирает последний стабильный app/vX.Y.Z, а check_core_release_freeze.py требует тот же HYSTERIA_CORE_TAG на Android. Отставание останавливает подготовку Android-релиза, незаметно отстать нельзя.

Автоматически

Обычно делать руками ничего не нужно. Подготовка стабильного релиза сама находит отставание и перегенерирует серию:

scripts/prepare-stable-core.sh vMAJOR.MINOR.PATCH

Она берёт последний стабильный релиз Windows, запускает общую prepare_core_release.py, а та при отставании Android вызывает scripts/update_hysteria_core.py --tag app/vX.Y.Z --write. Скрипт выполняет процедуру ниже во временной копии и пишет в репозиторий, только если прежние патчи воспроизводятся байт в байт, go mod tidy -diff не требует изменений go.mod, а затронутые пакеты компилируются с боевыми тегами. libbox.aar после смены пинов пересобирает preBuild-хук Gradle. Отдельно обновление запускается так же: без --write — только проверка.

Автоматика отказывает и ничего не пишет, когда новая Hysteria меняет состав модулей go.mod, требует новых // indirect-строк, конфликтует с патчами вне go.mod/go.sum или не компилируется. Тогда остаётся ручная процедура.

Процедура (вручную, если автоматика отказала)

  1. Копия исходников ядра (не git clone --shared: core-build/source — неглубокий клон), в скриптах только git -C "$SB":

    cp -a core-build/source "$SB"
    
  2. Серия патчей цепочкой коммитов с тегами p0000…p0005 (git apply + commit по порядку из core-patches/series.sha256). Проверка настройки диффа: git -C "$SB" diff --abbrev=8 p0002 p0003 байт в байт совпадает с 0003-official-hysteria2-core.patch — тогда в новых патчах изменится только то, что вы поменяли.

  3. На p0003, с тем Go, что в GO_VERSION (GOTOOLCHAIN=local):

    go get github.com/apernet/hysteria/core/v2@vX.Y.Z github.com/apernet/hysteria/extras/v2@vX.Y.Z
    

    go get поднимает и транзитивные зависимости (quic-go, testify). Проверьте go mod tidy -diff: если он требует новую // indirect-строку в go.mod, добавьте только её. Полный tidy на этом шаге не запускать — он перестраивает блоки из 0001. Из go.sum уберите только хеши прежней Hysteria и прежнего quic-go.

  4. git cherry-pick p0004 p0005. В 0005 ожидаем конфликт в go.mod: он переносит amneziawg-go из косвенных в прямые, а рядом стоит quic-go. Итог: строки amneziawg в блоке // indirect нет, quic-go — новый.

  5. На финальном состоянии (после protocol/xraycore/prepare.sh): go mod tidy -diff не требует изменений go.mod, а go test -count=1 -run '^$' -tags … ./protocol/hysteria2 ./protocol/xraycore ./parser/link ./route/rule ./transport/wireguard компилируется.

  6. Новые патчи — git diff --abbrev=8 между соседними тегами; пересчитать core-patches/series.sha256, CORE_PATCH_SHA256, HYSTERIA_CORE_TAG, HYSTERIA_CORE_COMMIT (go mod download -json …@vX.Y.Z → Origin.Hash), обновить версию в docs/THIRD_PARTY_NOTICES.md и app/src/main/res/raw/third_party_notices.txt (файлы одинаковые).

  7. Полный scripts/build-core.sh (Go из GO_VERSION первым в PATH, ANDROID_HOME), затем unit-тесты и scripts/verify-project.sh.

Версия Go

GO_VERSION на Android и amnezia.toolchain в core-lock.windows-x64.json обязаны совпадать (check_core_release_freeze.py). Поднимаются вместе: toolchain ставится в ~/.local/share/toolchains/go-X.Y.Z (SHA-256 из https://go.dev/dl/?mode=json), /usr/local/bin/go переключается после коммита пинов, в .forgejo/workflows/*.yml меняется go-version.