Vai al contenuto principale

Fix Google Play Obfuscation Below 25% in Capacitor Apps

Pass Google Play's 25% obfuscation check in a Capacitor Android app by enabling R8, shrinking unused DEX, and shipping a release App Bundle.

02 settembre 2026

Risolve il problema di obfuscazione di Google Play al di sotto del 25% negli app __CAPGO_KEEP_0__

Passa il controllo di obfuscazione del 25% di Google Play in un'app Android __CAPGO_KEEP_0__ abilitando R8, riducendo le DEX non utilizzate e distribuendo un'applicazione Bundle di rilascio.

Crediti dell'articolo

Martin Donadieu

Autore dell'articolo (Scrittore) - Enterprise product/pricing page. Ruolo: etichetta di interfaccia utente. Visualizzato in: pagina enterprise.astro. Chiave di messaggio `enterprise_partnership_capgo_martin_name` (Nome di partnership Capgo Martin).

Editor

Risolve l'obfuscazione di Google Play al di sotto del 25% nei Capacitor app

Ora il Console di Gioco segnala le Capacitor app Android per L'ottimizzazione dell'app è al di sotto del nostro thresholdspesso con Obfuscazione è rimasto 3%. Google vuole almeno 25% l'obfuscazione, l'ottimizzazione e la riduzione. La conformità inizia in febbraio 2027, e non riuscire a farlo può ridurre la visibilità e le opzioni di pubblicazione.

La segnalazione sembra così in Android Vitals:

Google Play Console Android vitals warning mostra l'obfuscation al 3 percento, al di sotto del 25 percento di ottimizzazione dell'applicazione, con una data di risoluzione di febbraio 2027

Si tratta di un problema nativo Android DEX. Non si tratta del tuo bundle Vue, React o Angular. Capgo Aggiornamenti in tempo reale non cambiano questo punteggio. Rendi la correzione nell'edizione di rilascio del build Android Gradle, quindi carica un nuovo bundle dell'applicazione.

Cosa Google sta misurando

Google Play controlla il DEX nel tuo bundle dell'app Android: Java e Kotlin compilati, inclusi Capacitor, plugin e AndroidX. A partire da febbraio 2027, le app con più di 10 MB di DEX devono soddisfare 25% su tutti e tre:

Metrica Cosa significa Tipico Capacitor motivo di un punteggio basso
Oscurezza I nomi delle classi, campi e metodi sono rinominati in nomi brevi minifyEnabled è ancora false
Optimizzazione R8 inoltra, combina e riscrive il bytecode Predefinito proguard-android.txt include -dontoptimize
Riduzione Le classi e i metodi non utilizzati sono eliminati La riduzione delle risorse/code non è mai attivata

Legge Play r8.json quando costruisci con l'ultima patch del plugin Android Gradle 8.10 o superiore. mapping.txt, then DEX heuristics. A Capacitor app shipped with minification off has almost no mapping file, so Play sees readable names and reports a few percent obfuscation (often leftover from already-obfuscated library AARs). That matches a 3% , quindi leuristiche DEX. Un'app __CAPGO_KEEP_0__ spedita con la minificazione disattivata ha quasi nessun file di mapping, quindi Play vede nomi leggibili e segnala una percentuale di obfuscazione (spesso lasciata da librerie AAR già obfuscate). Ciò corrisponde a

una valutazione vitale. Politica ufficiale:Requisiti di qualità tecnica del Console Play DEX code optimization ottimizzazione DEX __CAPGO_KEEP_0__ e.

Why Capacitor apps fail this check

Perché le Capacitor app falliscono questo controllo di qualità. L'applicazione Android di base di Capgo ancora spedisce release builds senza R8:

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

Questo è il default in android-template/app/build.gradle. Le costruzioni di debug dovrebbero rimanere così. Le costruzioni di rilascio non dovrebbero, se pubblichi su Play.

Il tuo JavaScript è già minificato da Vite o webpack. Play non conta questo. Contano solo i nomi nativi DEX, le code native non utilizzate e le ottimizzazioni R8.

Passo 1 — Attiva R8 per il rilascio

Apri android/app/build.gradle (Groovy è il Capacitor predefinito) e modifica il blocco di rilascio: Se il modulo utilizza Kotlin DSL (

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

releasebuild.gradle.kts):

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

Tre dettagli sono importanti:

  1. minifyEnabled true è ciò che esegue effettivamente R8 (riduci + confonde + ottimizza).
  2. shrinkResources true elimina risorse Android non utilizzate. Richiede minificazione.
  3. Per questa configurazione di R8, utilizzare proguard-android-optimize.txt. proguard-android.txt invia -dontoptimize, che blocca le ottimizzazioni di R8 e fallisce AGP 9. Play consente a qualsiasi riduttore di funzionare; le app Capacitor dovrebbero utilizzare R8 con i valori di default di ottimizzazione. Vedi Capacitor Plugin AGP 9 Build Error Fix se un plugin ancora si riferisce al file vecchio.

Non impostare minifyEnabled true su debug. La sola esecuzione di rilascio mantiene le esecuzioni locali veloci e le tracce di stack leggibili.

