Files
quest-kexec/docs/TURNKEY_PACKAGE.md
T

3.5 KiB
Raw Blame History

Turnkey Quest Pro alternate Android package

Split release format

The recommended release uses a device-independent loader ZIP and a separate ROM ZIP. Extract the loader ZIP, then run:

./qkx-install-package.sh /path/to/qkx-quest-pro-rom.zip
./qkx-boot.sh

The loader contains the kernel, BusyBox, kernel modules, installer, initramfs and device helpers. The ROM ZIP contains only the five prepared Android images and turnkey metadata. Neither contains stock calibration or userdata. Existing alternate /data can be retained during ROM replacement; fresh extent maps are still generated and validated.

Build them with:

python3 tools/build-rom-package.py IMAGE_DIR rom.zip
python3 tools/build-loader-package.py loader.zip --kernel /path/to/Image

Files

  • qkx-install-package.sh: interactive installation and package validation.
  • qkx-boot.sh: boots an installed package without repeating package validation.
  • work/qkx-quest-pro-turnkey-v1.zip: generated system package.

The package contains the five alternate Android images, known-good kernel #253, BusyBox, kexec loader, secure-map collector, retained-log helper, and SHA-256 manifest. It contains no userdata and no eye calibration.

Install

Requirements: Linux host, rooted Quest Pro connected through ADB, Python 3, dtc, fdtput, adb, e2fsprogs, and the QKX repository/tool binaries.

cd quest-pro-kexec
./qkx-install-package.sh /path/to/qkx-quest-pro-turnkey-v1.zip

The installer asks for alternate /data size (4–128 GiB). It verifies every ZIP member against manifest.json, checks the device is seacliff, captures the device-specific runtime DT, and installs images only into pinned files under /data/local/tmp/qkx-release. It reads modem_a into another pinned copy; the partition itself is never written. Existing installed partitions are never flashed or formatted.

Revalidate a package without installing:

./qkx-install-package.sh --verify-only /path/to/package.zip

Boot

./qkx-boot.sh

Boot intentionally does not revalidate the ZIP. It uses the verified installed state, reads the current stock eye calibration into a private temporary initramfs, snapshots current secure mappings, and performs kexec. The initramfs mounts the pinned images and launches Android automatically.

On pristine alternate /data, the image synchronously creates the vision data directory, bypasses NUX/provisioning, enables hand tracking and gaze hover, imports current stock eye calibration, requests high ET/FT fidelity, starts the Home activity, and leaves CMS, OTA/update engine, DeviceCert/QSEE/SPSS paths unavailable. Stock calibration and stock userdata are read-only.

Uninstall from the headset

Reboot into rooted stock Android first, then run:

./qkx-uninstall.sh

The script lists exact QKX-owned userdata paths and requires typing REMOVE. It deletes the current pinned installation, legacy QKX installations, and known staging files. It refuses to operate from a QKX kernel or while a helper module is loaded. It never writes, formats, or flashes a partition.

Automation and legacy-retention options:

./qkx-uninstall.sh --yes
./qkx-uninstall.sh --keep-legacy

Host-side packages and state/ are intentionally retained.

Build a package

python3 tools/build-system-package.py \
  ../work/turnkey-images-v4 ../work/qkx-quest-pro-turnkey-v1.zip \
  --kernel ../build/runs/253/Image --repo .

Always distribute the ZIP and its separately recorded SHA-256. Do not add image files, generated state, or calibration material to Git.