Application Android de suivi des rappels de produits — API officielle data.economie.gouv.fr — serveur local Python + WebView + SQLite
  • Python 48.5%
  • HTML 45.1%
  • Shell 6.4%
Find a file
2026-05-28 19:54:32 +02:00
.gitignore feat: build.sh — pipeline de build complet en une commande 2026-05-28 18:34:13 +02:00
app.py Initial commit — RappelConso APK v2026.0528.1 2026-05-28 15:47:50 +02:00
backup.py Initial commit — RappelConso APK v2026.0528.1 2026-05-28 15:47:50 +02:00
build.sh feat: build.sh (dev, cache Gradle) + build_full.sh (mise à jour) 2026-05-28 18:34:13 +02:00
build_full.sh feat: build.sh (dev, cache Gradle) + build_full.sh (mise à jour) 2026-05-28 18:34:13 +02:00
buildozer.spec release: v2026.0528.11 2026-05-28 19:52:05 +02:00
CHANGELOG.md release: v2026.0528.11 2026-05-28 19:54:32 +02:00
create_keystore.py release: v2026.0528.11 2026-05-28 19:52:05 +02:00
icon.png Initial commit — RappelConso APK v2026.0528.1 2026-05-28 15:47:50 +02:00
index.html Initial commit — RappelConso APK v2026.0528.1 2026-05-28 15:47:50 +02:00
main.py Initial commit — RappelConso APK v2026.0528.1 2026-05-28 15:47:50 +02:00
make_icon.py Initial commit — RappelConso APK v2026.0528.1 2026-05-28 15:47:50 +02:00
patch_icon.py Initial commit — RappelConso APK v2026.0528.1 2026-05-28 15:47:50 +02:00
patch_p4a.py Initial commit — RappelConso APK v2026.0528.1 2026-05-28 15:47:50 +02:00
post_build.py feat: post_build.py — pipeline post-build tout-en-un 2026-05-28 16:23:34 +02:00
README.md release: v2026.0528.9 2026-05-28 18:57:27 +02:00
release.py feat: release.py — git tag + Gitea release + upload APK 2026-05-28 16:21:57 +02:00
set_version.py release: v2026.0528.3 2026-05-28 16:30:51 +02:00
update_changelog.py Initial commit — RappelConso APK v2026.0528.1 2026-05-28 15:47:50 +02:00

📱 RappelConso APK

Application Android autonome de suivi des rappels de produits, basée sur l'API open data officielle du gouvernement français.


⚙️ Fonctionnement

  1. main.py démarre le serveur Python (app.py) en arrière-plan
  2. Une WebView Android native ouvre http://localhost:8765
  3. Le scraper récupère les rappels depuis data.economie.gouv.fr et les stocke en SQLite local
  4. Tout tourne sur le téléphone — aucun serveur externe requis
  5. Les données persistent entre les sessions

🖥️ Test desktop

python3 app.py

Ouvrir http://localhost:8765 dans le navigateur. Les logs s'affichent dans le terminal.


📦 Build APK

Deux scripts selon le contexte :

Script Usage
./build.sh Build normal — monte ~/.gradle en cache (plus rapide)
./build_full.sh Build propre sans cache Gradle — à utiliser si dépendances modifiées

Les deux enchaînent les 4 étapes : nettoyage → compilation → injection icône/signature → post-build.
Les logs Docker sont sauvegardés dans build.log.

⏱️ Premier build : ~30 min. Les suivants sont rapides grâce au cache ~/.buildozer.

🔧 Prérequis

  • Docker installé et démarré
  • Image Kivy buildozer : ghcr.io/kivy/buildozer:latest
  • ~/.buildozer/ — cache Android SDK/NDK (créé automatiquement au premier build)
  • ~/.android/debug.keystore — keystore debug (créé par Android Studio ou ADB)
  • gitea_token.txt — token API Gitea (voir section dédiée ci-dessous)

📁 Résultat du build

Trois fichiers créés dans bin/ :

Fichier Description
rappelconso-AAAA.MMJJ.N-...-debug.apk Sortie brute buildozer
rappelconso-AAAA.MMJJ.N-...-debug-final.apk APK à installer (icône + signé)
rappelconso-AAAA.MMJJ.N-...-debug-final.apk.idsig Signature v4

🔄 Post-build

Déclenché automatiquement par les scripts de build, ou manuellement :

python3 post_build.py