Passo 2 — Non disabilitare il R8 full mode

Apri android/gradle.properties e rimuovi questa riga se esiste:

android.enableR8.fullMode=false

AGP 8+ abilita già il modo completo. Lasciare quella bandiera in posizione riduce l'ottimizzazione.

Ricerca anche android/app/proguard-rules.pro (e qualsiasi altro -include file) per:

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

Queste regole mantengono i punteggi di Play bassi anche dopo aver invertito. minifyEnabledEliminali a meno che tu non abbia una ragione documentata, temporanea.

Passo 3 — Mantieni i plugin Capacitor, non l'app intera

R8 utilizza i metadati di riflessione. I plugin Capacitor vengono scoperti tramite annotazioni, quindi hanno bisogno di regole di mantenimento. Di solito non li aggiungi tu stesso. Da Capacitor 3.2.3, @capacitor/android naviaga regole ProGuard per il consumatore che mantengono:

  • @CapacitorPlugin classi @PluginMethod, callback di permesso e attività
  • Le classi che estendono com.getcapacitor.Plugin
  • Legacy @NativePlugin e classi dei plugin Cordova

Resta su una riga corrente Capacitor 6/7/8 per applicare queste regole del consumatore.

Aggiungi regole extra in android/app/proguard-rules.pro esclusivamente per un crash che puoi riprodurre in un build di rilascio. La stretta vince sulla larga:

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

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

Se un plugin di terze parti continua a bloccarsi dopo una regola di mantenimento mirata, aggiorna il plugin, quindi considera un'alternativa mantenuta dall' Capgo directory dei plugin, o chiedi Capgo Consulting di patcharlo.

Note ufficiali di Capacitor: Utilizzare ProGuard.

Passo 4 — Costruisci un bundle di rilascio reale

I APK di debug mostreranno ancora ~0% di obfuscazione. Play valuta solo ciò che carichi.

Dalla radice del progetto:

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

Senza una release signingConfig, queste attività riescono ancora ma emettono un file non firmato .aabSottoscrivilo in Android Studio prima dell'upload su Play.

