Saltare al contenuto principale

Risolve il problema di obfuscazione di Google Play al di sotto del 25% nei tuoi app Capacitor

Passa il controllo di obfuscazione del 25% di Google Play in un'app Android Capacitor abilitando R8, comprimendo le DEX non utilizzate e distribuendo un bundle di app di rilascio.

Crediti dell'articolo

Martin Donadieu

Autore

Valeria

Recensore

Jordan

Curatore

Correggi l'obfuscamento di Google Play al di sotto del 25% negli app Capacitor

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

La raccomandazione assomiglia a questo in Android vitals:

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

Si tratta di un problema nativo Android DEX. Non si tratta del tuo bundle Vue, React o Angular. Capgo Le aggiornamenti in tempo reale non cambiano questo punteggio. Si risolve in Android Gradle release build, quindi si carica un nuovo App Bundle.

Cosa misura Google

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

Metrica Cosa significa Causa tipica di un punteggio basso: Capacitor
Oscurezza I nomi delle classi, dei campi e dei metodi vengono rinominati con nomi brevi minifyEnabled è ancora false
Optimizzazione R8 inoltra, unisce e riscrive il bytecode Predefinito proguard-android.txt include -dontoptimize
Riduzione Eliminato le classi e i metodi non utilizzati La riduzione di Resource/code non è mai stata attivata

Legge Play r8.json quando costruisci con l'ultima patch di Android Gradle Plugin 8.10 o superiore. Altrimenti utilizza mapping.txtallora le heuristici DEX. Un'app Capacitor spedita con la minificazione disattivata ha quasi nessun file di mapping, quindi Play vede nomi leggibili e segnala una percentuale di obfuscation (spesso lasciata da librerie AAR già obfuscate). Ciò corrisponde a 3% una valutazione vitale.

Politica ufficiale: Requisiti di qualità tecnica del Console di PlayDettaglio di implementazione: Optimizzazione DEX code e abilita l'ottimizzazione dell'applicazione con R8.

Why gli Capacitor app falliscono questo controllo

La Capacitor template Android ancora invia 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. I build di debug dovrebbero rimanere così. I build di rilascio non dovrebbero, se pubblichi su Play.

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

Passo 1 — Attiva R8 per il rilascio

Apre android/app/build.gradle (Groovy è il Capacitor default) e cambia il rilascio block:

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

Se il modulo utilizza Kotlin DSL (build.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 + confondi + ottimizza).
  2. shrinkResources true elimina risorse Android non utilizzate. Richiede minificazione.
  3. Per questa configurazione di R8, utilizza proguard-android-optimize.txt. proguard-android.txt che spedisce -dontoptimize, che blocca le ottimizzazioni di R8 e fallisce AGP 9. Play consente qualsiasi riduttore; le app Capacitor dovrebbero utilizzare R8 con le impostazioni di ottimizzazione predefinite. Vedi Plugin AGP 9 Build Error Fix Capacitor se un plugin si riferisce ancora al file vecchio.

Non impostare minifyEnabled true su debugRelease-only mantiene le esecuzioni locali veloci e le tracce di stack leggibili.

Step 2 — Non disabilitare il full mode di R8

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

android.enableR8.fullMode=false

AGP 8+ abilita già il full mode. Lasciare quella flag in posto limita l'ottimizzazione.

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

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

Quei regole mantiene le punteggi di Play bassi anche dopo aver attivato minifyEnabled. Eliminali a meno che tu non abbia una ragione documentata e temporanea.

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

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

  • @CapacitorPlugin classi, @PluginMethodcallback 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 quelle regole del consumatore.

Aggiungi regole extra in android/app/proguard-rules.pro esclusivamente per un crash che puoi riprodurre in una versione di rilascio.

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

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

Narrow batte broad: Capgo plugin directory__CAPGO_KEEP_0__ directory dei plugin Capgo Consulting __CAPGO_KEEP_0__ Consulting

Official Capacitor notes: Note ufficiali di __CAPGO_KEEP_0__:.

Utilizzare ProGuard

Fase 4 — Costruisci un bundle di rilascio reale

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

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

Senza una release configurazione di firma, queste attività riescono ancora a completarsi ma emettono un file non firmato .aabFirmalo in Android Studio prima dell'upload su Play.

Installa un APK di rilascio su un dispositivo (./gradlew assembleReleasequindi l'APK sotto app/build/outputs/apk/release/). Un .aab è un formato di upload di Play, non qualcosa che si carica a mano. Esercita 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 trova in

), conferma che R8 sia effettivamente stato eseguito: android/protectedTokens

  • app/build/outputs/mapping/release/mapping.txt
  • app/build/outputs/mapping/release/configuration.txt
  • Sulla versione più recente di AGP 8.10 o superiore, r8.json all'interno del Bundle dell'app

