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:

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:
minifyEnabled trueè ciò che esegue effettivamente R8 (riduci + confonde + ottimizza).shrinkResources trueelimina risorse Android non utilizzate. Richiede minificazione.- Per questa configurazione di R8, utilizzare
proguard-android-optimize.txt.proguard-android.txtinvia-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:
@CapacitorPluginclassi@PluginMethod, callback di permesso e attività- Le classi che estendono
com.getcapacitor.Plugin - Legacy
@NativePlugine 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.txtapp/build/outputs/mapping/release/configuration.txt- all'interno del Bundle dell'applicazione
r8.jsonPrima 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.txtse 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:
- Testa e rilascia → Esploratore dei bundle dell'applicazione per quella versione
- dimensione DEX più percentuali di obfuscation / ottimizzazione / riduzione
- 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.
- Apri Analizzatore di configurazione R8 se il tuo plugin Gradle Android è 9.3 o successivo —
assembleReleaseallora scriveconfiganalyzer.htmlal fianco dimapping.txt. Su AGP 9.2 e precedenti, saltare quel file HTML e utilizzaremapping.txtAPK Analyzer, e l'esploratore di bundle di App di Play al suo posto. - 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 è. - Apri il
.aabin Android Studio APK Analyzer, seleziona il grande.dexfile e attiva i nomi non deobfuscati (richiede)mapping.txtLe pacchetti che rimangono enormi e leggibili sono quelli da fermare di colpo. - 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.tsin - 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.txtnonproguard-android.txt) - No
-dontobfuscate/-dontoptimizenon 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
.aabCaricato; 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