Release-App-Bundle bauen
React Native packt dein JavaScript in den nativen Android-Build, daher kommt die Release-.aab aus Gradle. Richte zuerst die Signatur ein (nächster Abschnitt), dann:
Paketnamen prüfen
applicationIdinandroid/app/build.gradleist nach dem Upload zu Google Play endgültig. Stell sicher, dass es der gewünschte ist.Bauen
Führe im Projektstamm
npx react-native build-android --mode=releaseaus oder ruf Gradle wie unten direkt auf. Beides startet den TaskbundleReleaseund packt das JavaScript in die App.Datei finden
Das Bundle landet unter
android/app/build/outputs/bundle/release/app-release.aab.Release-Build testen
Deinstalliere die Debug-App und installiere dann die Release-Variante mit dem zweiten Befehl unten auf einem echten Gerät. Abstürze, die nur im Release auftreten, zeigen sich hier und nicht erst in der Play Console.
cd android
./gradlew bundleReleasenpm run android -- --mode="release"Setze org.gradle.configureondemand=true nicht in gradle.properties. Der Release-Build kann dann das Bündeln von JavaScript und Assets überspringen, und Tester bekommen eine App, die nicht startet.
Upload-Schlüssel und Play App-Signatur
Google Play verlangt für neue Apps die Play App-Signatur: Google verwahrt den App-Signaturschlüssel, und du signierst Uploads mit einem Upload-Schlüssel. Erzeuge ihn mit keytool, das mit dem JDK kommt:
keytool -genkeypair -v -storetype PKCS12 -keystore my-upload-key.keystore \
-alias my-key-alias -keyalg RSA -keysize 2048 -validity 10000Verschiebe die Datei nach android/app/ und trag die Zugangsdaten in ~/.gradle/gradle.properties ein, damit sie nie in Git landen:
MYAPP_UPLOAD_STORE_FILE=my-upload-key.keystore
MYAPP_UPLOAD_KEY_ALIAS=my-key-alias
MYAPP_UPLOAD_STORE_PASSWORD=*****
MYAPP_UPLOAD_KEY_PASSWORD=*****Füge dann in android/app/build.gradle eine release-Signaturkonfiguration hinzu und nutze sie im Release-Build-Typ. Der Release-Build-Typ der Vorlage signiert mit dem Debug-Schlüssel, bis du das änderst:
android {
signingConfigs {
release {
if (project.hasProperty('MYAPP_UPLOAD_STORE_FILE')) {
storeFile file(MYAPP_UPLOAD_STORE_FILE)
storePassword MYAPP_UPLOAD_STORE_PASSWORD
keyAlias MYAPP_UPLOAD_KEY_ALIAS
keyPassword MYAPP_UPLOAD_KEY_PASSWORD
}
}
}
buildTypes {
release {
// ...
signingConfig signingConfigs.release
}
}
}Versionscode und Ziel-API-Level
Jeder Upload braucht einen höheren versionCode als alles bisher Hochgeladene. In einem Bare-Projekt steht er in android/app/build.gradle; versionName ist die Bezeichnung, die Nutzer sehen:
android {
defaultConfig {
versionCode 2
versionName "1.0.1"
}
}Seit dem 31. August 2026 müssen neue Apps und Updates Android 16 (API-Level 36) als Ziel haben. Die SDK-Level stehen im ext-Block von android/build.gradle (compileSdkVersion, targetSdkVersion). Neue React-Native-Versionen heben sie an. Bei einer älteren Version ist ein React-Native-Upgrade meist sicherer, als nur targetSdkVersion zu erhöhen, weil auch deine nativen Bibliotheken kompatibel sein müssen.
React-Native-Fallen
- Debug-signiertes Bundle. Vergisst du, den Release-Build-Typ auf
signingConfigs.releaseumzustellen, lehnt die Play Console den Upload als debug-signiert ab. - Überraschungen mit R8/ProGuard. Mit
enableProguardInReleaseBuilds = truekönnen Bibliotheken, die Reflection nutzen, nur im Release abstürzen. Ergänze ihre Keep-Regeln inandroid/app/proguard-rules.pround teste den Release-Build auf einem Gerät. - Unlesbare Absturzberichte. Hermes, die Standard-Engine, führt vorkompilierten Bytecode aus; Release-Stacktraces zeigen ins kompilierte Bundle. Bewahre die Source Maps jedes hochgeladenen Builds auf, um Berichte von Testern zu symbolisieren.
- Die App sucht Metro. Ein Release-Build, der den Entwicklungsserver erreichen will, hat kein gebündeltes JavaScript. Prüfe die Einstellung
configureondemandund baue neu. - Native Module und 16-KB-Seiten. Bibliotheken mit nativen
.so-Dateien müssen 16-KB-Speicherseiten unterstützen. Die Play Console warnt davor, und ab dem 1. Februar 2027 lassen sich Updates ohne Unterstützung nicht mehr veröffentlichen. Aktualisiere sie vor Testbeginn. - Verlorener Keystore. Sichere den Keystore und seine Passwörter. Du kannst in der Play Console ein Zurücksetzen des Upload-Schlüssels beantragen, aber das kostet Zeit, die du mitten im Test nicht verlieren willst.
Abstürze von Testern symbolisieren
Ein JavaScript-Absturz in einem Release-Build kommt bei dir als Hermes-Bytecode-Position wie p@1:132161 an, die für sich genommen nichts verrät. React Native erzeugt für Android-Release-Builds standardmäßig Source Maps; entscheidend ist, für jedes hochgeladene Bundle die richtige Map aufzubewahren.
Source Map archivieren
Kopiere nach jedem Release-Build die Map aus
android/app/build/generated/sourcemaps/react/release/und beschrifte sie mit dem Versionscode. Sie muss genau zum Commit des abgestürzten Builds passen: Schon kleine Codeänderungen verschieben die Offsets.metro-symbolicate ausführen
Speichere den Stacktrace des Testers in einer Datei oder lies ihn direkt aus
adb logcatund leite ihn mit dieser Map durchmetro-symbolicate. Das Tool übersetzt Bytecode-Offsets zurück in Dateinamen, Zeilen und Funktionsnamen.Native Frames in der Play Console prüfen
Abstürze im Java- oder Kotlin-Code nativer Module erscheinen unter Beobachten und verbessern → Android Vitals → Abstürze und ANRs. Mit aktivem R8 macht die Mapping-Datei im
.aabsie ohne zusätzlichen Upload lesbar.
# From a saved stack trace
npx metro-symbolicate android/app/build/generated/sourcemaps/react/release/index.android.bundle.map < stacktrace.txt
# From a connected device
adb logcat -d | npx metro-symbolicate android/app/build/generated/sourcemaps/react/release/index.android.bundle.mapBeendet sich metro-symbolicate sofort ohne Ausgabe, hat es keine Eingabe bekommen: Übergib den Stacktrace per Pipe oder Umleitung, nicht durch Eintippen im Terminal.
Play Console kurz: vom geschlossenen Test zur Produktion
Sobald dein React Native-Bundle gebaut und signiert ist, passiert der Rest in der Play Console und funktioniert für jedes Framework gleich. Hier die Checkliste; jedes Menü und jeden Bildschirm erklärt die vollständige Play-Console-Anleitung.
- App-Einrichtung abschließen: im Dashboard Datenschutzerklärung, App-Zugriff, Werbung, Altersfreigabe, Zielgruppe, Datensicherheit und Store-Eintrag.
- Release für den geschlossenen Test erstellen: unter Testen und veröffentlichen → Tests → Geschlossene Tests die Länder deiner Tester wählen, das
.aabhochladen und zur Prüfung senden. - Tester per Google Group hinzufügen: im Tab Tester die Gruppe eintragen und den Opt-in-Link teilen. Er funktioniert, sobald der Track Veröffentlicht zeigt.
- Mindestens 12 Tester 14 Tage ohne Unterbrechung im Opt-in halten. Interne Tests zählen nicht, und wer austritt und wiederkommt, beginnt seine 14 Tage von vorn.
- Während des Tests mindestens ein Update veröffentlichen und notieren, was Tester gefunden und was du geändert hast.
- Produktionszugang beantragen: im Dashboard den Antrag öffnen und die drei Abschnitte zu deinem Test, deiner App und deiner Produktionsreife beantworten. Die Entscheidung trifft Google; niemand kann eine Freigabe garantieren.
Plane Ausfälle ein: Gewinne mehr als 12 Tester, damit ein Abgang deinen Zeitplan nicht verschiebt. Alle Play-Console-Schritte ansehen.
Die vollständige Play-Console-Anleitung
Geschlossener Track, Google Group und Opt-in-Link, die Regel 12 Tester / 14 Tage und der Produktionsantrag, Schritt für Schritt auf einer Seite.
Updates während des Tests ausliefern
Bei React Native: versionCode (und versionName) erhöhen, neu bauen und das neue Bundle in denselben geschlossenen Track hochladen.
cd android
./gradlew bundleReleaseDeinstalliere die Debug-App, bevor du die Release-Variante mit npm run android -- --mode="release" installierst; Android ersetzt keine App, die mit einem anderen Schlüssel signiert ist. Wiederhole diese Prüfung vor jedem Upload, denn reine Release-Probleme wie fehlende Keep-Regeln zeigen sich im Debug nie.
JavaScript-Updates over the air sind eine Grauzone, nach der viele Teams fragen. Laut der Google-Play-Richtlinie zu Geräte- und Netzwerkmissbrauch darf sich eine App nicht außerhalb von Google Play aktualisieren; die Einschränkung gilt aber nicht für Code, der in einer virtuellen Maschine oder einem Interpreter läuft, etwa JavaScript. Nativer Code, neue Berechtigungen und native Module brauchen immer ein neues Bundle über Google Play.
- Der geschlossene Track bleibt der Hauptweg. Ein neuer
versionCodeim geschlossenen Track erreicht jeden Tester mit Opt-in über Google Play und erscheint in deinem Release-Verlauf. - Native Abhängigkeiten nicht anfassen. Ein Upgrade von React Native oder einem nativen Modul mitten im Test ändert weit mehr als den Fehler, den du behebst. Mach das vor dem Test oder nach dem Produktionszugang.
- Eine Map pro Release aufbewahren. Jeder neue Build erzeugt eine neue Source Map. Speichere sie mit dem Versionscode, sonst lässt sich der nächste Absturzbericht dieser Version nicht entschlüsseln.
Häufige Fragen
Brauche ich Hermes für Google Play?
Nein, aber Hermes ist die Standard-Engine von React Native und die, mit der die meisten Apps ausgeliefert werden. Sie kompiliert JavaScript vorab zu Bytecode, was den Start beschleunigt und auch der Grund ist, warum Release-Stacktraces eine Source Map brauchen.
Welche Datei lade ich in die Play Console hoch?
Das Bundle unter android/app/build/outputs/bundle/release/app-release.aab. npx react-native build-android --mode=release führt die Gradle-Aufgabe bundleRelease aus und packt dein gesamtes JavaScript hinein.
Warum rutscht mein Layout nach dem Anheben von targetSdk unter die Statusleiste?
Apps, die auf Android 15 (API-Level 35) oder höher abzielen, werden randlos (edge to edge) gezeichnet. react-native-safe-area-context kümmert sich bereits darum; ohne die Bibliothek ergänzt du Safe-Area-Abstände auf jedem Bildschirm, bevor Tester ihn sehen.
Unterstützt React Native 16-KB-Speicherseiten?
Ja, seit React Native 0.77. Ältere Versionen und native Module mit eigenen .so-Dateien möglicherweise nicht. Aktualisiere vor dem Teststart, nicht mittendrin.
Quellen
Die technischen Details wurden mit der offiziellen Dokumentation unten abgeglichen. Menüs und Standardwerte ändern sich zwischen Versionen; im Zweifel gilt die offizielle Seite.
- React Native: Publishing to Google Play Store
- Android Developers: Sign your app
- Android Developers: Target API level requirements
- Android Developers: Support 16 KB page sizes
- React Native: Debugging release builds
- React Native 0.77 release notes (16 KB pages, edge-to-edge)
- Play Policy: Device and Network Abuse
- Play Console Help: App testing requirements for new personal developer accounts
- Play Console Help: Set up an open, closed, or internal test
- Play Console Help: Deobfuscate or symbolicate crash stack traces
Neu bei der Regel mit 12 Testern?
Der allgemeine Leitfaden erklärt Googles Anforderung, wie eine TestBunny-Kampagne Tag für Tag abläuft und was wir garantieren können und was nicht.
Allgemeinen Leitfaden lesen