Christoph 455b68e562 feat(android-release): derive Android version code from release tag
The release workflow now derives versionName and versionCode from the tag
and validates the tag format. It updates multiple project files in the
runner workspace without committing changes back to the repository.
A verification step ensures the generated Android properties are correct.

- Tag parsing validates vMAJOR.MINOR.PATCH and enforces minor/patch <= 999
- VersionCode computed as major*1e6 + minor*1e3 + patch and applied
- Added post-build verification of Android versionName and versionCode
2026-08-26 00:54:20 +02:00

WallpaperFlow

WallpaperFlow ist eine freie Tauri-2-App für Android, die aus einer frei wählbaren Bildsammlung in einem einstellbaren Zeitintervall ein neues Sperrbildschirmbild setzt.

Was bereits umgesetzt ist

  • Mehrfachauswahl über den Android-Systemdialog
  • kein festes Bilderlimit; Originale werden in den privaten App-Speicher kopiert
  • Wechsel nur für den Sperrbildschirm oder für das allgemeine Hintergrundbild
  • zufällige oder fortlaufende Reihenfolge
  • manueller Wechsel über „Nächstes Motiv“
  • automatischer Wechsel alle 5, 15 oder 30 Minuten beziehungsweise alle 1, 3, 6 oder 12 Stunden
  • optionaler Wechsel bei jedem Einschalten des Displays
  • erneute Planung des automatischen Wechsels nach einem Geräte-Neustart
  • lokale Vorschaubilder; die Originalbilder verlassen das Gerät nicht
  • optionaler Import aus einem selbst gehosteten Immich-Server über einen eingeschränkten API-Key
  • vollständig lokale Oberfläche in Deutsch, Englisch, Französisch, Spanisch, Italienisch, Niederländisch, Polnisch, Portugiesisch, Japanisch, Koreanisch und vereinfachtem Chinesisch

Der automatische Wechsel verwendet einen ungenauen Android-Alarm und respektiert Doze sowie den Energiesparmodus. Dadurch gibt es keinen dauerhaft laufenden Dienst und keine permanente Benachrichtigung; Wechsel können im Ruhezustand etwas später erfolgen. Automatische Immich-Downloads erfolgen nur über eine nicht getaktete Verbindung und bei ausreichendem Akkustand.

Der optionale Modus „Beim Einschalten des Displays“ benötigt dagegen einen kleinen Foreground Service mit permanenter Benachrichtigung, damit Android die Display-Ereignisse zuverlässig zustellt. Das nächste Bild wird bereits beim Ausschalten gesetzt und ist dadurch beim folgenden Einschalten ohne sichtbare Verzögerung vorhanden. Der Dienst hält keinen CPU-Wake-Lock.

Entwicklung

npm install
npm run dev
npm run build
cargo check --manifest-path src-tauri/Cargo.toml

Android-Projekt erzeugen und bauen

Benötigt werden Android Studio/SDK, NDK 28 oder neuer, JDK 17+ und die Rust-Android-Targets.

rustup target add aarch64-linux-android armv7-linux-androideabi i686-linux-android x86_64-linux-android
npm run tauri android init
npm run tauri android build -- --apk

Für ein angeschlossenes Gerät:

npm run tauri android dev

Der native Android-Code liegt als lokales Tauri-Plugin in plugins/android. Er wird beim Android-Build automatisch eingebunden.

Signierte Android-Releases mit Gitea Actions

Der Workflow .gitea/workflows/android-release.yml baut bei Tags wie v1.2.3 eine signierte Universal-APK. Der Tag ist dabei die Quelle für alle Versionsnummern im Build. Die Pipeline setzt vorübergehend die Versionen in package.json, package-lock.json, src-tauri/tauri.conf.json, src-tauri/Cargo.toml, src-tauri/Cargo.lock und .fdroid.yml. Diese Änderungen gelten nur im Arbeitsverzeichnis des Runners und werden nicht zurück ins Repository geschrieben.

Aus v1.2.3 erzeugt Tauri den Android-versionCode 1002003 nach dem Schema major * 1000000 + minor * 1000 + patch. Der Workflow kann außerdem manuell über die Actions-Oberfläche gestartet werden, wenn dabei ein Versions-Tag als Ref ausgewählt wird.

