Native release polish: a usable routing client on Android, a served APK, and 1.0.0 #44
Labels
No labels
agent
agent:ci
agent:done
agent:failed
agent:needs-input
agent:refined
agent:refining
agent:running
agent:skip
autonomous
driven
local
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
jeroen/cartopolis#44
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Problem
Viberfox has never shipped an Android build, and the reason was invisible: CI ran
cargo fmt --checkas the first step of thecheckjob(
.forgejo/workflows/ci.yml), so an unformatted merge ended the job before theAndroid lane below it ran. Behind that sat a real compile break — the APK is
built
--no-default-features, which dropssolo, which makesSessionMode::SoloandSessionStatus::Startingunconstructed(
crates/viberfox/src/systems/net/session.rs:116,152);[workspace.lints.rust] unused = "deny"turns that into a hard error.deploy-android.ymlfailed onevery push to
mainandhttps://viberfox.garage44.eu/apk/has been a 404throughout.
Beyond the build, the phone was missing the things that make a routing client a
routing client, and the desktop carried several defects that make software feel
unreliable:
LocationWatch::available()wascfg!(target_arch = "wasm32")(crates/viberfox/src/platform/location.rs:60),so driver mode narrated the avatar — which on a phone cannot move, movement
being keyboard-only (
systems/player/avatar.rs:1223).bookmark rename, chat and the AI panel could be focused and not typed into.
user.jsonwas cwd-relative(
systems/net/user_store.rs:282) and a NativeActivity process starts at/,so every save failed and only warned.
Msaa::Sample2applied on Android (systems/player/free_camera.rs:560),where Vulkan's guaranteed minimum for
framebufferColorSampleCountsis1|4—the same class of failure the surrounding comment already documents twice.
phone residency where the globe path had already concluded 256².
display_position, which folds interrain_lift(systems/net/network.rs:901,systems/player/collision.rs:427), and Dutch relief is ~2 m against anAIRBORNE_EPSof 0.2. The avatar walked through every wall.bookmarks.panel_openlatch nothing ever cleared (systems/gui/hud.rs:755).while true do endat Luau top level hung the simulator forever and survivedrestart (
crates/simulator/src/scripting.rs:510) — apcallbody isnon-yieldable in Luau and mlua silently discards a yield it cannot honour, so
LOAD_FUELnever fired. The Linux build runs this simulator in-process.MoveTo, soa ~3 MB crafted body requests ~24 TB; three spatial-bucket builders swept
coordinate ranges near 2.1e9.
panic = "abort"makes each an immediate SIGABRT.collapsible panel — ODbL and CC BY 4.0 both require attribution a user can find.
Approach
One branch, landed as path-scoped commits:
crates/viberfox/src/platform/android.rs(new) — JNI-only Android services: alocation provider behind the existing
LocationWatchseam, keep-screen-on, andIntent.ACTION_VIEW. No Java, no dex:android:hasCode="false"is whatlets this app ship without Gradle, and every push-shaped location API needs a
Java type we cannot define, so updates are requested with a
PendingIntentandthe fix is read by polling
getLastKnownLocation.crates/viberfox/src/systems/gui/onscreen_keyboard.rs(new) — an egui QWERTYslab, since the phone has no other keyboard.
crates/viberfox/src/quality.rs— growBudgetwithmsaa,tile_px,atmosphere_luts,space_raymarch. Every existing escape hatch is an env var,and Android has neither an environment nor a query string, so phone decisions
must live in the budget or in UI.
crates/geo/src/— bound the tile body and walk the protobuf to compute whatmvt-reader will reserve before it sees anything; bbox-reject and clamp the
three bucket builders.
crates/simulator/src/— run the top-level chunk as a fuel-bounded thread,bound the per-connection inboxes, check room membership, reject non-finite
intents, take argon2 out from under the SQLite mutex.
systems/nav/,systems/gui/— navigation UX (reroute robustness, roadsnapping, audio turn cues, GPS quality, phone layout), destination entry from
search/bookmarks/POIs, a type and radius scale in
theme.rs, an About panel.LICENSE-MIT+LICENSE-APACHE(MIT OR Apache-2.0),CHANGELOG.md, 1.0.0, realversionCode/versionNamethroughaapt2 link, awindow background so cold start is not a black screen, an adaptive launcher
icon, Play Protect instructions on the install page.
Acceptance criteria
cargo check -p viberfox_android --target aarch64-linux-androidpassescargo check -p viberfox --no-default-featurespasses (the APK's config)cargo check -p viberfox --no-default-features --target wasm32-unknown-unknownpasses on nightlycargo fmt --checkpasses for all five crates, and is the last CI stepcargo testgreen forviberfox,viberfox_geo,viberfox_core,viberfox_simulator,big_spacedeploy-android.ymlsucceeds onmainandhttps://viberfox.garage44.eu/apk/serves an APK, its.sha256and an install page (curl-verified 200, not assumed)versionCode, stable signing cert)LICENSE-MITandLICENSE-APACHEat the root,licensein[workspace.package], both shipped in the tarball and the APKClientIntent, and the on-screen keyboard's event streamVerification
The Android check needs an NDK and the
aarch64-linux-androidtarget, and theagent container has neither by default —
/usr/local/rustupis root-owned, sothe target has to be added under a copied
RUSTUP_HOME.Two things cannot be verified anywhere in this container and must be done on
real hardware:
adb install, watchingadb logcat -s viberfox:V bevy_render:V wgpu:V: launch, map streams, rotate, home, resume, back. Nothing between "itcompiles" and "a person uses it" has ever been observed.
caused by our own
PendingIntentregistration land in the cache we poll.That is how AOSP's
LocationProviderManagerbehaves, but if it is wrong thesymptom is an arrow that never moves — and there is no third dex-free option,
only GameActivity and Gradle. The four device-dependent claims are written
into
run_location's doc comment.Anything touching camera, shaders, egui layout or lighting needs
cargo shotsona workstation; this container has no GPU.
Out of scope
on the phone becoming the thing that matters, or the location design failing on
hardware — not this ticket.
cues are chimes.
the difference between a routing demo and a trip planner, but each is its own
piece of work.
arm64-v8a; every phone worthtargeting is arm64 and a second ABI doubles a 28-minute link.
at
targetSdk34 and needs either a network-security config or the relay..deb/AppImage for Linux.desktop_integration.rsself-installs the.desktopentry, so the tarball needs no installer.Branch:
feat/44-native-release-polish