Aller au contenu principal

Corriger l'obfuscation Google Play sous les 25 % dans les apps Capacitor

Passez le contrôle d'obfuscation de 25 % de Google Play dans une application Android Capacitor en activant R8, en réduisant les fichiers DEX inutilisés et en déployant un App Bundle de release.

Corriger l'obfuscation Google Play sous les 25 % dans les apps Capacitor

La Play Console signale désormais les applications Android Capacitor pour L'optimisation de l'app est inférieure à notre seuil, souvent avec l'obfuscation est restée 3%. Google exige au moins 25% l'obfuscation, l'optimisation et le shrinking. L'application des règles débutera en février 2027, et un échec peut réduire votre visibilité et vos options de publication.

L'avertissement ressemble à ceci dans les Android vitals :

Avertissement Android vitals dans la Google Play Console indiquant une obfuscation à 3 %, sous le seuil d'optimisation de 25 %, avec une date limite de correction en février 2027

Il s'agit d'un problème DEX Android natif. Cela ne concerne pas votre bundle Vue, React ou Angular. Capgo les live updates ne modifient pas non plus ce score. Vous devez le corriger dans le build de release Android Gradle, puis envoyer un nouvel App Bundle.

Ce que Google mesure

Google Play inspecte le DEX de votre Android App Bundle : Java et Kotlin compilés, incluant Capacitor, les plugins et AndroidX. Dès février 2027, les apps dépassant 10 Mo de DEX devront atteindre 25% sur ces trois points :

Indicateur Signification Cause typique d'un score faible avec Capacitor
Obfuscation Noms de classes, champs et méthodes renommés en noms courts minifyEnabled est toujours false
Optimisation R8 inlines, merges, and rewrites bytecode Par défaut proguard-android.txt inclut -dontoptimize
Shrinking Classes et méthodes inutilisées supprimées Le shrinking de Resource/code n'est jamais activé

Play lit r8.json lorsque vous compilez avec le dernier patch d'Android Gradle Plugin 8.10 ou supérieur. Sinon, il utilise mapping.txt, puis les heuristiques DEX. Une application Capacitor déployée avec la minification désactivée n'a presque pas de fichier de mapping, donc Play voit des noms lisibles et rapporte quelques pourcents d'obfuscation (souvent des restes de bibliothèques AAR déjà obfusquées). Cela correspond à un 3% score vitals.

Politique officielle : Exigences de qualité technique de la Play Console. Détail de l'implémentation : Optimisation DEX code et Activer l'optimisation de l'app avec R8.

Pourquoi les apps Capacitor échouent à ce contrôle

Le template Android Capacitor livre toujours des builds release sans R8 :

buildTypes {
    release {
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }
}

C'est la configuration par défaut dans android-template/app/build.gradleLes builds de debug doivent rester ainsi. Les builds de release ne le doivent pas si vous publiez sur le Play Store.

Votre JavaScript est déjà minifié par Vite ou webpack. Play ne prend pas cela en compte. Seuls les noms DEX natifs, les code natifs inutilisés et les optimisations R8 comptent.

Étape 1 — Activer R8 pour la release

Ouvrez android/app/build.gradle (Groovy est le Capacitor par défaut) et modifiez le release bloc :

buildTypes {
    release {
        minifyEnabled true
        shrinkResources true
        proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
    }
}

Si le module utilise Kotlin DSL (build.gradle.kts):

buildTypes {
    getByName("release") {
        isMinifyEnabled = true
        isShrinkResources = true
        proguardFiles(
            getDefaultProguardFile("proguard-android-optimize.txt"),
            "proguard-rules.pro"
        )
    }
}

Trois détails comptent :

  1. minifyEnabled true est ce qui exécute réellement R8 (shrink + obfuscate + optimize).
  2. shrinkResources true supprime les ressources Android inutilisées. Cela nécessite une minification.
  3. Pour cette configuration R8, utilisez proguard-android-optimize.txt. proguard-android.txt déploient -dontoptimize, ce qui bloque les optimisations R8 et fait échouer AGP 9. Play autorise n'importe quel shrinker ; les apps Capacitor devraient utiliser R8 avec les options d'optimisation par défaut. Voir Correction de l'erreur de build AGP 9 du plugin Capacitor si un plugin fait toujours référence à l'ancien fichier.

Ne définissez pas minifyEnabled true sur debug. Le mode Release-only garde les exécutions locales rapides et les stack traces lisibles.

Étape 2 — Ne désactivez pas le mode complet R8

Ouvrez android/gradle.properties et supprimez cette ligne si elle existe :

android.enableR8.fullMode=false

AGP 8+ active déjà le mode complet. Laisser ce flag en place limite l'optimisation.

Voir aussi android/app/proguard-rules.pro (et tout autre -include fichier) pour :

-dontobfuscate
-dontoptimize
-dontshrink
-keep class ** { *; }

