- Python 48.5%
- HTML 45.1%
- Shell 6.4%
| .gitignore | ||
| app.py | ||
| backup.py | ||
| build.sh | ||
| build_full.sh | ||
| buildozer.spec | ||
| CHANGELOG.md | ||
| create_keystore.py | ||
| icon.png | ||
| index.html | ||
| main.py | ||
| make_icon.py | ||
| patch_icon.py | ||
| patch_p4a.py | ||
| post_build.py | ||
| README.md | ||
| release.py | ||
| set_version.py | ||
| update_changelog.py | ||
📱 RappelConso APK
Application Android autonome de suivi des rappels de produits, basée sur l'API open data officielle du gouvernement français.
⚙️ Fonctionnement
main.pydémarre le serveur Python (app.py) en arrière-plan- Une WebView Android native ouvre
http://localhost:8765 - Le scraper récupère les rappels depuis
data.economie.gouv.fret les stocke en SQLite local - Tout tourne sur le téléphone — aucun serveur externe requis
- 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 :
update_changelog.py— diff sources vs snapshot.snapshot/, écrit dansCHANGELOG.mdrelease.py—git add+git commit+git tag+git push+ release Gitea + upload APKbackup.py— archivetar.gzversionné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.txtest 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.xml — windowBackground 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.pngetres/mipmap/icon.png— icône rouge "!"res/drawable/presplash.jpg— fond uni#121212assets/_load.htmletassets/_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