Skip to content

How to Publish a React Native App on Google Play

Build a signed release AAB for a bare React Native app: upload keystore, gradle.properties, bundleRelease, Hermes, ProGuard and getting it into a closed test.

Updated 3 min readBy the TestersZone team

Short answer

Generate an upload keystore, put its path and passwords in android/gradle.properties (or a safer secrets file), add a release signingConfig in android/app/build.gradle, then run ./gradlew bundleRelease inside android/. Upload android/app/build/outputs/bundle/release/app-release.aab to a closed track.

Using Expo?

If your project uses Expo (managed or with EAS), follow publish an Expo app instead. This guide is for the bare React Native CLI workflow.

1. Application ID and version

In android/app/build.gradle set applicationId (permanent), versionCode (bump every upload) and versionName (shown to users).

2. Upload keystore

Create a keystore with keytool and keep it outside the repo. React Native’s “Publishing to Google Play Store” docs suggest putting the store file name, alias and passwords in android/gradle.properties as MYAPP_UPLOAD_* variables. Better still, keep the passwords in ~/.gradle/gradle.properties or environment variables so they’re not committed.

3. Signing config

Add a release entry under signingConfigs in android/app/build.gradle that reads those variables, and point buildTypes.release.signingConfig to it. The React Native docs show the snippet.

4. Build

From the android folder run ./gradlew bundleRelease. The bundle lands at android/app/build/outputs/bundle/release/app-release.aab.

Test the release build on a device before uploading (npx react-native run-android --mode release, or the equivalent for your RN version). Release-only bugs are common.

5. React Native gotchas

SymptomLikely cause
Crash on launch in release onlyMissing ProGuard/R8 keep rules for a native module
Blank screen in releaseJS bundle not included, or an exception swallowed in production
Debug-only network configCleartext HTTP blocked in release. Use HTTPS
Old targetSdkUpgrade React Native. Since August 31, 2026 you need API 36. See target API 36

6. Crash reporting before testers arrive

Add a crash reporter (Crashlytics or Sentry) so tester crashes come with stack traces. See add Crashlytics to your test build.

After the bundle is built: same path for every app

  1. Create the app in Play Console and complete the store listing and App content. See does a closed test need a store listing.
  2. Upload the .aab to a closed testing track (internal first is optional). See upload your first AAB.
  3. Attach a tester list and publish. Share the opt-in link.
  4. On a new personal account: keep 12+ testers opted in for 14 days, then apply for production access.

Frequently asked questions

Is Hermes required?

No, but it’s the default JavaScript engine in recent React Native versions and usually improves startup and memory use.

How do I test the exact release build?

Build the release variant and install it on a device (bundletool can turn your .aab into installable APKs). Release-only bugs are common, so test before uploading.

Can CI build my React Native bundle?

Yes. Store the keystore and passwords as CI secrets and run the Gradle bundleRelease task. Never commit the keystore.

Sources and how we keep this accurate

Policy facts are checked against Google's own documentation on the date shown above. Google can change requirements at any time, so confirm in your Play Console. Where we give advice or estimates rather than Google's rules, we say so. TestersZone is independent and not affiliated with Google. Drafts are AI-assisted and reviewed by our team.

Need 12 testers? Get them free.

Test 3 apps, earn 60 credits, and list your app for up to 20 real testers with verified daily check-ins.

Start free

Keep reading

Browse all guides, or see the quick answers, guides and comparisons.