Sauter au contenu principal

Fixer l'obfuscation Google Play en dessous de 25% dans les applications Capacitor

Passer la vérification d'obfuscation de 25% de Google Play dans une application Android Capacitor en activant R8, en réduisant les DEX non utilisés et en expédiant un bundle de l'application de version de production.

Crédits de l'article

Martin Donadieu

Auteur

Valeria

Réviseur

Jordan

Éditeur

Fixer l'obfuscation Google Play en dessous de 25% dans les applications Capacitor

Le Console Google Play signale maintenant les applications Android Capacitor App optimization is below our threshold, souvent avec Obfuscation est resté en place 3%. Google souhaite au moins 25% l'obfuscation, l'optimisation et la réduction. Février 2027et, en cas d'échec, cela peut réduire la visibilité et les options de publication.

La mise en garde ressemble à ceci dans Android vitals :

Google Play Console Android vitals affiche une alerte de 3 pour cent d'obfuscation, inférieure au seuil d'optimisation d'applications de 25 pour cent, avec une date de correction de février 2027.

C'est un problème lié à la compilation native Android DEX. Il ne s'agit pas de votre bundle Vue, React ou Angular. Capgo Mises à jour en temps réel ne modifient pas ce score. Vous devez le corriger dans la configuration de build Gradle Android, puis publiez une nouvelle version de l'App Bundle.

Ce que Google mesure

Google Play inspecte le DEX dans votre bundle d'application Android : Java et Kotlin compilés, y compris Capacitor, plugins et AndroidX. À partir de février 2027, les applications avec plus de 10 Mo de DEX doit atteindre 25% de DEX doivent atteindre

Metric Qu'est-ce que cela signifie Typical Capacitor cause of a low score
Obfuscation Les noms de classe, de champ et de méthode renommés en noms courts minifyEnabled est toujours false
Optimisation R8 inline, fusionne et réécrit le bytecode Par défaut proguard-android.txt inclut -dontoptimize
Réduction Classes et méthodes inutilisées supprimées La ressource/code n'a jamais été réduite en taille.

Play lit r8.json lorsque vous construisez avec la dernière mise à jour du plugin Android Gradle 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 a presque aucun fichier de cartographie, donc Play voit des noms lisibles et signale une obfuscation de quelques pourcents (souvent laissée par des bibliothèques AAR déjà obfusquées). Cela correspond à 3% un score de vital

Politique officielle : Exigences de qualité technique du Console Google Play. Détail d'implémentation: Optimisation de DEX code et activez l'optimisation d'application avec R8.

Why Capacitor apps fail this check

L'exemple de template Android Capacitor embarque toujours des builds de production sans R8:

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

C'est la valeur par défaut dans android-template/app/build.gradleDebuggage des builds doit rester ainsi. Les builds de production ne doivent pas l'être, si vous publiez sur Play.

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

Étape 1 — Activez R8 pour la version de production

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

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 sont importants :

  1. minifyEnabled true ce qui exécute effectivement R8 (réduction + flou + optimisation).
  2. shrinkResources true supprime les ressources Android inutilisées. Il nécessite une minification.
  3. Pour cette configuration R8, utilisez proguard-android-optimize.txt. proguard-android.txt expédiez -dontoptimizeLes applications Capacitor devraient utiliser R8 avec les paramètres par défaut d'optimisation. Capacitor Plugin AGP 9 Erreur de Construction Fixe si un plugin se réfère toujours au fichier ancien.

Ne définissez pas minifyEnabled true sur debugMaintenez les exécutions locales en local pour une vitesse et des traces d'erreurs lisibles.

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

Open android/gradle.properties en supprimant cette ligne si elle existe :

android.enableR8.fullMode=false

AGP 8+ active déjà la mode complète. Laisser ce flag en place limite l'optimisation.

Recherche également android/app/proguard-rules.pro Recherchez également (et tout supplémentaire -include fichiers) pour :

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

Ceux-ci garderont les scores de Play bas même après avoir inversé minifyEnabledSupprimez-les à moins que vous n'ayez une raison documentée et temporaire.

Étape 3 — Gardez les Capacitor plugins, pas l'application entière