Ces règles maintiendront vos scores Play bas, même après avoir activé minifyEnabled. Supprimez-les, sauf si vous avez une raison temporaire documentée.

Étape 3 — Conserver les plugins Capacitor, pas toute l'app

R8 utilise les métadonnées de réflexion. Les plugins Capacitor sont détectés via des annotations et ont donc besoin de règles keep. En général, vous ne les ajoutez pas vous-même. Depuis Capacitor 3.2.3, @capacitor/android déploient règles ProGuard consumer qui conservent :

  • @CapacitorPlugin les classes, @PluginMethod, les callbacks de permission et d'activité
  • Les classes qui étendent com.getcapacitor.Plugin
  • Ancien @NativePlugin et les classes de plugins Cordova

Restez sur une ligne Capacitor 6/7/8 à jour pour que ces règles consumer s'appliquent.

Ajoutez des règles supplémentaires dans android/app/proguard-rules.pro uniquement pour un crash reproductible dans un build de release. Mieux vaut cibler que généraliser :

# Good: one misbehaving plugin package
-keep class com.mycompany.myplugin.** { *; }

# Bad: this will tank obfuscation and shrinking
-keep class com.getcapacitor.** { *; }
-keep class ** { *; }

Si un plugin tiers plante encore après une règle keep ciblée, mettez à jour le plugin, puis envisagez une alternative maintenue dans le répertoire de plugins Capgo, ou demandez Conseil Capgo pour le patcher.

Notes officielles Capacitor : Utiliser ProGuard.

Étape 4 — Créer un bundle de release réel

Les APK de debug afficheront toujours ~0 % d'obfuscation. Play ne note que ce que vous uploadez.

Depuis la racine du projet :

npm run build
npx cap sync android
cd android
./gradlew bundleRelease

Sans un release signingConfig, ces tâches réussissent mais génèrent un .aabnon signé. Signez-le dans Android Studio avant l'upload sur Play.

