Архитектура
Структура модулей
smartycraft-open-launcher/├── client-config # Константы, AppConfig, BuildConfig├── client-core # Доменные модели, API-сервисы, интерфейсы├── client-launcher # DI, загрузка файлов, обновления, запуск└── client-ui # Compose Multiplatform UIclient-config
Глобальные константы: URL серверов, таймауты, пути к файлам, конфиг прокси.
Генерирует BuildConfig с версией и временем сборки через gmazzo/buildconfig.
client-core
Чистая бизнес-логика — без UI и DI-фреймворка.
AuthService— вход, расшифровка AES-токена, определение SSL-ошибокServerRepository— запрос дашборда, цикл обновления хэша лаунчераSkinRepository— загрузка скина/плащаHttpClientProvider— переключение между безопасным/небезопасным OkHttp клиентом в рантайме- Доменные модели:
SessionData,FileManifest,SettingsDataи др.
client-launcher
Связывает всё вместе через Koin DI.
FileDownloadService— разворачивание манифеста, параллельная загрузка, MD5 верификация, распаковка extra.zipLauncherService+GameCommandBuilder— сборка JVM команды для 1.7.10 / 1.12.2 / 1.21.1UpdateService— GitHub Releases API, определение артефакта по ОС, SHA256 верификацияCredentialsManager— AES-256-GCM шифрование с PBKDF2 деривацией ключаProfileManager— профили экземпляров по серверам, избранное, последний серверJavaManagerService— загрузка бандлов Bellsoft JDK по версии Minecraft
client-ui
Compose Multiplatform UI.
AppLayout/AppRoot— корневая композиция, управление окном, авто-входDashboardScreen— сетка серверов, панель запускаRightPanel— панель входа/аккаунта, лента новостейTrayManager— обёртка dorkbox/SystemTrayLauncherController— машина состояний пайплайна запуска (Idle → Prepare → Downloading → GameRunning)
Ключевые архитектурные решения
HttpClientProvider вместо прямой инжекции HttpClient
Репозитории получают провайдер, который определяет правильный клиент при каждом вызове. Это позволяет SSL-обходу вступить в силу немедленно без пересоздания синглтонов Koin.
Фиксация версии JNA
dorkbox/SystemTray 4.4 выполняет жёстко заданную проверку версии JNA. JetBrains Runtime 25 бандлит JNA 7.x, что не проходит эту проверку. Решение: resolutionStrategy.eachDependency форсирует JNA на 6.1.6 глобально, с 5.18.1 явно в client-ui для Windows.
Ручная сборка AppImage
Встроенная упаковка Compose Multiplatform для Linux производит DEB/RPM. AppImage собирается вручную в CI через jlink для минимального JRE и appimagetool, с инжектированием .desktop и AppStream metainfo.
Конфиги версий GameCommandBuilder
Каждая поддерживаемая версия Minecraft имеет иммутабельный VersionConfig — главный класс, tweak-класс, JVM-флаги, директория нативных библиотек. NeoForge (1.21.1) требует разделения module path (-p) и дополнительных флагов --add-opens для Java 21+.