In den Repository-Einstellungen unter Settings → Actions → Secrets müssen folgende Secrets angelegt werden:

  • ANDROID_KEYSTORE_BASE64: der Base64-kodierte Inhalt des Release-Keystores
  • ANDROID_KEYSTORE_PASSWORD: Passwort des Keystores
  • ANDROID_KEY_ALIAS: Alias des Signaturschlüssels
  • ANDROID_KEY_PASSWORD: Passwort des Signaturschlüssels

Den Keystore-Inhalt für das Secret erzeugt man unter Linux mit:

base64 -w 0 /sicherer/pfad/wallpaperflow-release.jks

Nach erfolgreichem Lauf erstellt die Pipeline ein Gitea-Release für den Tag beziehungsweise verwendet ein bereits vorhandenes Release. Die Dateien WallpaperFlow-release.apk und WallpaperFlow-release.apk.sha256 werden direkt an dieses Release angehängt. Bei einem erneuten Lauf für denselben Tag werden vorhandene Anhänge mit diesen Namen ersetzt. Dafür muss der integrierte GITEA_TOKEN Schreibzugriff auf Releases besitzen; die Pipeline fordert die Berechtigung releases: write selbst an.

Der Keystore darf nicht in das Repository eingecheckt werden und muss dauerhaft gesichert bleiben, da spätere Updates mit demselben Schlüssel signiert werden müssen.

Voraussetzung ist ein aktiver Gitea-Actions-Runner mit dem Label ubuntu-latest, Netzwerkzugriff auf npm, Rust und die Android-SDK-Server sowie ausreichend Speicher für Android SDK, NDK und Rust-Buildartefakte.

Wichtige Android-Hinweise

  • Android darf ungenaue Alarme im Ruhemodus verzögern. Der nächste Wechsel wird ausgeführt, sobald das Gerät wieder aktiv ist.
  • WallpaperManager.FLAG_LOCK ist ab Android 7 verfügbar. Auf älteren Geräten setzt die App das allgemeine Hintergrundbild.
  • Hersteller können Hintergrundarbeit zusätzlich verzögern. Eine Ausnahme von der Akku-Optimierung ist für den normalen Betrieb nicht vorgesehen.
  • „Ohne Limit“ bedeutet: kein App-Zähler wie Samsungs 15-Bilder-Grenze. Praktisch begrenzen freier Gerätespeicher und Dateisystem die Sammlung.

Datenschutz

WallpaperFlow verarbeitet importierte Bilder lokal auf dem Gerät. Die optionale Immich-Anbindung kommuniziert ausschließlich mit dem vom Nutzer eingetragenen, selbst gehosteten Server und lädt nur ausdrücklich ausgewählte Bilder herunter. Die App enthält keine Werbung, kein Tracking und keine Analysedienste. Bilder werden nicht hochgeladen oder an andere Server weitergegeben.

Weitere Einzelheiten stehen in der Datenschutzerklärung.

Veröffentlichungen

Für ein Gitea-Release genügt ein neuer, höherer Versions-Tag wie v0.1.1; die Pipeline übernimmt daraus alle Versionen für den Build. Für dauerhaft im Repository gepflegte Versionsstände und F-Droid-Releases sollten die Versionen in package.json, src-tauri/tauri.conf.json, src-tauri/Cargo.toml und .fdroid.yml zusätzlich im Quellcode aktualisiert werden.

Die Metadaten für F-Droid liegen unter fastlane/metadata/android. Das Buildrezept für F-Droid befindet sich in .fdroid.yml.

Lizenz

Copyright (C) 2026 Christoph

WallpaperFlow ist freie Software und steht unter der GNU General Public License Version 3.0 (GPL-3.0-only). Die vollständigen Lizenzbedingungen stehen in LICENSE.

S
Description
No description provided
Readme GPL-3.0
13 MiB
v0.1.0
Latest
2026-08-25 22:14:56 +00:00
Languages
TypeScript 47.5%
Kotlin 31.8%
Rust 10.3%
CSS 10.2%
HTML 0.2%