Files
DroidDeck/docs/development/arm64-steam-client.md

60 lines
4.0 KiB
Markdown

# Native arm64 Steam client: channel and runtime
The default client is Valve's arm64 Linux build (`steamrtarm64/steam`). Valve does not support it, but
publishes it on the Steam Deck client channels. `droiddeck-steam-install` installs it and
`droiddeck-session` starts it with `STEAM_RUNTIME=1`.
## Channel
- The default is `steamdeck_publicbeta` (manifest `steam_client_steamdeck_publicbeta_linuxarm64`).
Valve also publishes `steam_client_steamdeck_stable_linuxarm64`.
- `droiddeck-steam-install --channel` prints the channel in use. The session passes that value as
`-clientbeta` and writes it to `package/beta`. The two must match, or the client loops on rc 42.
- Setting: `BL_STEAM_CHANNEL`, otherwise `~/.config/droiddeck/steam-channel`, set to `beta` or
`stable`. A set channel never changes on its own.
- With no setting, the client falls back to `steamdeck_stable` automatically. It stays on stable
(`package/droiddeck-channel`) until a setting says otherwise. The fallback happens:
- when the client was started two more times without being shown after the start-failure repair
(`package/droiddeck-unconfirmed`: two unconfirmed starts trigger a repair, which writes
`repaired`; two more unconfirmed starts trigger the fallback);
- when the beta manifest has no `*_linuxarm64_linuxarm64` component. The install log then lists the
manifest's block names, so a renamed or removed arm64 build can be seen.
- The x86-64 client keeps `steamdeck_publicbeta` (see [x86-64-steam-client.md](x86-64-steam-client.md)).
## Steam Runtime container
Valve's 2026-10-15 beta made the x86 Linux client 64-bit and put it in a Steam Runtime container
(pressure-vessel). The container needs unprivileged user and mount namespaces and a D-Bus session bus,
which an Android app does not have. The x86-64 path already works around this. The arm64 client gets the
same treatment if Valve containerizes it too:
- `STEAM_STEAMRT_RECURSION_GUARD=1` is exported for both clients. It tells the client that it is
already inside its container, so after an update it does not re-execute itself through
`pressure-vessel-wrap` (bwrap).
- `droiddeck-steamrt-shim <client dir> <shim dir>` builds the shim when the client carries
`pv-runtime/steam-runtime-steamrt` or a `steam-runtime-check-requirements` probe:
- Valve's runtime is linked file by file;
- the probe is replaced with `exit 0`;
- its own `steam-runtime-launch-client` runs commands directly.
For the arm64 client the session then starts it with `STEAM_RUNTIME_STEAMRT` and `PATH` pointing
at `~/.droiddeck-steamrt-shim` and logs "Valve containerized the arm64 Steam client". Without those
files the shim is not built and the start is unchanged.
## What Valve's manifests carry (checked 2026-10-22)
- `steam_client_steamdeck_publicbeta_linuxarm64` (1792626604) and `steam_client_steamdeck_stable_linuxarm64`
(1792618285) have the same blocks. Three platforms share them:
- `*_linuxarm64_linuxarm64`: the native client (`steamrtarm64/`, `linuxarm64/`). No pressure-vessel, no
`steam-runtime-check-requirements`. These are the only platform blocks the installer keeps.
- `*_steamrt_linuxarm64`: Valve's x86-64 SteamRT 3c client (`steamrt64/steam` is an x86-64 ELF) with
`steamrt64/pv-runtime/steam-runtime-steamrt` (pressure-vessel, `steam-runtime-check-requirements`,
`steam-runtime-launch-client`). This is the containerized client the 2026-10-15 beta made the default on
x86. Valve ships it to arm64 hosts as well, presumably to run under FEX. The installer skips it.
- `bins_androidarm64_linuxarm64`: `androidarm64/libsteamclient.so`, `steamservice.so` and friends.
- `steam_client_steamdeck_publicbeta_ubuntu12` has stopped at 1792108788, while stable `ubuntu12` follows
stable (1792618285). On beta the 32-bit `ubuntu12` client no longer gets updates.
- If a future manifest drops `*_linuxarm64_linuxarm64`, the installer logs the block list and moves to
stable. If stable drops it too, the remaining option is the x86-64 client under FEX
([x86-64-steam-client.md](x86-64-steam-client.md)).