Passer à la navigation principale

Réparez l'obfuscation Google Play en dessous de 25% dans les applications Capacitor

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

Crédits de l'article

Martin Donadieu

Auteur

Valeria

Évaluateur

Jordan

Éditeur

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

Le console de Play signale maintenant les applications Android Capacitor pour L'optimisation de l'application est en dessous de notre seuilce qui se produit souvent avec L'obfuscation est resté en place 3%. Google souhaite au moins 25% l'obfuscation, l'optimisation et la mise en forme. La mise en œuvre commence en février 2027 Partenaires de Capgoet, en cas d'échec, cela peut réduire la visibilité et les options de publication.

La mise en garde ressemble à ceci dans Android vitals :

Alerte de Google Play Console Android vitals montrant l'obfuscation à 3 %, en dessous du seuil d'optimisation d'applications de 25 % avec une date de correction de février 2027

Ceci est une question native Android DEX. Il ne s'agit pas de votre bundle Vue, React ou Angular. Capgo Les mises à jour en temps réel n'affectent pas ce score. Vous le corrigez dans la mise en production Android Gradle, puis vous téléchargez une nouvelle App Bundle.

Ce que mesure Google

Google Play inspecte le DÉX dans votre App Bundle 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 doivent atteindre 25% sur les trois :

Métrique Ce qu'il signifie Cause typique d'un score bas Capacitor
Obfuscation Les noms de classe, de champ et de méthode renommés en noms courts minifyEnabled est toujours false
Optimisation R8 enlève, 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 réduction de Resource/code n'est jamais activée

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 lus et signale quelques pourcents d'obfuscation (souvent laissés par des bibliothèques AAR déjà obfusquées). Cela correspond à 3% un score vital.

Politique officielle : Exigences de qualité technique du Console Play. Détail d'implémentation : L'optimisation DEX code et contexte : Page/zone : Site web de marketing Capgo. Rôle : Étiquette de navigation ou élément UI court. Vu dans : page trust.astro. Clé de message `and` (Et)..

Why les Capacitor applications échouent à ce contrôle

Le modèl’Android Capacitor est toujours livré avec des builds de production sans R8 :

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

C'est le mode par défaut dans android-template/app/build.gradle. Les builds de débogage devraient rester ainsi. Les builds de production ne devraient pas, si vous publiez sur Play.

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

Étape 1 — Activez R8 pour la production

Ouvrez android/app/build.gradle (Le Groovy est le Capacitor par défaut) et modifiez la production 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 s'exécute réellement R8 (réduction + flou + optimisation).
  2. shrinkResources true supprime les ressources Android non utilisées. Il nécessite une minimisation.
  3. Pour cette configuration R8, utilisez proguard-android-optimize.txt. proguard-android.txt expédie -dontoptimize, qui bloque les optimisations R8 et échoue AGP 9. Play permet à tout réducteur de se passer ; les applications Capacitor devraient utiliser R8 avec les paramètres d'optimisation par défaut. Voir Capacitor Plugin AGP 9 Build Error Fix si un plugin se réfère toujours au fichier ancien.

N'installez pas minifyEnabled true sur debugMaintient les exécutions locales en mode de sortie rapide et les traces de pile lisibles.

Étape 2 — N'activez pas la mode complet de R8

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

android.enableR8.fullMode=false

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

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

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

Ces règles maintiendront les scores de Play bas même après avoir inversé minifyEnabled. Supprimez-les à moins d'avoir une raison documentée, temporaire.

Étape 3 — Gardez les plugins Capacitor, pas toute l'application

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

  • @CapacitorPlugin classes, @PluginMethodappels de permissions et d'activités
  • Les classes qui étendent com.getcapacitor.Plugin
  • Legacy @NativePlugin et les classes de plugins Cordova

Restez sur une ligne actuelle Capacitor 6/7/8 afin que ces 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 ** { *; }

Narrow bat large : Capgo plugin directoryrépertoire de plugins __CAPGO_KEEP_0__ Capgo Consulting __CAPGO_KEEP_0__ Consulting