Quei release sotto-cartelle sono la variante predefinita Capacitor. Con i gusti di prodotto, la mappatura è sotto il nome della variante (mapping/freeRelease/L'APK è sotto apk/<flavor>/release/ ad esempio apk/free/release/).

Se mapping.txt è mancante, 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 i rapporti di crash leggibili

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

  • Console di Play: Testa e pubblica → Esploratore di bundle di App → Download → Risorse, quindi carica mapping.txt se non è già attaccato.
  • Firebase Crashlytics / Sentry: carica lo stesso mapping come parte del CI.

Studio Android / AGP spesso incorpora il mapping nel .aab. Verifica comunque la scheda Risorse dopo l'upload ottimizzato iniziale.

Passo 6 — Carica e ricontrolla Play

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

  1. Testa e rilascia → Esplora bundle dell'app per quella versione
  2. dimensione del file DEX più percentuali di obfuscazione / ottimizzazione / riduzione
  3. Monitora e migliora → Vitals Android dopo la nuova versione è quella che Play analizza

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

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

Se sei ancora sotto il 25%

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

  1. Apre Analizzatore di configurazione R8 se il tuo plugin Android Gradle è 9.3 o successivo — assembleRelease allora scrive configanalyzer.html accanto a 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 posto suo.
  2. Ordina le regole di keep per quanto esse bloccano l'app. Le regole di consumo di librerie che non puoi modificare sono normali. Quelle di livello di app -keep class com.foo.** { *; } non lo sono.
  3. Apri il .aab in Android Studio APK Analyzer, seleziona i grandi .dex file, e attiva/disattiva i nomi non deobfuscati (richiede mapping.txt. I pacchetti che rimangono grandi e leggibili sono i pacchetti da fermare di comprare in blocco.
  4. Aggiorna i plugin che ancora si riferiscono proguard-android.txt. Questo file blocca l'ottimizzazione su AGP 9 e è un segnale di allarme nei plugin più vecchi.

Non 'risolvi' un punteggio basso riducendo DEX con minifyEnabled false e sperando che le heuristici cambino. Play vuole ridurre, ottimizzare, e context":"Pagina/Area: Sito web di marketing Capgo. Ruolo: Etichetta UI breve o elemento di navigazione. Visto in: pagina trust.astro. Chiave messaggio `e` (E)."

l'obfuscazione.

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

Se già costruisci Android con Capgo Costruisci, cambia 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 azioni Android: il flusso di lavoro deve essere assemblato rilascio, non debug.

Domande frequenti

Will enabling R8 break my Capacitor plugins?

Potrebbe, se un plugin utilizza la riflessione e non invia regole di conservazione per il consumatore. Il core Capacitor già mantiene le classi dei plugin. Testa un build di rilascio. Aggiungi una regola di conservazione solo per il pacchetto che causa problemi. Se il plugin non è mantenuto, Consulenza __CAPGO_KEEP_0__ Prova Capgo Consulting prova

prova npx cap run prova

No. Quel comando utilizza una versione di debug con R8 spento. Utilizza bundleRelease / un caricamento Play firmato.

Siamo già stati minifyEnabled true e vediamo ancora il 3%. Perché?

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

Dobbiamo utilizzare 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 / app-wide -keep class **
  • Capacitor 3.2.3+ quindi le regole del consumatore plugin si applicano
  • Release build produce mapping.txt
  • Plugin nativi testati su un installazione di rilascio
  • Nuovo .aab contexto: Pagina/Area: Pagina prodotti di aggiornamento in tempo reale. Ruolo: Etichetta UI breve o elemento di navigazione. Chiave di messaggio `live_update_lts_electron_new` (Aggiornamento in tempo reale Lts Electron Nuovo).
  • caricato; mappatura allegata nell'esploratore del bundle dell'app

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.

Quello è tutto il messaggio di avviso del Console di Gioco: Capacitor lasciato R8 fuori, Play ha iniziato a valutare DEX, e un cambiamento di Gradle di rilascio unico più un upload di store è la soluzione.

Continua a procedere da Come risolvere l'oscuramento del Play Store al di sotto del 25% nei __CAPGO_KEEP_0__ App Fix Google Play Obfuscation Below 25% in Capacitor Apps Come risolvere l'oscuramento del Play Store al di sotto del 25% nei __CAPGO_KEEP_0__ App per pianificare rilasci di store Android, connettilo con Capgo Costruzioni nativa per i bundle di applicazione rilasciati, Capgo CI/CD per il pipeline di caricamento, Integrazione CI/CD context: Pagina/area: Capgo Builder / prodotto di costruzione nativa cloud. Ruolo: Etichetta di navigazione breve o elemento UI. Chiave di messaggio `native_build_feature_ci_cd` (Feature di costruzione nativa Ci Cd). Automatic Capacitor Android build with GitHub actions Costruzione di __CAPGO_KEEP_0__ Android automatica con __CAPGO_KEEP_1__ azioni Capgo Consulting __CAPGO_KEEP_0__ Consultazione

Aggiornamenti in tempo reale per le tue app Capacitor

Quando un bug nel layer web è attivo, invia la correzione attraverso Capgo invece di attendere 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

Inizia subito

Ultimi articoli dal nostro Blog

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