# Règles R8/ProGuard — HormoneTrack # Build release : isMinifyEnabled + isShrinkResources actifs (v1.2.5). # ⚠️ R8 en full mode (AGP 9) est agressif : TOUT usage de réflexion doit être # couvert explicitement, sinon crash à l'exécution uniquement en release. # --- Gson (backup JSON + calibration) --- # Gson lit/écrit les champs par réflexion (noms de champs) : sans ces règles, # l'export/import JSON produirait des objets vides ou planterait EN RELEASE SEULE. -keepattributes Signature, InnerClasses, EnclosingMethod, *Annotation* -keep class com.hormonetrack.data.model.** { ; } -keep class com.hormonetrack.data.backup.BackupData { ; } -keep class com.hormonetrack.data.backup.UserSettings { ; } -keep class com.hormonetrack.pk.TConfig { ; } # Énumérations : converties en String par Room et Gson (par nom) -keepclassmembers enum com.hormonetrack.data.model.** { *; } # --- Moteur PK : « Tracé labs » (v1.6.0, bug #64 — trouvé en émulateur) --- # Symptôme : en RELEASE SEULE, la courbe « Tracé labs » restait vide (ni # dessinée ni légendée) alors que le même calcul fonctionne en debug et # donne 276 points sur les mêmes données (régression web-miroir). Cause # Prouvée au mapping R8 : `LabTrajectoryModel -> R8$$REMOVED$$CLASS$$...` — # R8 full mode a SUPPRIMÉ la classe en inlinant computeLabAnchoredCurve # (et son synthétique $default des paramètres par défaut) dans le call # site du producer Compose ; le résultat n'y était plus correct. FIX : # garder la classe ENTIÈRE — c'est le cœur scientifique de l'app (fonctions # pures, zéro réflexion) : coût = quelques Ko de dex non compactés. # ⚠️ Toute nouvelle fonctionnalité du pk/ qui « ne marche qu'en debug » : # vérifier le mapping (`app/build/outputs/mapping/release/mapping.txt`) # et étendre cette garde si besoin. -keep class com.hormonetrack.pk.LabTrajectoryModel { *; } # --- Auto-backup (v1.7.0) : worker instancié par WorkManager via réflexion --- # Les règles consumer de WorkManager gardent normalement les sous-classes de # ListenableWorker, mais le leçon #64 a montré le coût d'une garde absente : # on l'écrit explicitement (coût = quelques entrées de classe). -keep class com.hormonetrack.data.backup.AutoBackupWorker { *; }