Official Capacitor notes: Notes officielles de __CAPGO_KEEP_0__ :.

Utilisation de ProGuard

Étape 4 — Construire un bundle de production réel

Les APKs de débogage afficheront toujours ~0 % d'obfuscation. Seul ce que vous téléchargez est évalué par Play.

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

Sans une release configuration de signature, ces tâches réussissent toujours mais émettent un fichier non signé .aabSignez-le dans Android Studio avant la mise en ligne sur Play.

Installez un APK de version de production sur un appareil (./gradlew assembleReleaseet le fichier APK sous app/build/outputs/apk/release/). Un .aab est un format de mise en ligne sur Play, et non quelque chose que vous installez par sideloading. Exercicez les plugins natifs (caméra, push, fichier, facturation, authentification). Les bogues R8 ne se manifestent pas pendant les sessions de débogage. npx cap run android Après les commandes Gradle ci-dessus (vous êtes dans

confirmez que R8 a bien fonctionné : android/), confirm R8 actually ran:

  • 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

Ces release dossiers sont la variante par défaut Capacitor. Avec des saveurs de produit, la correspondance 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 dossier de variante incorrect, CI a assemblé debugou R8 a exécuté avec -dontobfuscateVérifiez 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 Play :

  • Console Play : Test et lancement → Explorateur de bundle d'applications → 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 de cartographie en tant que partie de CI.

Android Studio / AGP intègre souvent la carte de cartographie dans le .aab. Vérifiez toujours l'onglet Actifs après le premier téléchargement optimisé.

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

