Files
2026-10-11 22:32:13 +03:00

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)

Если установка уже идёт, вызов молча игнорируется. Иначе:

  1. проверяется папка лаунчера;
  2. папка <root>/java/<id> удаляется целиком, если она была, и создаётся заново. Повторная установка — это всегда установка с нуля;
  3. дальше одна из двух веток.

Temurin (zip, tar.gz)

  1. Архив качается в <root>/cache/java/<имя файла> через QSaveFile, sha256 считается на ходу и сверяется с каталогом.
  2. zip распаковывается через QZipReader по 24 записи за такт таймера, чтобы окно не подвисало. Права из архива переносятся. Записи, которые ведут за пределы папки сборки, останавливают установку.
  3. tar.gz распаковывается системным tar -xzf. Он есть на Linux, macOS и Windows 10 и новее. QZipReader tar не умеет, а держать ради этого ещё одну библиотеку незачем.
  4. Архив удаляется.

Прогресс при загрузке считается в байтах, при распаковке zip — в записях. Для tar прогресса нет.

Mojang

  1. Качается manifest.json компонента. Его sha1 из каталога сейчас не проверяется.
  2. Из files строится дерево: папки создаются сразу, ссылки откладываются, файлы ставятся в очередь.
  3. До 4 файлов качаются параллельно, sha1 каждого сверяется. При временной ошибке (таймаут, 5xx и т. п.) и при несовпадении хеша файл уходит в конец очереди без паузы. После третьей неудачи установка падает. Файлам с executable: true ставится бит исполнения.
  4. Ссылки создаются через QFile::link. Если не вышло (на Windows без прав разработчика), файл копируется.

Конец

JavaRuntimeStore::locateBinary() находит bin/java. На Unix ему ставится бит исполнения. runtime.json записывается последним: пока его нет, JavaRuntimeStore сборку не видит. Поэтому недокачанная сборка в списке не появится, даже если лаунчер упал на середине.

При ошибке и при отмене папка сборки и скачанный архив удаляются.

cancel()

Обрывает загрузки и убивает tar. canceled приходит, когда вернутся все активные запросы.


При создании этого документа использовался ИИ.