Files
strongswan-ext/AGENTS.md
DenozordecandClaude Opus 5.5 68ee051ab2
Android / pre-check (push) Failing after 8s
Android / android (push) Skipped
CIFuzz / pre-check (push) Failing after 3s
CIFuzz / fuzzing (address) (push) Skipped
CIFuzz / fuzzing (undefined) (push) Skipped
CodeQL / pre-check (push) Failing after 4s
CodeQL / analyze (python) (push) Skipped
CodeQL / analyze (ruby) (push) Skipped
CodeQL / analyze-cpp (push) Skipped
FreeBSD / pre-check (push) Failing after 3s
FreeBSD / freebsd (14.4) (push) Skipped
FreeBSD / freebsd (15.0) (push) Skipped
Linux / pre-check (push) Failing after 4s
Linux / latest (apidoc) (push) Skipped
Linux / latest (clang, no, all) (push) Skipped
Linux / latest (clang, no, default) (push) Skipped
Linux / latest (clang, no, printf-builtin) (push) Skipped
Linux / latest (clang, no-dbg) (push) Skipped
Linux / latest (clang, no-testable-ke) (push) Skipped
Linux / latest (clang, yes, all) (push) Skipped
Linux / latest (clang, yes, default) (push) Skipped
Linux / latest (clang, yes, fuzzing) (push) Skipped
Linux / latest (coverage) (push) Skipped
Linux / latest (dist) (push) Skipped
Linux / latest (gcc, no, all) (push) Skipped
Linux / latest (gcc, no, default) (push) Skipped
Linux / latest (gcc, no, printf-builtin) (push) Skipped
Linux / latest (gcc, yes, all) (push) Skipped
Linux / latest (gcc, yes, default) (push) Skipped
Linux / latest (nm) (push) Skipped
Linux / latest (no-dbg) (push) Skipped
Linux / latest (no-testable-ke) (push) Skipped
Linux / latest (yes, ld) (push) Skipped
Linux / crypto (ubuntu-22.04, openssl-sys) (push) Skipped
Linux / crypto (ubuntu-latest, botan) (push) Skipped
Linux / crypto (ubuntu-latest, openssl-3) (push) Skipped
Linux / crypto (ubuntu-latest, openssl-4) (push) Skipped
Linux / crypto (ubuntu-latest, openssl-awslc) (push) Skipped
Linux / crypto (ubuntu-latest, openssl-sys) (push) Skipped
Linux / crypto (ubuntu-latest, wolfssl) (push) Skipped
Linux / older (clang, ubuntu-22.04, all) (push) Skipped
Linux / older (gcc, ubuntu-22.04, all) (push) Skipped
Linux / older (gcc, ubuntu-22.04, nm) (push) Skipped
Linux / alpine (push) Skipped
macOS / pre-check (push) Failing after 4s
macOS / macos (macos-14) (push) Skipped
macOS / macos (macos-latest) (push) Skipped
SonarCloud / pre-check (push) Failing after 3s
SonarCloud / sonarcloud (push) Skipped
TKM / pre-check (push) Failing after 3s
TKM / tkm (push) Skipped
Windows / pre-check (push) Failing after 4s
Windows / cross-compile (win32) (push) Skipped
Windows / cross-compile (win64) (push) Skipped
Windows / native (i686, mingw32, win32) (push) Skipped
Windows / native (x86_64, mingw64, win64) (push) Skipped
android: version 2.19.4 (172) — обновления и отчёты через панель SHX VPN
- проверка обновлений через API панели (get.shnt.top/api/v1): подписанный запрос (HMAC),
  манифест с подписью Ed25519; старый бакет — только запасной путь при сетевой ошибке
- экраны обновления по макету: страница «Обновления» с каналом и кодом беты, шторки
  «Что нового», «Скачивание» (с отменой), «Обязательное обновление», «Не установлено»
- отправка отчёта из журнала в панель: код отчёта, запись в «Событиях», письмо как запасной путь;
  к отчёту прикладываются результаты проверки сети (checks.json) и diag.log
- исправлен вылет при скачивании обновления на Android 16.0 (setRequestPromotedOngoing есть только с API 36.1)
- кнопки шторок переносят текст на вторую строку, однословные уменьшаются
- задача Gradle uploadShx: сборка и загрузка APK в панель (scripts/upload-apk.mjs)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-08 22:38:45 +07:00

7.2 KiB
Raw Permalink Blame History

Память проекта

Основная работа в репозитории — Android-приложение SHX VPN (src/frontends/android), форк клиента strongSwan. Описание приложения, кода, локализации и релиза: src/frontends/android/docs/README.md. Дизайн: src/frontends/android/docs/design/README.md (макет «Финал 2026»).