Téléchargez le nouveau .aab à une piste de test interne (la production n'est pas requise pour actualiser le score). Ouvrir :

  1. Testez et publiez → Explorateur de l&#39;archive de l&#39;application pour cette version
  2. taille du fichier DEX plus les pourcentages d&#39;obfuscation / optimisation / réduction
  3. Surveillez et améliorez → Vitals Android après la nouvelle version est celle que Play analyse

Vous avez besoin de 25 % sur chacun des trois indicateurs, et non seulement l&#39;obfuscation. L&#39;activation de R8 avec proguard-android-optimize.txt s&#39;accompagne généralement d&#39;un saut d&#39;un Capacitor application de l&#39;obfuscation à un chiffre à bien au-dessus de 25 % sur tous les trois.

seul exige lorsque la taille du DEX dépasse 10 MB pour les applications (50 MB pour les jeux). Même en dessous de ce seuil, il est toujours utile de le corriger : DEX plus petit, moins de mémoire, démarrage plus rapide.

Si vous êtes toujours sous 25%

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

  1. Ouvrir Analyseur de configuration R8 si votre plugin Gradle Android est de 9.3 ou plus récent — assembleRelease alors écrit configanalyzer.html à côté de mapping.txt. Sur AGP 9.2 et versions antérieures, ignorez ce fichier HTML et utilisez mapping.txtAPK Analyzer, et l'explorateur de bundle d'application de Play à la place.
  2. Triez les règles de conservation par la quantité d'applications qu'elles bloquent. Les règles de consommateur de bibliothèque que vous ne pouvez pas éditer sont normales. Le niveau d'application -keep class com.foo.** { *; } n'est pas.
  3. Ouvrez le .aab dans l'analyseur APK d'Android Studio, sélectionnez les fichiers volumineux, et activez les noms déobfuscués (besoin de) .dex Les packages qui restent volumineux et lisibles sont les packages à arrêter de conserver intégralement. mapping.txtMettez à jour les plugins qui référencent toujours
  4. Ce fichier bloque l'optimisation sur AGP 9 et constitue un signal rouge dans les anciens plugins. proguard-android.txtNe « fixez » pas un score bas en réduisant le DEX avec

et en espérant que les heuristiques changent. Play veut la réduction, l'optimisation, minifyEnabled false et context : Page/zone : Site web de marketing Capgo. Rôle : Étiquette de navigation ou élément UI court. Vu dans : page trust.astro. Clé de message `et` (Et). l'obfuscation.

Ceci ne remplace pas

  • la minification du JavaScript en vite.config.ts ne bouge pas ce métrique.
  • Capgo mises à jour en direct expédient HTML/JS/CSS. Ils ne reconstruisent pas DEX. Après R8 est activé dans le store binaire, vous pouvez toujours expédier des correctifs JS en l'air. La vérification d'obfuscation elle-même nécessite une mise en ligne native Play.
  • 16 Ko page size est un exigence native Play distincte. Voir Taille de page Android 16 Ko.

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

FAQ

Will enabling R8 break my Capacitor plugins?

Si vous activez R8, cela peut briser vos Capacitor plugins, si un plugin utilise la réflexion et n'a pas de règles de conservation pour les consommateurs. It can, if a plugin uses reflection and ships no consumer keep rules. Core __CAPGO_KEEP_0__ already keeps plugin classes. Test a release build. Add a narrow Capgo Consulting __CAPGO_KEEP_0__ Consulting

can fork and keep it building. npx cap run Does

Non. Cette commande utilise une version de débogage avec R8 désactivé. Utilisez bundleRelease / une mise en ligne signée 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 -keep confirmez que CI a téléchargé le minifié AAB, et non un artefact ancien.

A-t-on besoin de ProGuard au lieu de R8 ?

Non. R8 est le compresseur de Gradle Android. Il lit les fichiers de règles ProGuard. Les documents de Play de Google autorisent n'importe quel compresseur; R8 est celui que les applications Capacitor devraient utiliser.

Liste de vérification

  • release { minifyEnabled true; shrinkResources true }
  • proguard-android-optimize.txt (pas proguard-android.txt)
  • Non -dontobfuscate / -dontoptimize / application globale -keep class **
  • Capacitor 3.2.3+ donc les règles de consommateur de plugin s'appliquent
  • La mise en production produit mapping.txt
  • Les plugins natifs ont été testés sur une installation de mise en production
  • Neuf .aab context : Page/zone : Page de produit de mise à jour en direct. Rôle : Étiquette de navigation ou élément UI court. Clé de message `live_update_lts_electron_new` (Nouvelle mise à jour en direct Lts Electron).
  • Enregistré ; la correspondance est attachée à l'explorateur de bundle d'application

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.

C'est toute la mise en garde du Console de Play : Capacitor laissé R8 hors, Play a commencé à évaluer DEX, et une modification de ligne de Gradle de mise en production plus une mise en ligne dans le magasin est la solution.

Continuez de Fixer l'obfuscation de Google Play en dessous de 25 % dans les __CAPGO_KEEP_0__ applications Fix Google Play Obfuscation Below 25% in Capacitor Apps Fixer l'obfuscation de Google Play en dessous de 25 % dans les __CAPGO_KEEP_0__ applications pour planifier les lancements de magasin Android, connectez-l’avec Capgo Bâtiments natifs pour les App Bundles de mise en production, Capgo CI/CD pour la pipeline d'upload, Intégration CI/CD contexte : Page/zone : Capgo Builder / produit de construction native dans le cloud. Rôle : Étiquette de navigation ou élément de menu court. Clé de message `native_build_feature_ci_cd` (Native Build Feature Ci Cd). Automatic Capacitor Android build with GitHub actions Construction automatique de l'__CAPGO_KEEP_0__ Android avec des __CAPGO_KEEP_1__ actions Capgo Consulting __CAPGO_KEEP_0__ Conseil

Mises à jour en temps réel pour les applications Capacitor

Quand un bug de la couche web est en ligne, expédiez la correction par le biais de Capgo au lieu d'attendre des jours pour l'approbation de la boutique d'applications. Les utilisateurs reçoivent la mise à jour en arrière-plan tandis que les modifications natives restent dans la voie de revue normale.

un soutien humain de Martin

Démarrer maintenant

Dernières actualités de notre blog

Capgo vous donne les meilleures informations dont vous avez besoin pour créer une application mobile véritablement professionnelle.