Enchaîne :

  1. update_changelog.py — diff sources vs snapshot .snapshot/, écrit dans CHANGELOG.md
  2. release.pygit add + git commit + git tag + git push + release Gitea + upload APK
  3. backup.py — archive tar.gz versionnée dans ~/Desktop/linux/backups/

📲 Installer sur le téléphone

# Désinstaller l'ancienne version (vide le cache Service Worker)
adb uninstall fr.local.rappelconso

# Installer la nouvelle version
adb install bin/rappelconso-$(grep '^version' buildozer.spec | cut -d= -f2 | tr -d ' ')-arm64-v8a_armeabi-v7a-debug-final.apk

Toujours désinstaller avant d'installer pour éviter les problèmes de cache.


🐍 Debug Android

# Logs de l'app en temps réel
adb logcat -s python

# Relancer sans réinstaller
adb shell am force-stop fr.local.rappelconso
adb shell am start -n fr.local.rappelconso/.PythonActivity

🔑 Token Gitea

Créer le fichier gitea_token.txt à la racine :

echo "TON_TOKEN" > gitea_token.txt

Générer un token : https://kolom.fr/user/settings/applications
→ Nom : rappelconso → Accès : Tout → Générer.

gitea_token.txt est dans .gitignore — ne sera jamais commité.


🗂️ Versionnage

set_version.py est appelé automatiquement dans le build. Il met à jour buildozer.spec :

  • Format : AAAA.MMJJ.N (ex: 2026.0528.1, 2026.0528.2…)
  • android.numeric_version = YYYYMMDD * 100 + N

🩹 Scripts de patch (appliqués automatiquement au build)

patch_p4a.py

Patche le bootstrap python-for-android avant compilation. Idempotent.

Patch Description
1 WebView fond sombre #121212 (anti-flash blanc au démarrage)
2 Suppression du presplash — fond sombre via DecorView
3 archs.py — alignement 16 Ko pour Android 15+
4 Android.mk — alignement 16 Ko pour libmain.so
5 strings.tmpl.xmlwindowBackground sombre dans le thème Android
6 onKeyDown simplifié — retour géré par BackKeyListener

patch_icon.py

Injecte dans l'APK les ressources finales et re-signe :

  • res/drawable/icon.png et res/mipmap/icon.png — icône rouge "!"
  • res/drawable/presplash.jpg — fond uni #121212
  • assets/_load.html et assets/_loading_style.css — écran de chargement animé

📄 Fichiers à créer manuellement (non versionnés)

Fichier Créé par Description
gitea_token.txt Manuel (echo "TOKEN" > gitea_token.txt) Token API Gitea pour les releases
rappelconso-release.keystore python3 create_keystore.py Keystore de signature release (une seule fois)

📚 Structure des fichiers

rappelconso-apk/
├── main.py              Entry point Android (WebView) / desktop (navigateur)
├── app.py               Serveur HTTP + scraper + API REST
├── index.html           Interface web dark mode
├── icon.png             Icône source (512×512 PNG)
├── buildozer.spec       Configuration du build APK
│
├── build.sh             Build avec cache Gradle (usage courant)
├── build_full.sh        Build sans cache Gradle (mise à jour dépendances)
│
├── set_version.py       Versionnage automatique AAAA.MMJJ.N
├── patch_p4a.py         Patch du bootstrap python-for-android
├── patch_icon.py        Injection icône + re-signature APK
├── make_icon.py         Génération de icon.png
│
├── post_build.py        Post-build tout-en-un (changelog + release + backup)
├── update_changelog.py  Mise à jour automatique de CHANGELOG.md
├── release.py           Publication release Gitea (git tag + push + upload APK)
├── backup.py            Sauvegarde tar.gz versionnée dans ~/Desktop/linux/backups/
├── create_keystore.py   Création du keystore de release (une seule fois)
│
├── gitea_token.txt      Token API Gitea (non commité — à créer manuellement)
├── CHANGELOG.md         Historique des modifications par version
├── bin/                 APKs générés
├── .snapshot/           Snapshots des sources (référence du dernier build)
└── .buildozer/          Cache SDK/NDK Android (régénérable)

⚙️ Configuration

app.py

PORT             = 8765   # Port du serveur local
REFRESH_INTERVAL = 3600   # Intervalle de sync (secondes)

settings.json (généré sur l'appareil au premier lancement)

{
  "auto_refresh": true,
  "refresh_interval": 60
}

refresh_interval en minutes. Valeurs acceptées : 30, 60, 180, 360, 720, 1440.


📡 Source des données

  • Dataset : RappelConso V2
  • Licence : Licence Ouverte Etalab
  • API : data.economie.gouv.fr