Android-приложение: дизайн и UI

  • Эталон — макет «Финал 2026» (артборды F_*, тёмная тема D_*): живой холст https://claude.ai/artifact/UCC88C9hkU3hDU2YwMck1a, копия исходников в docs/design/final-2026/. Экраны делаются строго по макету; новый экран сначала появляется на холсте.
  • UI собирается только из компонентов макета: ui/compose/design/ShxKit.kt, ShxIcons.kt, цвета и шрифты ui/compose/theme/ShxDesign.kt (LocalShxColors, ShxType). Сторонние цвета, размеры и стандартные M3-диалоги не использовать.
  • Изменили экран в коде — обновите F_* и парный D_* на холсте и копию в docs/design/final-2026/.

Android-приложение: строки и переводы

  • Языки: en (база), ru, de, pl, uk, zh-rCN, zh-rTW. Новая строка добавляется сразу во все семь values*/strings.xml.
  • Плейсхолдеры и \n как в английской строке; кавычки и plurals по языку — см. раздел «Локализация» в docs/README.md.
  • После правок строк смотреть de и uk на эмуляторе (adb shell cmd locale set-app-locales one.shx.strongswan.ext --locales de-DE): длинные слова не должны переноситься в навигации и заголовках. Сброс — --locales "".

Android-приложение: сборка и выкладка

  • Бакет S3 (Selectel, shx-app) ПРИВАТНЫЙ. Публичного чтения нет и включать его не нужно: GET https://s3.ru-7.storage.selcloud.ru/shx-app/latest.json всегда отдаёт AccessDenied — это норма, а не ошибка выкладки. Проверять результат публикации только авторизованно: aws s3 cp s3://shx-app/latest.json - (endpoint и ключи из .env).
  • Сборка и публикация — скриптом build-local.sh (Git Bash) или build-local.ps1 в src/frontends/android: он читает .env, собирает assembleRelease, подписывает keystore'ом из .env, генерирует latest.json (sha256/size/versionCode) и заливает shx-vpn.apk + latest.json в корень бакета с Cache-Control: no-cache.
  • Порядок релиза: --skip-upload → smoke-тест APK на эмуляторе (AVD shx36, все вкладки, adb logcat -b crash) → выгрузка именно проверенного build/publish/shx-vpn.apk и latest.json через aws s3 cp → сверка latest.json в бакете. Выгрузка в S3 — только с подтверждения владельца.
  • .env нельзя парсить через source/eval: значения NOTES_RU и AWS_CA_BUNDLE содержат пробелы и обратные слэши. Разбирать только построчно KEY=... (как в build-local.sh).
  • aws cli установлен через pip: %APPDATA%\Python\Python313\Scripts\aws (скрипт сам добавляет путь в PATH).
  • versionCode растёт вручную в app/build.gradle; перед сборкой сверять с versionCode в latest.json бакета.
  • NOTES_RU в .env — заметки релиза (попадают в latest.json → диалог обновления в приложении); обновлять под релиз. .env не в git: в worktree лежит своя копия, после релиза перенести NOTES_RU в .env основного checkout.
  • Сборка из worktree: скопировать игнорируемые входы из основного checkout (.env с абсолютным KEYSTORE_FILE, local.properties, Android.common.mk, app/src/main/jni/openssl/, сгенерированные исходники libstrongswan — список в docs/README.md) и собирать с ORG_GRADLE_PROJECT_shortNdkCommands=true (иначе линковка упирается в лимит длины команды Windows).
  • Автообновление приложения: logic/updates/UpdateManager.kt качает манифест/APK, сверяет SHA-256 и подпись.

Android-приложение: выкладка через панель SHX VPN

Когда владелец просит «собери и выложи» (или «собери и загрузи в панель»), выкладка идёт через панель https://apk.shnt.top, а не через aws s3 cp. Сама просьба и есть подтверждение владельца на загрузку.

  • Команда (из src/frontends/android, с ORG_GRADLE_PROJECT_shortNdkCommands=true при сборке из worktree): ./gradlew uploadShx — собирает assembleRelease и загружает APK черновиком в канал beta, тип phone.
  • Опубликовать сразу — только если владелец сказал «опубликуй»: ./gradlew uploadShx -PshxPublish -PshxRollout=<процент>. Без явного процента спросить его. Канал релиза — -PshxChannel=release, другой тип — -PshxType=<id>.
  • Заметки «Что нового» берутся из NOTES_RU в .env; другие — -PshxNotes="...". Перед выкладкой проверить, что NOTES_RU и versionCode в app/build.gradle относятся к этому релизу (панель отклонит уже загруженный код версии).
  • Нужны SHX_URL и SHX_TOKEN (заданы у пользователя Windows; скрипт scripts/upload-apk.mjs читает их и из реестра, если процесс запущен раньше). Не печатать значение токена.
  • Подпись: release APK подписывается keystore из .env (KEYSTORE_FILE); неподписанный APK задача не загружает.
  • После загрузки сообщить владельцу ссылку на версию из вывода скрипта и статус (черновик или текущая с процентом).
  • Сборка для старых приложений 2.19.x (latest.json в корне бакета) по-прежнему идёт через build-local.* и требует отдельного подтверждения.