Installare un APK di rilascio su un dispositivo (./gradlew assembleReleasepoi l'APK sotto app/build/outputs/apk/release/). Un .aab è un formato di upload di Play, non qualcosa che si carica manualmente. Esercitare plugin nativi (camera, push, file, fatturazione, autenticazione). I bug di R8 non si manifestano nelle sessioni di debug. npx cap run android Dopo i comandi Gradle sopra (si è in

verificare se R8 è effettivamente stato eseguito: android/Sulla versione più recente di AGP 8.10 o superiore,

  • app/build/outputs/mapping/release/mapping.txt
  • app/build/outputs/mapping/release/configuration.txt
  • all'interno del Bundle dell'applicazione r8.json Prima dell'upload su Play, firmalo in Android Studio.

Quei release sottodirectory sono la variante predefinita Capacitor. Con i gusti dei prodotti, la mappatura è sotto il nome della variante (mapping/freeRelease/Il APK è sotto apk/<flavor>/release/ ad esempio apk/free/release/).

Se mapping.txt non è presente, si trova nella cartella di variante sbagliata, CI assemblato debugo R8 eseguito con -dontobfuscateRivendi minifyEnabled true su release e assicurati che le regole di conservazione non disabilitino l'obfuscamento.

Passo 5 — Mantieni leggibili i rapporti di crash

Le tracce di stack obfuscate sono inutili senza il file di mappatura. Mantieni mapping.txt per ogni versione di Play:

  • Console di Play: Testa e rilascia → Esploratore dei bundle dell'applicazione → Download → Risorse, quindi caricalo mapping.txt se non è già attaccato.
  • Firebase Crashlytics / Sentry: caricare la stessa mappatura come parte del CI.

Android Studio / AGP spesso incorpora la mappatura nel .aabVerifica ancora la scheda Risorse dopo il primo caricamento ottimizzato.

Passo 6 — Carica e riconferma Play

Carica il nuovo .aab su un tracciato di testing interno (la produzione non è necessaria per aggiornare il punteggio). Apri:

  1. Testa e rilascia → Esploratore dei bundle dell'applicazione per quella versione
  2. dimensione DEX più percentuali di obfuscation / ottimizzazione / riduzione
  3. Monitora e migliora → Android Vitals dopo la nuova versione è quella che Play analizza

hai bisogno di 25% su ogni dei tre metriche, non solo l'obfuscation. Abilitando R8 con proguard-android-optimize.txt di solito salta un'app Capacitor da un obfuscation a singolo dígito a ben oltre il 25% su tutti e tre.

Play impone solo il 25% di soglia quando DEX è sopra i 10 MB per le app (50 MB per i giochi). Anche sotto quella soglia, risolvere il problema è ancora utile: DEX più piccolo, meno memoria, avvio più veloce. Se sei ancora sotto il 25%

enforces

R8 è attivo, ma Play (o l'analizzatore locale) mostra ancora un punteggio debole. Le regole di conservazione ampie sono le solite residuo.

  1. Apri Analizzatore di configurazione R8 se il tuo plugin Gradle Android è 9.3 o successivo — assembleRelease allora scrive configanalyzer.html al fianco di mapping.txt. Su AGP 9.2 e precedenti, saltare quel file HTML e utilizzare mapping.txtAPK Analyzer, e l'esploratore di bundle di App di Play al suo posto.
  2. Ordina le regole di conservazione per quanto bloccano l'app. Le regole dei consumatori di librerie che non puoi modificare sono normali. Quella dell'app -keep class com.foo.** { *; } non lo è.
  3. Apri il .aab in Android Studio APK Analyzer, seleziona il grande .dex file e attiva i nomi non deobfuscati (richiede) mapping.txtLe pacchetti che rimangono enormi e leggibili sono quelli da fermare di colpo.
  4. Aggiorna i plugin che ancora si riferiscono proguard-android.txtQuel file blocca l'ottimizzazione su AGP 9 e è un segnale di allarme nei plugin più vecchi.

Non 'aggiusta' un punteggio basso riducendo DEX con minifyEnabled false e sperando che le heuristici cambino. Play vuole ridurre, ottimizzare, e context

l'obfuscazione.

  • Cosa questo non sostituisce La minificazione del JavaScript vite.config.ts in
  • Capgo aggiornamenti in tempo reale invia HTML/JS/CSS. Non ricostruisci DEX. Dopo che R8 è attivo nel binario di store, puoi ancora inviare correzioni JS in tempo reale. La verifica dell'obfuscation stessa richiede un upload nativo Play.
  • 16 KB di dimensione della pagina è un requisito nativo separato di Play. Vedi Dimensione della pagina Android 16 KB.

Se già costruisci Android con Capgo Costruisci, modifica android/app/build.gradle nel repository. Il prossimo cloud build rileva R8. Non hai bisogno di una pipeline Play diversa, solo un binario di rilascio prodotto con minificazione attiva. Lo stesso concetto se mantieni GitHub Costruisci build Android: il flusso di lavoro deve assemblare rilevamento, non debug.

Domande Frequenti

Will enabling R8 break my Capacitor plugins?

Può succedere se un plugin utilizza la riflessione e non fornisce regole di conservazione per il consumatore. Il core Capacitor mantiene già le classi dei plugin. Testa una versione di rilascio. Aggiungi una regola di conservazione solo per il pacchetto che causa problemi. Se il plugin non è mantenuto, Capacitor Consulting può forking e mantenerlo in esecuzione. Narrow keep rule Capgo Consulting No. Quel comando utilizza una versione di debug con R8 spento. Utilizza / a caricamento Play firmato.

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 npx cap run __CAPGO_KEEP_0__ Consulting

can fork and keep it building. bundleRelease __CAPGO_KEEP_0__

Abbiamo già impostato minifyEnabled true e ancora vediamo il 3%. Perché?

Cerca -dontobfuscate, proguard-android.txt, android.enableR8.fullMode=false, e copri -keep le regole. Conferma che il CI ha caricato l'AAB minificato, non un artefatto vecchio.

Abbiamo bisogno di ProGuard al posto di R8?

No. R8 is the Android Gradle Plugin shrinker. It reads ProGuard-style rule files. Google’s Play docs allow any shrinker; R8 is the one Capacitor apps should use.

Elenco di controllo

  • release { minifyEnabled true; shrinkResources true }
  • proguard-android-optimize.txt non proguard-android.txt)
  • No -dontobfuscate / -dontoptimize non app-wide -keep class **
  • Capacitor 3.2.3+ così le regole del consumatore del plugin si applicano
  • Rilascio build produce mapping.txt
  • Nativi plugin testati su un installazione di rilascio
  • Nuovo .aab Caricato; mappa attaccata nell'esploratore del bundle dell'app
  • L'oscuramento, l'ottimizzazione e la riduzione di dimensioni ciascuno al 25%+

Questo è l'intero avviso del Console di Gioco: Capacitor lasciato R8 fuori, Play ha iniziato a valutare DEX, e un cambiamento di rilascio Gradle di una riga più un caricamento di store è la soluzione.

Continua da Come risolvere l'oscuramento del Play Store al di sotto del 25% in Capacitor App

Se stai utilizzando Come risolvere l'oscuramento del Play Store al di sotto del 25% in Capacitor App per pianificare i rilasci di store Android, connettilo con Capgo Costruzioni native per i bundle di App di rilascio, Capgo CI/CD per il pipeline di caricamento Integrazione CI/CD context Automatic Capacitor Android build with GitHub actions per dettagli di implementazione Capgo Consulting per pipeline auto-hosted, e

Aggiornamenti in tempo reale per le vostre app Capacitor

Quando un bug nel layer web è attivo, inviate la correzione attraverso Capgo anziché aspettare giorni per l'approvazione della store. Gli utenti ricevono l'aggiornamento in background mentre le modifiche native rimangono nel normale percorso di revisione.

Supporto umano da parte di Martin

Avvia Ora

Ultimi articoli dal nostro Blog

Capgo vi offre le migliori informazioni che vi servono per creare un'app mobile davvero professionale.