Сборка и выпуск
Исходники каждой версии приложены к релизу (RVC-x.y.z-source.zip).
Что нужно
- JDK 17+;
- Android SDK (platform 36, build-tools 36) и NDK 27.2.12479018;
- Rust (stable) с целями
aarch64-linux-android,armv7-linux-androideabi,x86_64-linux-android,i686-linux-androidиcargo-ndk; - Python 3 и GitHub CLI — для выпуска.
Сборка
./scripts/fetch-natives.sh # libv2ray.aar (Xray) и libwg-go.so (AmneziaWG) с проверкой SHA-256, урезанные геобазы
./scripts/build-rust.sh # librvcnet.so для четырёх ABI
./gradlew :app:testDebugUnitTest :app:assembleRelease -PrvcVersion=1.0.3APK появятся в app/build/outputs/apk/release/: по одному на ABI и universal.
Подпись
keystore.properties в корне проекта (storeFile, storePassword, keyAlias, keyPassword) или переменные окружения RVC_KEYSTORE, RVC_KEYSTORE_PASSWORD, RVC_KEY_ALIAS, RVC_KEY_PASSWORD.
Один ключ на все версии
Обновление из приложения сверяет сертификат подписи с установленным. APK, подписанный другим ключом, не установится поверх.
Выпуск версии
# APK переименовываются в RVC-<версия>-<abi>.apk и кладутся в dist/
python scripts/make-update-json.py 1.0.3 dist makdren/RVC notes.txt # update.json
sha256sum dist/RVC-1.0.3-*.apk > dist/SHA256SUMS
gh release create v1.0.3 -R makdren/RVC dist/RVC-1.0.3-*.apk dist/update.json dist/SHA256SUMSВ notes.txt строки, начинающиеся с - , попадают в окно обновления (первые три — в баннер на главном экране). На Windows запускайте скрипт с PYTHONIOENCODING=utf-8.
versionCode = MAJOR × 10000 + MINOR × 100 + PATCH.
Формат update.json
RVC раз в сутки читает https://github.com/makdren/RVC/releases/latest/download/update.json:
{
"versionCode": 10003,
"versionName": "1.0.3",
"notes": ["Что изменилось"],
"assets": {
"arm64-v8a": {"url": "https://github.com/makdren/RVC/releases/download/v1.0.3/RVC-1.0.3-arm64-v8a.apk", "sha256": "…", "size": 17187568},
"universal": {"url": "…", "sha256": "…", "size": 64036138}
}
}Windows
Нужны JDK 21, Go 1.27 и Rust с целью x86_64-pc-windows-gnu (MinGW-w64). Модуль desktop/ — Compose Multiplatform поверх общего модуля shared.
desktop/scripts/build-natives.sh # rvc-core.exe (Go + Xray-core), rvcnet.dll, wintun.dll и геобазы → desktop/resources/windows
./gradlew :desktop:test :desktop:createReleaseDistributable -PrvcDesktopVersion=1.1.0
powershell -File desktop/installer/build-cds.ps1 -AppDir desktop/build/compose/binaries/main-release/app/RVC
powershell -File desktop/installer/build-portable.ps1 -Version 1.1.0 -OutDir distbuild-cds.ps1 добавляет архив классов (быстрее запуск), build-portable.ps1 кладёт portable.txt и упаковывает папку в dist/RVC-windows-<версия>-portable.zip. Скрипт проверяет, что RVC.cfg записан без BOM: с ним лаунчер падает с «Failed to launch JVM».
Выпуск — отдельным релизом windows-vX.Y.Z, не «последним», чтобы releases/latest по-прежнему вёл к Android и его update.json:
python scripts/make-windows-update.py 1.1.0 dist makdren/RVC notes-windows.txt # update-windows.json
gh release create windows-v1.1.0 -R makdren/RVC --latest=false dist/RVC-windows-1.1.0-portable.zip dist/RVC-windows-1.1.0-source.zip dist/update-windows.jsonRVC для Windows находит самый свежий релиз windows-v… через GitHub API и читает из него update-windows.json:
{
"version": "1.1.0",
"notes": ["Что изменилось"],
"portable": {"url": "https://github.com/makdren/RVC/releases/download/windows-v1.1.0/RVC-windows-1.1.0-portable.zip", "sha256": "…", "size": 87469407}
}Архив принимается только с github.com/makdren/RVC/releases/download/windows-v… и только при совпадении размера и SHA-256. RVC распаковывает его, заменяет файлы в своей папке (кроме data и portable.txt) и перезапускается; номер версии должен расти.
Этот сайт
Документация лежит в папке site/ репозитория и собирается VitePress. При каждом изменении в main GitHub Actions пересобирает сайт и публикует его на GitHub Pages.
cd site
npm ci
npm run docs:dev # локально на http://localhost:5173/RVC/