4.0 KiB
JavaInstaller
javainstaller.h, javainstaller.cpp
Ставит одну сборку Java из каталога JavaRuntimeService в
<root>/java/<id>/. Сборки Temurin приходят архивом, сборки Mojang — деревом отдельных файлов,
поэтому путей установки два.
Экземпляр держит LauncherBackend. Геттеры прогресса такие же, как у других
установщиков: label, stage, currentFile, bytesDone, bytesTotal, fraction, плюс
runtimeId. Сигналы: started(label), progressChanged() (не чаще раза в 100 мс),
finished(runtimeId, javaPath), failed(label, message), canceled(label).
install(entry)
Если установка уже идёт, вызов молча игнорируется. Иначе:
- проверяется папка лаунчера;
- папка
<root>/java/<id>удаляется целиком, если она была, и создаётся заново. Повторная установка — это всегда установка с нуля; - дальше одна из двух веток.
Temurin (zip, tar.gz)
- Архив качается в
<root>/cache/java/<имя файла>черезQSaveFile, sha256 считается на ходу и сверяется с каталогом. zipраспаковывается черезQZipReaderпо 24 записи за такт таймера, чтобы окно не подвисало. Права из архива переносятся. Записи, которые ведут за пределы папки сборки, останавливают установку.tar.gzраспаковывается системнымtar -xzf. Он есть на Linux, macOS и Windows 10 и новее.QZipReadertar не умеет, а держать ради этого ещё одну библиотеку незачем.- Архив удаляется.
Прогресс при загрузке считается в байтах, при распаковке zip — в записях. Для tar прогресса нет.
Mojang
- Качается
manifest.jsonкомпонента. Его sha1 из каталога сейчас не проверяется. - Из
filesстроится дерево: папки создаются сразу, ссылки откладываются, файлы ставятся в очередь. - До 4 файлов качаются параллельно, sha1 каждого сверяется. При временной ошибке (таймаут,
5xx и т. п.) и при несовпадении хеша файл уходит в конец очереди без паузы. После третьей
неудачи установка падает. Файлам с
executable: trueставится бит исполнения. - Ссылки создаются через
QFile::link. Если не вышло (на Windows без прав разработчика), файл копируется.
Конец
JavaRuntimeStore::locateBinary() находит bin/java. На Unix ему ставится бит исполнения.
runtime.json записывается последним: пока его нет, JavaRuntimeStore сборку не видит. Поэтому
недокачанная сборка в списке не появится, даже если лаунчер упал на середине.
При ошибке и при отмене папка сборки и скачанный архив удаляются.
cancel()
Обрывает загрузки и убивает tar. canceled приходит, когда вернутся все активные запросы.
При создании этого документа использовался ИИ.