Installer un APK de release sur un appareil (./gradlew assembleRelease, puis l'APK sous app/build/outputs/apk/release/). Un .aab est un format d'upload Play, pas quelque chose que l'on sideload. Testez les plugins natifs (camera, push, file, billing, auth). Les bugs R8 n'apparaissent pas dans npx cap run android sessions de debug.

Après les commandes Gradle ci-dessus (vous êtes dans android/), confirmez que R8 a bien été exécuté :

  • app/build/outputs/mapping/release/mapping.txt
  • app/build/outputs/mapping/release/configuration.txt
  • Sur le dernier patch d'AGP 8.10 ou supérieur, r8.json à l'intérieur de l'App Bundle

Ces release dossiers sont la variante Capacitor par défaut. Avec les product flavors, le mapping se trouve sous le nom de la variante (mapping/freeRelease/). L'APK se trouve sous apk/<flavor>/release/ (par exemple apk/free/release/).

Si mapping.txt est manquant, vous êtes dans le mauvais dossier de variante, la CI a assemblé debug, ou R8 a été exécuté avec -dontobfuscate. Recheck minifyEnabled true sur release et assurez-vous que les règles keep ne désactivent pas l'obfuscation.

Étape 5 — Garder les rapports de crash lisibles

Les stack traces obfusquées sont inutilisables sans le fichier mapping. Gardez mapping.txt pour chaque version Play :

  • Play Console : Test et version → Explorateur de bundles d'appli → Téléchargements → Assets, puis effectuez l'upload mapping.txt si ce n'est pas déjà fait.
  • Firebase Crashlytics / Sentry : envoyez le même mapping via votre CI.

Android Studio / AGP intègre souvent le mapping dans le .aab. Vérifiez tout de même l'onglet Assets après le premier upload optimisé.

Étape 6 — Upload et vérification Play

Envoyez le nouveau .aab sur un canal de test interne (la production n'est pas requise pour actualiser le score). Allez dans :

  1. Test et version → Explorateur de bundles d'application pour cette version
  2. Taille DEX plus pourcentages d'obfuscation / optimisation / réduction
  3. Surveiller et améliorer → Android vitals après que la nouvelle version est celle analysée par Play

Vous devez être 25 % sur chacun des trois métriques, pas seulement de l'obfuscation. Activer R8 avec proguard-android-optimize.txt fait généralement passer une application Capacitor d'une obfuscation inférieure à 10 % à bien plus de 25 % sur les trois.

Play n'impose que le seuil de 25 % quand le DEX dépasse 10 Mo pour les apps (50 Mo pour les jeux). Même en dessous de ce seuil, ça vaut le coup de corriger : DEX plus petit, moins de mémoire, démarrage plus rapide.

Si vous êtes encore sous les 25 %

R8 est activé, mais Play (ou l'analyseur local) affiche toujours un score faible. Les règles « keep » trop larges sont le plus souvent en cause.

  1. Ouvrez Analyseur de configuration R8 si votre Android Gradle Plugin est en version 9.3 ou plus récente — assembleRelease puis écrit configanalyzer.html à côté de mapping.txt. Sur AGP 9.2 et les versions antérieures, ignorez ce fichier HTML et utilisez mapping.txt, APK Analyzer et l'App bundle explorer de Play à la place.
  2. Triez les règles keep selon la part de l'app qu'elles figent. Les règles consumer des bibliothèques que vous ne pouvez pas modifier sont normales. Au niveau de l'app, -keep class com.foo.** { *; } ne l'est pas.
  3. Ouvrez le .aab dans l'APK Analyzer d'Android Studio, sélectionnez les gros .dex fichiers, et activez les noms déobfusqués (nécessite mapping.txt). Les packages qui restent énormes et lisibles sont ceux qu'il faut arrêter de conserver intégralement.
  4. Mettez à jour les plugins qui référencent encore proguard-android.txt. Ce fichier bloque l'optimisation sur AGP 9 et est un signal d'alerte dans les anciens plugins.

Ne « corrigez » pas un score faible en réduisant le DEX avec minifyEnabled false et espérer que les heuristiques changent. Play veut de la réduction, de l'optimisation, et l’obfuscation.

Ce que cela ne remplace pas

  • La minification JavaScript dans vite.config.ts ne fait pas bouger cette métrique.
  • les live updates Capgo déployez du HTML/JS/CSS. Ils ne reconstruisent pas le DEX. Une fois R8 activé dans le binaire du store, vous pouvez toujours envoyer des correctifs JS via Live Update. Le contrôle d'obfuscation nécessite lui-même un upload natif sur Play.
  • Taille de page de 16 Ko est une exigence native Play distincte. Voir Taille de page Android de 16 Ko.

Si vous compilez déjà pour Android avec Build Capgo, modifiez android/app/build.gradle dans le repo. Le prochain cloud build utilisera R8. Vous n'avez pas besoin d'un pipeline Play différent, seulement d'un binaire de release produit avec la minification activée. Même principe si vous utilisez GitHub Actions pour les builds Android: le workflow doit assembler une release, pas un debug.

FAQ

L'activation de R8 va-t-elle casser mes plugins Capacitor ?

C'est possible si un plugin utilise la réflexion sans fournir de règles de conservation (keep rules). Le cœur de Capacitor conserve déjà les classes des plugins. Testez un build de release. Ajoutez un restreindre appliquez la règle uniquement au package qui plante. Si le plugin n'est plus maintenu, Conseil Capgo vous pouvez le forker pour continuer à le compiler.

Émet npx cap run prouve que j'ai passé le contrôle ?

Non. Cette commande utilise un build de debug avec R8 désactivé. Utilisez bundleRelease / un upload Play signé.

Nous avons déjà configuré minifyEnabled true et nous voyons toujours 3 %. Pourquoi ?

Recherchez -dontobfuscate, proguard-android.txt, android.enableR8.fullMode=false, et une règle globale -keep règles. Confirmez que la CI a envoyé l'AAB minifié, et non un ancien artefact.

Avons-nous besoin de ProGuard à la place de R8 ?

Non. R8 est le shrinker de l'Android Gradle Plugin. Il lit les fichiers de règles de style ProGuard. La doc de Google Play autorise n'importe quel shrinker ; R8 est celui que les apps Capacitor devraient utiliser.

Checklist

  • release { minifyEnabled true; shrinkResources true }
  • proguard-android-optimize.txt (pas proguard-android.txt)
  • Non -dontobfuscate / -dontoptimize / app-wide -keep class **
  • Capacitor 3.2.3+ les règles de consumer du plugin s'appliquent
  • Le build de release produit mapping.txt
  • Plugins natifs testés sur une installation de release
  • Nouveau .aab envoyé ; mapping joint dans l'explorateur de bundle d'app
  • Obfuscation, optimisation et réduction de taille à moins de 25 %

That is the whole Play Console warning: Capacitor left R8 off, Play started scoring DEX, and a one-line release Gradle change plus a store upload is the fix.

Continuer depuis Fix Google Play Obfuscation Below 25% in Capacitor Apps

Si vous utilisez Corriger l'obfuscation Google Play sous les 25 % dans les apps Capacitor pour planifier vos releases sur le store Android, connectez-l’avec Capgo Native Build pour les App Bundles de release, CI/CD Capgo pour le pipeline d'upload, Intégration CI/CD pour les détails d'implémentation, Build Android Capacitor automatique avec les actions GitHub pour les pipelines auto-hébergés, et Conseil Capgo si un plugin casse après l'activation de R8.

Live updates pour les apps Capacitor

Lorsqu'un bug de la couche web est en ligne, déployez le correctif via Capgo au lieu d'attendre des jours l'approbation des stores. Les utilisateurs reçoivent la mise à jour en arrière-plan, tandis que les changements natifs suivent le circuit de validation habituel.

Les derniers articles du blog

Capgo vous offre les meilleures informations pour créer une application mobile vraiment professionnelle.