The shared runner host keeps Gradle daemons alive for up to 3 hours
and hands them to the next matching build regardless of which
project started them. A daemon warmed by an unrelated checkout (even
a local devbox test build) can serve this project's CI run next,
carrying over stale in-memory classpath state and producing
inconsistent "package android.app does not exist" failures.
Disabling the daemon for this one step keeps dependency/wrapper
caches shared while avoiding the live-process contamination.
Flutter caches its JDK location in a per-user global config file
(~/.config/settings), not per-project. On a shared build host that
cross-contaminates between projects: whichever project last ran
without pinning inherits a stale jdk-dir pointing at another
project's (possibly already-gone) build directory, which breaks the
Gradle release build with "JAVA_HOME is set to an invalid directory".
Re-running flutter config --jdk-dir on every devbox shell init keeps
it correct for this project.
Adds a Forgejo Actions workflow that builds a release APK on tag push,
reading signing credentials from repo secrets with a debug-key fallback
for local builds, and publishes the APK plus fastlane changelog to a
Forgejo release.