R8 utilise des métadonnées de réflexion. Les plugins Capacitor sont découverts par des annotations, ils nécessitent donc des règles de conservation. Vous n'ajoutez généralement pas vous-même. Depuis Capacitor 3.2.3, @capacitor/android ships règles de ProGuard pour les consommateurs ce qui reste :

  • @CapacitorPlugin qui gardent : @PluginMethodclasses, permis et appels de callback d'activité
  • Classes qui étendent com.getcapacitor.Plugin
  • Legacy @NativePlugin et classes de plugins Cordova

Restez sur une ligne actuelle Capacitor 6/7/8 afin que les règles de consommateur soient appliquées.

Ajoutez des règles supplémentaires dans android/app/proguard-rules.pro seulement Pour un crash que vous pouvez reproduire dans une version de production.

# 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 continue à planter après une règle de maintien ciblée, mettez à jour le plugin, puis envisagez une alternative maintenue. Capgo répertoire des plugins, ou demandez à Consultation Capgo de le corriger.

Notes officielles Capacitor : Utilisation de ProGuard.

Étape 4 — Créez un bundle de mise en production réel

APKs de débogage afficheront toujours ~0% d'obfuscation. Play ne note que ce que vous téléchargez.

À partir de la racine du projet :

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

Sans une release signingConfig, ces tâches réussissent toujours mais émettent un fichier non signé .aabSignez-le dans Android Studio avant l'upload sur Play.

Installer un sur un appareil ( sur un appareil ("./gradlew assembleRelease, puis l'APK sous app/build/outputs/apk/release/. An .aab C'est un format de téléchargement Play, pas quelque chose que vous chargez localement. Exercer les plugins natifs (caméra, push, fichier, facturation, authentification). Les bugs R8 ne s'affichent pas dans npx cap run android sessions de débogage.

), confirmez que R8 a bien fonctionné : android/), confirmez que R8 s'est effectivement exécuté :

  • app/build/outputs/mapping/release/mapping.txt
  • app/build/outputs/mapping/release/configuration.txt
  • Sur la dernière mise à jour de AGP 8.10 ou supérieure, r8.json dans l'App Bundle

Those release Les dossiers sont la variante par défaut Capacitor. Avec les saveurs de produit, la correspondance se trouve sous le nom de la variante.mapping/freeRelease/L'APK est sous apk/<flavor>/release/ par exemple apk/free/release/).

If mapping.txt is manquant, vous êtes dans le dossier de variante incorrect, CI assemblé debugou R8 a été exécuté avec -dontobfuscate. Recheck minifyEnabled true sur release et que les règles de maintien ne désactivent pas l'obfuscation.

Étape 5 — Gardez les rapports de crash lisibles

Les traces de pile obfusquées sont inutiles sans le fichier de cartographie. Gardez mapping.txt pour chaque version de Play :

  • pour chaque version Play : Test et lancement → Explorateur de bundle d'application → Téléchargements → Actifs, puis téléchargez. mapping.txt si elle n'est pas déjà attachée.
  • Firebase Crashlytics / Sentry : téléchargez la même carte en tant que partie de CI.

Android Studio / AGP inclut souvent la carte dans le .aab. Vérifiez toujours la case "Assets" après la première mise à jour optimisée.

Étape 6 — Téléchargez et réexaminez Play

