Skip to content

Lepton (Android compat tool): titles start but immediately exit #58

Description

@loki666

Summary

Valve's Lepton compat tool (Steam app 3029110) is selected correctly by the Steam client on
our image, but cannot launch anything: Lepton drives its Android container entirely through
podman, and our rootfs ships no container runtime at all.

Measured on an AYANEO Pocket ACE (SM8550), dev build 9bde3fe / BUILD_ID=20260822T094920Z,
kernel 7.2.0.

Symptom

Launching an Android title (AOG.apk, app 4545850) starts the tool and dies ~5s later:

[18:13:26] AppID 4545850 adding PID 2345 as a tracked process
  ... reaper SteamLaunch AppId=4545850 -- '.../Lepton'/lepton waitforexitandrun -- '.../AOG.apk'
[18:13:31] AppID 4545850 no longer tracking PID 2349, exit code -1
[18:13:31] AppID 4545850 no longer tracking PID 2348, exit code -1
[18:13:31] Remove 4545850 from running list

steamapps/compatdata/4545850/ contains only baked/data_overlay — it never got as far as
building a container.

Root cause

Lepton calls podman for every container operation, resolved from PATH, and does not vendor a
copy (find over the whole installed tree returns no podman, crun, or steamvr binary):

  • liblepton/liblepton.shpodman run / start / wait / exec / stop / rm / ps /
    events / inspect
  • liblepton/liblepton.sh:356env -i PATH="..." $(which podman) exec ... lepton-${LEPTON_CONTEXT}
  • liblepton/mounting.sh — builds PODMAN_CMDLINE[@], mounts via podman_mount_entry

Dependency state on the device

dependency state
podman MISSING
crun / runc MISSING
pasta / passt MISSING
fuse-overlayfs MISSING
newuidmap / newgidmap present
/etc/subuid, /etc/subgid for deck present (100000:65536)
overlay, fuse in /proc/filesystems present
/proc/sys/user/max_user_namespaces 30436

pasta (not slirp4netns) is the one it wants — liblepton/networking.sh builds
-I eth0, --ipv4-only, --no-ndp, --no-dhcp, --no-dhcpv6, which are passt/pasta flags.

A repo-wide grep for podman|pasta|passt|crun|fuse-overlayfs matches nothing: we have never
shipped a container runtime, so this is a gap, not a regression.

The rootless prerequisites are otherwise already in place (subuid/subgid, userns, overlay, fuse),
so this may be purely a matter of adding packages.

What already works — do not chase it

The Steam-side integration is fine. compat_log.txt shows the tool registered and selected:

Registering tool lepton, AppID 3029110
Skip mapping AppID 4545850 to tool "native" with priority 75:
  mapping to tool "lepton" with priority 250 already exists.
Posting tool registration callback 3029110 lepton
Loaded manifest for tool 3029110.

This is not the account-gating situation seen with the FEX compat tool (3127680) — selection
works, the runtime is simply absent. Note 3127680 is registered but not installed; 3029110 is
installed.

Also ruled out: binder is irrelevant here. Lepton has zero binder/ashmem references and its
README states it "runs as a non-root user without requiring any rootful setup or helpers" — it
avoids binder by design. Our CONFIG_ANDROID_BINDER_IPC is not set does not affect this.

Secondary defect: Lepton is silent on our image

Worth fixing alongside, because it is why this left no diagnostic trail:

liblepton/utils.sh:85:   STEAMVR_LOGS_DIR="$(steamvr logpath || true)"
liblepton/utils.sh:103:  print "${1:-/${STEAMVR_LOGS_DIR}/lepton-${CONTEXT}.log}"

We ship no steamvr binary, and || true swallows that, so STEAMVR_LOGS_DIR is empty and the
log path collapses to /lepton-.log — on a root mounted ro,relatime (btrfs). log_to_file's
tee then fails into its own || true and all output is discarded.

The same empty variable also disables:

  • logcat_debug_dir() (liblepton/performance_debugging.sh:3)
  • the EARLY_SHUTDOWN automatic logcat dump (lepton:205), which fires on any exit under 30
    seconds and would have caught this run

Pointing STEAMVR_LOGS_DIR at a writable path before launch should restore diagnostics.

Scope decision needed before this is worked

Adding podman + crun + pasta + fuse-overlayfs is a non-trivial addition to an image we have been
actively trimming, in exchange for Android-game support that is not currently a committed feature.
That is a product call, not a bug fix — hence P3. Re-label if Android titles become in-scope.

Closing criteria (hw-gate)

Cannot be closed on a build-time check. Closing requires an Android title actually launching and
rendering through Lepton on real hardware, plus a Lepton log written to a real path.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    P3Nice to have -- hygiene, polish, weak leadsarea/buildSubsystem: buildarea/steamSubsystem: steamhw-gateCannot be closed without evidence from a real device

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions