Files

88 lines
4.8 KiB
YAML

emulator: Starboard
type: standalone
core_classification: other
source: "https://github.com/get-starboard/starboard"
upstream: closed-source
author: "force9"
profiled_date: "2026-08-12"
source_commit: "d3a21a9aaeabb90e59d7a48241b293dba3ee9309"
core_version: "0.23.0"
display_name: "PortMaster library (Starboard)"
verification: existence
cores:
- starboard
- STARBOARD
- org.force9.starboard
systems: []
mode: standalone
notes: |
Catalogue manager and execution environment for the PortMaster library on
Android ARM64 handhelds. PortMaster ports are Linux ARM64 builds, so nothing
is emulated: proot opens a userspace chroot into a Debian bookworm root
filesystem and the games run there as native binaries against glibc, SDL2 and
Mesa. ES-DE reaches it through the ports system, passing a .port file as the
port_file extra to org.force9.starboard/.ui.game.GameActivity.
The build read here is the signed release Starboard-v0.23.0.apk, sha256
a81b69d471ee88ad6c47497e616c5a7c68bf8ebfb32bc7ae9348ed46c3190b3d, matching the
digest GitHub records for the asset. The source is not published, so the
readings below cite a jadx decompilation of classes.dex taken with
--show-bad-code, where org.force9.starboard.* keeps its names and the rest is
r8 output under defpackage.
The APK carries its own execution stack in lib/arm64-v8a: libproot.so,
libproot_loader.so and libtalloc2.so mirrored from Termux through
get-starboard/starboard-prebuilts, libSDL2_starboard.so preloaded ahead of the
SDL2 in the rootfs, libasound_module_pcm_starboard.so as the ALSA output
plugin, libGLESv2_wrap.so with libvirgl_vtest.so and libvirglrenderer_sb.so
for the per-port GPU path, libandroid-shmem.so, and libgame_bridge.so which
starts proot and builds the PortMaster environment. Android installs all of
them with the package.
What the ports find under /opt/system/Tools/PortMaster is written at launch by
libgame_bridge.so: bind_directories.sh, patch_ld_preload.sh,
seed_retroarch_cfg.sh and launcher.sh under /tmp/sb, the gptokeyb shim,
runtimes.json, control.txt and device_info.txt, with etc/resolv.conf and
etc/hosts seeded straight after extraction. The ES-DE sync writes the .port
files it later launches from, each holding a zip_name and a launcher key,
along with a ports entry in custom_systems/es_systems.xml and
gamelists/ports/gamelist.xml.
Games install to Starboard/ports on shared storage, marked by a
.starboard_installed file, and come from the PortMaster catalogue rather than
from this profile. A port that declares a runtime pulls a squashfs image into
opt/system/Tools/PortMaster/libs inside the rootfs on first launch, named by
the port and resolved through the utils index of PortsMaster/PortMaster-New
filtered to arch aarch64. Starboard names no runtime of its own and that index
is republished with the catalogue, so the set belongs to PortMaster.
files:
- name: starboard-rootfs.tar.gz
aliases:
- rootfs.tar.gz
path: "rootfs.tar.gz"
required: true
category: game_data
storage: large_file
validation: [sha256]
size: 582086462
sha256: "a40dd11b24802325b37ab6454feb5fda84a6f1de9d769c84a2dd7b6fee8035e1"
description: "Debian bookworm ARM64 root filesystem the ports execute in"
note: >-
Fetched as the asset starboard-rootfs.tar.gz from releases/latest/download
of get-starboard/starboard-runtime, written to the cache directory as
rootfs.tar.gz, gunzipped into a rootfs
directory under internal storage, then deleted. Nothing launches without
it: the gate reads usr/bin/env and bin/sh in the extracted tree beside
libproot.so in the native library directory. Integrity comes from a
.sha256 sidecar requested next to the asset, whose first whitespace token
must be 64 hex characters; the file is hashed and dropped on a mismatch,
while a missing sidecar logs "No rootfs checksum sidecar available" and the
download is kept on TLS trust alone, which is what happens today since that
sidecar answers 404. The size and hash recorded here identify release
starboard-rootfs-20260604.1, the one that URL served at profiling time, and
the app follows whatever release is latest. Its own version is read back
from etc/starboard-release, which carries release, commit and built keys.
source_ref: "Starboard-release ze0.java:75,421-422 (base and asset URL), Starboard-release xe0.java:66-70 (download, verify, extract, delete), Starboard-release ze0.java:236-342 (sha256 sidecar and comparison), Starboard-release ze0.java:130-144 (gunzip into place), Starboard-release ze0.java:416-418 (install directory), Starboard-release ze0.java:426-428 and Starboard-release t20.java:125 (launch gate), Starboard-release ze0.java:439-463 (etc/starboard-release)"