Files

61 lines
4.0 KiB
Markdown
Raw Permalink Normal View History

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