Téléchargez le nouveau .aab à un track de test interne (la production n'est pas requise pour rafraîchir le score). Ouvrir :

  1. Test et publication → Explorateur de bundle d'application pour cette version
  2. Taille du fichier DEX plus pourcentage d'obfuscation / d'optimisation / de réduction.
  3. Surveillez et améliorez → Vitals Android après la nouvelle version c'est celle que Play analyse

Vous devez 25% sur chacune des trois indicateurs, ce n'est pas seulement l'obfuscation. L'activation de R8 avec proguard-android-optimize.txt généralement, un Capacitor app saute d'une obfuscation à un chiffre à plus de 25% dans tous les cas.

Play only oblige the 25% floor when DEX is over 10 MB for apps (50 MB for games). Even below that floor, fixing it is still worth doing: smaller DEX, less memory, faster startup.

Si vous êtes toujours sous 25%

R8 est activé, mais Play (ou l'analyseur local) affiche toujours un score faible. Les règles de maintien large sont les résidus habituels.

  1. Open Analyseur de configuration R8 si votre plugin Gradle Android est 9.3 ou ultérieur — assembleRelease écrit ensuite configanalyzer.html à côté de mapping.txt. Sur AGP 9.2 et versions antérieures, ignorez ce fichier HTML et utilisez mapping.txt, l'analyseur APK, et l'explorateur de bundles d'applications Play à la place.
  2. Sort keep rules by how much of the app they freeze. Library consumer rules you cannot edit are normal. App-level -keep class com.foo.** { *; } Ouvrez le
  3. Ouvrez .aab fichiers, et activez/désactivez les noms déobfusqués (nécessite .dex fichiers, et basculer les noms déobfusqués (besoin) mapping.txtLes packages qui restent volumineux et lisibles sont ceux à arrêter de conserver entièrement.
  4. Mettez à jour les plugins qui référencent toujours proguard-android.txtCet fichier bloque l'optimisation sur AGP 9 et constitue un signal d'alerte dans les anciens plugins.

Ne pas "corriger" un score bas en réduisant le DEX avec minifyEnabled false et espère que les heuristiques changent. Play veut réduire, optimiser, et l'obfuscation.

Ce que cela ne remplace pas

  • La minification du JavaScript en vite.config.ts ce qui ne déplace pas ce métrique.
  • Capgo mises à jour en direct envoyer HTML/JS/CSS. Ils ne reconstruisent pas DEX. Après R8 est activé dans le binaire de magasin, vous pouvez toujours envoyer des correctifs JS en ligne. La vérification d'obfuscation elle-même nécessite une mise à niveau native Play.
  • 16 KB de taille de page est un exigence native Play distincte. Voir La taille de page Android 16 KB.

Si vous avez déjà construit Android avec Capgo Buildchangements android/app/build.gradle dans le dépôt. La prochaine construction cloud récupère R8. Vous n'avez pas besoin d'une pipeline Play différente, seulement un binaire de sortie produit avec la minification activée. Même idée si vous maintenez GitHub Actions Android builds : le workflow doit assembler releasepas de débogage.

FAQ

Permettra-t-il d'activer R8 de casser mes Capacitor plugins ?

Cela peut arriver si un plugin utilise la réflexion et n'expédie pas de règles de conservation de consommateur. Le noyau Capacitor conserve déjà les classes de plugin. Testez une construction de sortie. Ajoutez un narrow garder la règle que seulement pour le paquet qui s'effondre. Si le plugin n'est pas maintenu, Capgo Conseil peut prendre en charge et le garder en construction.

Est-ce que npx cap run prouve que j'ai passé la vérification ?

No. That command uses a debug build with R8 off. Use bundleRelease / une mise en ligne signée de Play.

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

Recherchez pour -dontobfuscate, proguard-android.txt, android.enableR8.fullMode=false, et les règles de masse. -keep Confirmez que CI a téléchargé le minifié AAB, et non un artefact ancien.

Faut-il ProGuard au lieu de R8 ?

Non. R8 est le compresseur du plugin Gradle Android. Il lit les fichiers de règles ProGuard. Les documents de Google Play autorisent n'importe quel compresseur ; R8 est celui que les applications 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 s'appliquent au consommateur du plugin
  • La mise en production produit mapping.txt
  • Plugins natifs testés sur une installation de production
  • Nouveau .aab uploaded; mapping attached in App bundle explorer
  • L'obfuscation, l'optimisation et la compression chacun à 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.

Continuez à partir de Fixer l'obfuscation Google Play en dessous de 25% dans les applications Capacitor

Si vous utilisez Fixer l'obfuscation Google Play en dessous de 25% dans les applications Capacitor pour planifier les lancements de magasin Android, connectez-l’avec Capgo Builds natifs pour les lots de lancement d'applications Capgo CI/CD pour la pipeline d'upload, Intégration CI/CD pour les détails d'implémentation Automatic Capacitor Android build with GitHub actions pour les pipelines auto-hébergés, et Consultation Capgo si un plugin se brise après l'activation de R8.

Mises à jour instantanées pour les applications Capacitor

When a web-layer bug is live, ship the fix through Capgo instead of waiting days for app store approval. Users get the update in the background while native changes stay in the normal review path.

Dernières actualités de notre Blog

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