Die Play Console markiert nun Capacitor Android Apps wegen App-Optimierung liegt unter unserem Schwellenwert, oft zusammen mit Obfuscation hat sich gehalten 3%. Google fordert mindestens 25% Obfuscation, Optimierung und Shrinking. Die Durchsetzung startet im Februar 2027, und ein Verstoß kann die Sichtbarkeit und Veröffentlichungsoptionen einschränken.
So sieht die Warnung in Android vitals aus:

Das ist ein natives Android-DEX-Problem. Es geht nicht um dein Vue-, React- oder Angular-Bundle. Capgo Auch Live Updates ändern diesen Score nicht. Du behebst das im Android Gradle Release Build und lädst dann ein neues App Bundle hoch.
What Google is measuring
Google Play prüft den DEX-Code in deinem Android App Bundle: kompiliertes Java und Kotlin, inklusive Capacitor, Plugins und AndroidX. Ab Februar 2027 müssen Apps mit mehr als 10 MB DEX-Code die Anforderungen für 25% in allen drei Bereichen erfüllen:
| Metrik | Was das bedeutet | Typische Capacitor Ursache für niedrige Scores |
|---|---|---|
| Obfuscation | Klassen-, Feld- und Methodennamen in kurze Namen umbenannt | minifyEnabled ist immer noch false |
| Optimierung | R8 inlined, merged und schreibt Bytecode um | Standard proguard-android.txt beinhaltet -dontoptimize |
| Shrinking | Ungenutzte Klassen und Methoden werden entfernt | Resource/code Shrinking war nie aktiviert |
Play liest r8.json wenn du mit dem neuesten Patch des Android Gradle Plugin 8.10 oder höher buildest. Ansonsten nutzt es mapping.txt, dann DEX-Heuristiken. Eine Capacitor App, die ohne Minification ausgeliefert wird, hat fast keine Mapping-Datei, weshalb Play lesbare Namen sieht und nur wenige Prozent Obfuskation meldet (oft Überreste bereits obfuskierter Library-AARs). Das entspricht einem 3% Vitals-Score.
Offizielle Richtlinie: Technische Qualitätsanforderungen der Play Console. Implementierungsdetails: DEX code Optimierung und App-Optimierung mit R8 aktivieren.
Warum Capacitor Apps diesen Check nicht bestehen
Das Capacitor Android-Template liefert weiterhin Release-Builds aus ohne R8:
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
Dies ist der Standard in android-template/app/build.gradle. Debug-Builds sollten so bleiben. Release-Builds hingegen nicht, falls du im Play Store veröffentlichst.
Dein JavaScript wird bereits durch Vite oder webpack minifiziert. Das zählt für Play nicht. Nur native DEX-Namen, ungenutzte native code und R8-Optimierungen sind relevant.
Schritt 1 — R8 für Release aktivieren
Öffne android/app/build.gradle (Groovy ist der Capacitor Standard) und ändere den Release Block:
buildTypes {
release {
minifyEnabled true
shrinkResources true
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
Falls das Modul Kotlin DSL nutzt (build.gradle.kts):
buildTypes {
getByName("release") {
isMinifyEnabled = true
isShrinkResources = true
proguardFiles(
getDefaultProguardFile("proguard-android-optimize.txt"),
"proguard-rules.pro"
)
}
}
Drei Details sind wichtig:
minifyEnabled trueist das, was R8 tatsächlich ausführt (shrink + obfuscate + optimize).shrinkResources trueentfernt ungenutzte Android-Ressourcen. Erfordert Minifizierung.- Nutze für dieses R8-Setup
proguard-android-optimize.txt.proguard-android.txtliefert-dontoptimize, was R8-Optimierungen blockiert und AGP 9 zum Scheitern bringt. Play erlaubt jeden Shrinker; Capacitor Apps sollten R8 mit den Standard-Optimierungen nutzen. Siehe AGP-9-Build-Fehler im Capacitor Plugin beheben , ob ein Plugin immer noch auf die alte Datei verweist.
Setze nicht minifyEnabled true auf debug. 'Release-only' hält lokale Runs schnell und Stacktraces lesbar.
Schritt 2 — Deaktiviere den R8 Full Mode nicht
Öffne android/gradle.properties und entferne diese Zeile, falls sie existiert:
android.enableR8.fullMode=false
AGP 8+ aktiviert den Full Mode bereits. Das Flag beizubehalten, begrenzt die Optimierung.
Suche außerdem nach android/app/proguard-rules.pro (und alle weiteren -include Dateien) für:
-dontobfuscate
-dontoptimize
-dontshrink
-keep class ** { *; }
Diese Regeln halten die Play-Scores niedrig, auch nach dem Umschalten. minifyEnabledLösche sie, es sei denn, du hast einen dokumentierten, temporären Grund.
Schritt 3 — Nur Capacitor Plugins behalten, nicht die ganze App
R8 nutzt Reflection-Metadaten. Capacitor Plugins werden über Annotationen erkannt und brauchen deshalb Keep-Rules. Normalerweise musst du diese nicht selbst hinzufügen. Seit Capacitor 3.2.3 @capacitor/android liefert Consumer-ProGuard-Rules mit, that keep:
@CapacitorPluginKlassen,@PluginMethod, Permission- und Activity-Callbacks- Classes that extend
com.getcapacitor.Plugin - Legacy
@NativePluginund Cordova-Plugin-Klassen
Bleib auf einer aktuellen Capacitor 6/7/8-Version, damit diese Consumer-Rules angewendet werden.
Zusätzliche Rules hinzufügen in android/app/proguard-rules.pro nur für einen Crash, den du in einem Release-Build reproduzieren kannst. Präzision schlägt Gießkanne:
# Good: one misbehaving plugin package
-keep class com.mycompany.myplugin.** { *; }
# Bad: this will tank obfuscation and shrinking
-keep class com.getcapacitor.** { *; }
-keep class ** { *; }
Wenn ein Third-Party-Plugin trotz einer gezielten Keep-Rule weiterhin abstürzt, aktualisiere das Plugin oder ziehe eine gepflegte Alternative aus dem Capgo Plugin-Verzeichnis, oder frage Capgo Consulting um es zu patchen.
Offizielle Capacitor Notizen: Verwendung von ProGuard.
Schritt 4 — Erstelle ein echtes Release-Bundle
Debug-APKs zeigen weiterhin ~0 % Obfuskation. Play bewertet nur das, was du hochlädst.
Vom Projekt-Root aus:
npm run build
npx cap sync android
cd android
./gradlew bundleRelease
Ohne eine release signingConfig schlagen diese Tasks nicht fehl, erzeugen aber ein unsigniertes .aab. Signiere es in Android Studio vor dem Play-Upload.
Installiere ein Release APK auf einem Gerät (./gradlew assembleRelease, dann die APK unter app/build/outputs/apk/release/). Ein .aab ist ein Play-Upload-Format und nichts, was man per Sideloading installiert. Nutze native Plugins (camera, push, file, billing, auth). R8-Bugs treten nicht in npx cap run android Debug-Sessions nicht auf.
Nach den obigen Gradle-Befehlen (du befindest dich in android/), bestätige, dass R8 tatsächlich gelaufen ist:
app/build/outputs/mapping/release/mapping.txtapp/build/outputs/mapping/release/configuration.txt- Mit dem neuesten Patch von AGP 8.10 oder höher,
r8.jsoninnerhalb des App Bundles
Diese release Ordner sind die Standard-Capacitor-Variante. Bei Product Flavors liegt das Mapping unter dem Variant-Namen (mapping/freeRelease/). Die APK liegt unter apk/<flavor>/release/ sein (zum Beispiel apk/free/release/).
Wenn mapping.txt fehlt, du bist im falschen Variant-Ordner, CI hat zusammengebaut debug, oder R8 lief mit -dontobfuscate. Prüfe erneut minifyEnabled true auf release und dass die Keep-Rules die Obfuskation nicht deaktivieren.
Schritt 5 — Crash-Reports lesbar halten
Obfuscated Stack Traces sind ohne die Mapping-Datei nutzlos. Behalte mapping.txt für jede Play-Version:
- Play Console: Test und Release → App-Bundle-Explorer → Downloads → Assets, dann hochladen
mapping.txtfalls es nicht bereits angehängt ist. - Firebase Crashlytics / Sentry: Laden Sie dasselbe Mapping als Teil der CI hoch.
Android Studio / AGP bettet das Mapping oft in den .aabein. Überprüfen Sie dennoch den Assets-Tab nach dem ersten optimierten Upload.
Schritt 6 — Upload und erneute Prüfung im Play
Laden Sie das neue .aab in einen internen Test-Track hoch (für die Score-Aktualisierung ist Production nicht nötig). Öffnen Sie:
- Testen und Veröffentlichen → App-Bundle-Explorer für diese Version
- DEX-Größe plus Prozentsätze für Obfuscation / Optimierung / Shrinking
- Überwachen und verbessern → Android Vitals nachdem die neue Version von Play analysiert wurde
Du brauchst 25 % bei jeder der drei Metriken, nicht nur Obfuskation. Das Aktivieren von R8 mit proguard-android-optimize.txt bringt eine Capacitor App meist von einstelliger Obfuskation auf weit über 25 % bei allen drei.
Nur Play erzwingt die 25 %-Grenze, wenn die DEX-Datei bei Apps über 10 MB liegt (50 MB bei Spielen). Selbst unter diesem Wert lohnt sich die Optimierung: kleinere DEX, weniger Speicherverbrauch, schnellerer Start.
Wenn du noch unter 25 % liegst:
R8 ist aktiv, aber Play (oder der lokale Analyzer) zeigt immer noch einen schwachen Score. Meist sind zu breit gefasste Keep-Rules das Überbleibsel.
- Öffne R8-Konfigurations-Analyzer falls dein Android Gradle Plugin 9.3 oder neuer ist —
assembleReleaseschreibt dannconfiganalyzer.htmlnebenmapping.txt. Bei AGP 9.2 und früher: Überspringe diese HTML-Datei und nutze stattdessenmapping.txt, den APK Analyzer und den App Bundle Explorer von Play. - Sortiere Keep-Regeln danach, wie viel der App sie einfrieren. Regeln von Library-Consumern, die nicht editierbar sind, sind normal. App-Ebene
-keep class com.foo.** { *; }ist es nicht. - Öffne die
.aabWähle im Android Studio APK Analyzer den großen.dexDateien und schalte deobfuscated Names um (benötigtmapping.txt). Pakete, die riesig und lesbar bleiben, sollten nicht mehr pauschal behalten werden. - Plugins aktualisieren, die noch auf ... verweisen
proguard-android.txt. Diese Datei verhindert die Optimierung bei AGP 9 und ist ein Warnsignal bei älteren Plugins.
Versuche nicht, einen niedrigen Score zu „beheben“, indem du DEX mit minifyEnabled false und darauf hoffst, dass sich die Heuristiken ändern. Play will Verkleinerung, Optimierung, und Obfuskation.
Was das nicht ersetzt
- JavaScript-Minifizierung in
vite.config.tsändert diese Metrik nicht. - Capgo Live Updates HTML/JS/CSS ausliefern. Sie bauen DEX nicht neu. Sobald R8 in der Store-Binary aktiv ist, kannst du weiterhin JS-Fixes per Live Update ausliefern. Der Obfuskations-Check selbst braucht einen nativen Play-Upload.
- 16-KB-Seitengröße ist eine separate native Play-Anforderung. Siehe Android 16 KB Seitengröße.
Wenn du Android bereits mit Capgo Buildbaust, ändere android/app/build.gradle im Repo. Der nächste Cloud-Build verwendet R8. Du brauchst keine andere Play-Pipeline, nur ein Release-Binary mit aktivierter Minification. Das Gleiche gilt, wenn du GitHub Actions Android-Buildsnutzt: Der Workflow muss Releaseassemblieren, nicht debuggen.
FAQ
Kann R8 meine Capacitor Plugins zerschießen?
Das kann passieren, wenn ein Plugin Reflection nutzt und keine Consumer-Keep-Rules mitliefert. Core Capacitor schützt Plugin-Klassen bereits. Teste einen Release-Build. Füge eine eingrenzen die Regel nur für das Paket beibehalten, das abstürzt. Wenn das Plugin nicht mehr gepflegt wird, Capgo Consulting kann man es forken und weiterhin bauen.
Zeigt das npx cap run an, dass ich den Check bestanden habe?
Nein. Dieser Befehl nutzt einen Debug-Build mit deaktiviertem R8. Nutze bundleRelease / einen signierten Play-Upload.
Wir haben bereits minifyEnabled true eingestellt und sehen immer noch 3 %. Warum?
Suche nach -dontobfuscate, proguard-android.txt, android.enableR8.fullMode=false, und eine pauschale -keep rules. Confirm CI uploaded the minified AAB, not an old artifact.
Brauchen wir ProGuard statt R8?
Nein. R8 ist der Shrinker des Android Gradle Plugins. Er liest Rule-Dateien im ProGuard-Stil. Die Google Play Docs erlauben jeden Shrinker; R8 ist der, den Capacitor Apps nutzen sollten.
Checkliste
-
release { minifyEnabled true; shrinkResources true } -
proguard-android-optimize.txt(nichtproguard-android.txt) - Nein
-dontobfuscate/-dontoptimize/ App-weit-keep class ** - Capacitor 3.2.3+ damit Plugin-Consumer-Rules greifen
- Release-Build erzeugt
mapping.txt - Native Plugins auf Release-Install getestet
- Neu
.aabhochgeladen; Mapping im App Bundle Explorer angehängt - Obfuscation, Optimierung und Shrinking jeweils über 25 %
Das ist die gesamte Warnung der Play Console: Capacitor hat R8 deaktiviert, Play hat mit dem DEX-Scoring begonnen; eine einzeilige Gradle-Änderung beim Release und ein Store-Upload lösen das Problem.
Weiterlesen bei Fix Google Play Obfuscation Below 25% in Capacitor Apps
Wenn du es nutzt Google Play Obfuscation unter 25 % in Capacitor Apps fixen um Android Store-Releases zu planen, verbinde es mit Capgo Native Builds optimieren für Release App Bundles, Capgo CI/CD für die Upload-Pipeline, CI/CD-Integration für Implementierungsdetails, Automatischer Capacitor Android-Build mit GitHub Actions für selbst gehostete Pipelines, und Capgo Consulting if a plugin breaks after R8 is enabled.