| English | Русский |
Нативный Android-клиент для администрирования Remnawave — self-hosted панели управления VPN/proxy. Написан на Kotlin Multiplatform и Compose Multiplatform: весь UI и бизнес-логика — в общем коде (iOS-таргет собирается как framework).
https://panel.example.com),# Debug APK
./gradlew :app:assembleDebug
# Release APK
./gradlew :app:assembleRelease
# Юнит-тесты
./gradlew :composeApp:testAndroidHostTest
# iOS framework (требуется полный Xcode)
./gradlew :composeApp:linkDebugFrameworkIosArm64
Требования: JDK 17+, Android SDK 36. Минимальная версия Android: 12 (API 31).
Двухмодульная структура (AGP 9+ запрещает совмещать com.android.application и kotlin.multiplatform в одном модуле):
| Модуль | Назначение |
|---|---|
:app |
Тонкий Android-лаунчер — MainActivity, Application, манифест, ресурсы |
:composeApp |
Весь общий код: Compose UI, домен, данные, DI. Собирается в Android AAR и iOS framework |
Внутри :composeApp/commonMain: MVVM на StateFlow, Ktor-клиент с Bearer-авторизацией для REST API Remnawave, репозитории с маппингом DTO в доменные модели, Koin для DI и DataStore для настроек. Навигация — нижний навбар с master-detail внутри экранов (без navigation-compose). API-ключ шифруется при хранении через платформенный SecretStore (Android Keystore / iOS Keychain).
| Роль | Библиотека |
|---|---|
| Язык / UI | Kotlin Multiplatform, Compose Multiplatform (Material 3) |
| Сеть | Ktor Client + kotlinx.serialization |
| DI | Koin |
| Хранилище | AndroidX DataStore (multiplatform) |
| ViewModel | JetBrains lifecycle-viewmodel-compose |
| Изображения / QR | Coil 3, qrose |
| Дата/время | kotlinx.datetime |
| Логирование | Kermit |
Распространяется под лицензией European Union Public Licence v. 1.2 (EUPL-1.2).