No description
  • Kotlin 87.3%
  • Makefile 6.9%
  • Dockerfile 5.8%
Find a file
Sebastian Fischer 8c4e860208
Some checks failed
CI / build (push) Failing after 0s
build: silence library-constraints sync advisory
assembleRelease/Debug logged a 4x advisory nagging to enable
android.dependency.excludeLibraryComponentsFromConstraints (a perf tweak only
relevant for very large projects). Suppress it via
android.generateSyncIssueWhenLibraryConstraintsAreEnabled=false, which removes
the warning without changing dependency resolution.

The remaining warnings (builtInKotlin/newDsl deprecation, obsolete
applicationVariants/testVariants APIs) are the documented kotlin-android +
KSP/Room workaround and cannot be removed until KSP supports AGP's built-in
Kotlin.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-25 21:46:32 +02:00
.github/workflows ci: add GitHub Actions workflow 2026-06-25 20:14:34 +02:00
app fix: persist shared link before finishing the share activity 2026-06-25 21:15:59 +02:00
docker build: run Docker build as host user, persist caches on bind mount 2026-06-25 21:12:59 +02:00
docs/superpowers docs: document YouTube Music share-link limitations 2026-06-24 20:59:53 +02:00
gradle/wrapper chore: upgrade to AGP 9.2.1 / Gradle 9.4.1 / Kotlin 2.2.10 2026-06-24 21:20:29 +02:00
.dockerignore build: run Docker build as host user, persist caches on bind mount 2026-06-25 21:12:59 +02:00
.gitignore build: run Docker build as host user, persist caches on bind mount 2026-06-25 21:12:59 +02:00
build.gradle.kts chore: upgrade to AGP 9.2.1 / Gradle 9.4.1 / Kotlin 2.2.10 2026-06-24 21:20:29 +02:00
compose.yml build: run Docker build as host user, persist caches on bind mount 2026-06-25 21:12:59 +02:00
gradle.properties build: silence library-constraints sync advisory 2026-06-25 21:46:32 +02:00
gradlew chore: upgrade to AGP 9.2.1 / Gradle 9.4.1 / Kotlin 2.2.10 2026-06-24 21:20:29 +02:00
gradlew.bat chore: upgrade to AGP 9.2.1 / Gradle 9.4.1 / Kotlin 2.2.10 2026-06-24 21:20:29 +02:00
Makefile build: run Docker build as host user, persist caches on bind mount 2026-06-25 21:12:59 +02:00
README.md docs: clean up APK build/install/uninstall instructions 2026-06-25 21:25:19 +02:00
settings.gradle.kts chore: scaffold Android project (Compose + Room toolchain) 2026-06-24 20:13:35 +02:00

Share Catcher

Android-App, die sich in den Teilen-Dialog (z. B. von YouTube Music) einklinkt, geteilte Links lokal speichert und sie in einer zeitlich absteigenden Liste anzeigt. Ein Tippen öffnet den Link erneut (z. B. um einen Song an der zuletzt geteilten Position fortzusetzen).

Voraussetzungen

Es wird kein lokales JDK/SDK benötigt — der komplette Build läuft in einem Docker-Container. Nötig ist nur:

  • Docker (inkl. docker compose)
  • make (optional, vereinfacht die Aufrufe)

Beim ersten Lauf lädt das Image JDK 21 + Android-SDK; der erste Build zieht zusätzlich die Gradle-Distribution und alle Dependencies (danach im Cache).

Build & Test

make image     # Docker-Image einmalig bauen
make test      # Unit-/Robolectric-Tests
make apk       # Debug-APK
make check     # Tests + Lint
make lint      # nur Lint
make clean     # Build-Outputs löschen
make tasks     # alle Gradle-Tasks auflisten
make shell     # interaktive Shell im Container

Beliebiger Gradle-Task:

make gradle ARGS="dependencies --configuration debugRuntimeClasspath"

Alle Targets laufen über die containerisierte Gradle aus compose.yml. make ohne Argument zeigt die Übersicht.

Release-APK (signiert)

Die Release-Signierung wird vollständig über Umgebungsvariablen gesteuert — Keystore und Passwörter landen niemals im Repository (durch .gitignore ausgeschlossen). Fehlt der Keystore, bleibt der Release-Build automatisch unsigniert statt zu scheitern.

1. Keystore einmalig erzeugen

make keystore

Startet keytool interaktiv im Container und legt docker/share-catcher.keystore an (du wirst nach Store-/Key-Passwort und Zertifikatsdaten gefragt).

2. Signierte APK bauen

make release KEY_ALIAS=share-catcher \
  KEYSTORE_PASSWORD=<store-passwort> \
  KEY_PASSWORD=<key-passwort>

Die Variablen können auch davor gesetzt werden (KEYSTORE_PASSWORD=… make release) — beide Schreibweisen funktionieren.

Ergebnis: app/build/outputs/apk/release/app-release.apk

Variable Bedeutung Standard
KEYSTORE_FILE Pfad zum Keystore im Container /workspace/docker/share-catcher.keystore
KEYSTORE_PASSWORD Passwort des Keystores — (Pflicht)
KEY_ALIAS Alias des Schlüssels — (Pflicht)
KEY_PASSWORD Passwort des Schlüssels — (Pflicht)

Hinweis: Die Warnung Unable to strip … libandroidx.graphics.path.so beim Release-Build ist unkritisch — dem Image fehlen die NDK-Strip-Tools, die Bibliothek wird ungestrippt mitverpackt.

Installation auf einem Gerät

Die gebauten APKs liegen je nach Variante unter:

  • Debug: app/build/outputs/apk/debug/app-debug.apk
  • Release: app/build/outputs/apk/release/app-release.apk

Das Aufspielen läuft über adb aus den Android-SDK platform-tools (nicht im Container — das ist lokales Werkzeug). Liegt adb nicht im PATH, mit vollem Pfad aufrufen, z. B. ~/Android/Sdk/platform-tools/adb.

# Installieren bzw. aktualisieren (-r = vorhandene Installation überschreiben)
adb install -r app/build/outputs/apk/release/app-release.apk

# Deinstallieren (löscht auch die App-Daten, also die gespeicherten Links)
adb uninstall im.fischer.sharecatcher

Hinweis: Debug- und Release-APK sind unterschiedlich signiert. Ist bereits die jeweils andere Variante installiert, schlägt install mit INSTALL_FAILED_UPDATE_INCOMPATIBLE fehl — dann zuerst adb uninstall, dann neu installieren.