62 lines
4.0 KiB
Markdown
62 lines
4.0 KiB
Markdown
# JavaInstaller
|
|
|
|
`javainstaller.h`, `javainstaller.cpp`
|
|
|
|
Ставит одну сборку Java из каталога [JavaRuntimeService](JavaRuntimeService.md) в
|
|
`<root>/java/<id>/`. Сборки Temurin приходят архивом, сборки Mojang — деревом отдельных файлов,
|
|
поэтому путей установки два.
|
|
|
|
Экземпляр держит [LauncherBackend](LauncherBackend.md). Геттеры прогресса такие же, как у других
|
|
установщиков: `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` приходит, когда вернутся все активные запросы.
|
|
|
|
---
|
|
|
|
При создании этого документа использовался ИИ.
|