A step-by-step guide for shipping a vibe-coded React Native or Expo app to Google Play from a Windows machine — covering tool installation, prebuild, signing, and the full Play Store submission process.
If you're using Lunadeck, the build and signing steps (Parts 4–6) are handled for you automatically. This guide is for building and publishing locally, or for understanding what Lunadeck does under the hood.
What you'll need before starting:
A Windows 10 or Windows 11 computer (64-bit)
At least 12 GB of free disk space
At least 8 GB of RAM (16 GB recommended — the Android emulator is a memory hog)
A credit/debit card ($25 one-time Google Play fee)
Your exported React Native / Expo project (ZIP from your AI coding tool, or a git clone)
About 2–4 hours for initial setup, then ~3 weeks for the publishing process
Part 1: Install the Required Tools
You need three things: Node.js, Java (JDK 17), and Android Studio.
1.1 Install Node.js (v18+)
Option A: Using nvm-windows (recommended)
nvm-windows lets you switch between Node.js versions. It's a separate project from the Linux/Mac nvm, same concept, different tool.
If you already have Node.js installed, uninstall it first via Settings > Apps. nvm-windows conflicts with existing installations.
The AppData folder is hidden by default. To see it in File Explorer, click View > Show > Hidden items (Windows 11) or View > Hidden items (Windows 10).
Press Win + S, search for "Environment Variables", and click "Edit the system environment variables"
Find Path under System variables, click Edit, and add:
%ANDROID_HOME%\platform-tools
%ANDROID_HOME%\tools
%ANDROID_HOME%\tools\bin
%ANDROID_HOME%\cmdline-tools\latest\bin
Click OK on everything
Restart your terminal and verify:
adb --version
Part 2: Export and Prepare Your Project
2.1 Get your project files
If your AI tool provides a ZIP export, download and unzip it:
mkdir C:\Users\YOUR_USERNAME\my-appcd C:\Users\YOUR_USERNAME\my-app# Windows 10 1803+ has tar built in:tar -xf %USERPROFILE%\Downloads\your-project.zip -C .
Or right-click the .zip in File Explorer and select "Extract All...".
The android.package value is permanent. Once you publish to Google Play, you cannot change it. Use a reverse-domain format: com.yourname.appname.
If android.package is missing, add it now.
3A.2 Run prebuild
Expo prebuild reads your app.json and generates the native android\ project:
npx expo prebuild --platform android
This creates the android\ directory. You only need to run this again if you change app.json, add or remove native packages, or want to regenerate the native project from scratch.
If android\ already exists, prebuild will ask if you want to overwrite it. Answer yes unless you've made manual changes to the native project — manual changes are not preserved through prebuild.
3A.3 Verify the generated project
After prebuild completes:
dir android\# Should contain: app\, build.gradle, gradlew.bat, settings.gradle, etc.
Part 3B: Bare React Native
Skip this if your project is Expo-managed.
3B.1 Verify the android directory
Your project should already have an android\ directory committed to it. Verify:
dir android\# Should contain: app\, build.gradle, gradlew.bat, settings.gradle, etc.
If there is no android\ directory, your project may actually be Expo — check whether "expo" is in your package.json dependencies and follow Part 3A instead.
3B.2 Install native dependencies
cd C:\Users\YOUR_USERNAME\my-appnpm install
For React Native 0.60+, autolinking handles most packages automatically. If any package requires manual linking, its documentation will say so.
Part 4: Test Your App
4.1 Start Metro and run on Android
Open two separate PowerShell windows:
Window 1 — Metro bundler:
cd C:\Users\YOUR_USERNAME\my-appnpx react-native start
Window 2 — launch on device/emulator:
cd C:\Users\YOUR_USERNAME\my-appnpx react-native run-android
4.2 Run on an emulator
In Android Studio:
Open Device Manager (phone icon with wrench)
Click Create Virtual Device, pick a Pixel device, and download a system image (API 34+)
Select the emulator from the device dropdown and click Run (▶)
Emulator performance on Windows: The Android emulator uses hardware acceleration via Intel HAXM or Windows Hypervisor Platform (WHPX). If it's extremely slow, make sure hardware virtualization is enabled in your BIOS/UEFI (usually "Intel VT-x" or "AMD-V"). Enable Windows Hypervisor Platform in Windows Features: Settings > Apps > Optional features > More Windows features.
4.3 Run on a physical device
Enable Developer Options: Settings > About Phone > tap "Build Number" 7 times
Enable USB Debugging: Settings > Developer Options > USB Debugging
Connect via USB and accept the debugging prompt
Select your device in Android Studio and click Run, or run npx react-native run-android
4.4 Common issues
Metro bundler not starting — make sure it's running in a separate terminal window with npx react-native start.
"SDK location not found" — ANDROID_HOME is not set. Follow Part 1.3 Step 4 and restart your terminal. You can also create android\local.properties with:
If keytool is not recognized: Java's bin directory isn't in your PATH. Fix your JAVA_HOME and PATH (see Part 1.2), or use the full path. In PowerShell:
Back up this keystore file and both passwords. Losing it means you can never update your app on Google Play. Store a copy in a password manager and on external storage.
6.2 Configure Gradle signing
Create android\keystore.properties (do NOT commit this to git — add it to .gitignore):
cd C:\Users\YOUR_USERNAME\my-app\android.\gradlew.bat bundleRelease
Windows difference: On Linux/macOS the command is ./gradlew bundleRelease. On Windows it's .\gradlew.bat bundleRelease. In Command Prompt (no .\ needed): gradlew bundleRelease.
If the build fails — read the error output carefully. Common causes: missing SDK components (fix in SDK Manager), Gradle version mismatch (don't upgrade when prompted), or Java version issues (confirm JDK 17 is installed and JAVA_HOME points to it).
Choose Personal or Organization account (Personal is fine for indie developers)
Pay the one-time $25 USD registration fee
Complete identity verification
Wait 24–48 hours for activation
Personal accounts created after November 2023 require a device verification step. Install the Google Play Console mobile app on an Android device, sign in with the same Google account, and follow the verification steps.
Part 8: The Closed Testing Requirement
New personal developer accounts cannot publish directly to production. Google requires:
Uploading your app to a closed test track
Having at least 12 testers opted in
Those testers must remain opted in for 14 consecutive days
Only then can you apply for production access
8.1 Create your app listing
In Google Play Console, click Create app and work through all required sections:
Store listing — app description, at least 2 phone screenshots, 1024×500 feature graphic, 512×512 icon, category, contact details
Content rating — complete the IARC questionnaire honestly
Target audience — if not specifically for children, do not select children as target
Privacy policy — required if your app collects any user data; a simple page on GitHub Pages or Notion works
8.2 Set up closed testing and upload your build
Go to Testing > Closed testing in the left sidebar
Under Testers, create a list with at least 12 Gmail addresses
Click Create new release, accept Play App Signing, and upload your .aab file
Add release notes and click Start rollout
Share the generated opt-in link with your testers
Testers must click the link on an Android device, accept the invitation, and install the app. After 14 days with all testers opted in, you can apply for production access from the app Dashboard.
Part 9: Publish to Production
Once you have production access:
Go to Production > Create new release
Upload your .aab file
Add release notes and select distribution countries
Click Start rollout to production
First-submission review typically takes a few hours to several days. If approved, your app goes live.
Part 10: Updating Your App
Expo projects:
# 1. Make your code changes# 2. If you changed app.json or added/removed native packages:npx expo prebuild --platform android# 3. Bump versionCode in android\app\build.gradle# 4. Build the new bundlecd android.\gradlew.bat bundleRelease# 5. Upload the new .aab in Google Play Console
Bare React Native:
# 1. Make your code changes# 2. Bump versionCode in android\app\build.gradle# 3. Build the new bundlecd android.\gradlew.bat bundleRelease# 4. Upload the new .aab in Google Play Console
"SDK location not found" — ANDROID_HOME is not set. Follow Part 1.3 Step 4, restart your terminal, or create android\local.properties with sdk.dir=C:\\Users\\YOUR_USERNAME\\AppData\\Local\\Android\\Sdk.
"JAVA_HOME is not set" or "java is not recognized" — Add JAVA_HOME as a system environment variable pointing to your JDK (e.g., C:\Program Files\Eclipse Adoptium\jdk-17.0.x-hotspot) and add %JAVA_HOME%\bin to Path.
Gradle fails with "Could not determine java version" — multiple Java versions installed. Make sure JAVA_HOME points specifically to JDK 17.
.\gradlew.bat not recognized — make sure you're in the android\ directory. In PowerShell use .\gradlew.bat; in Command Prompt just gradlew bundleRelease.
keytool not recognized — Java's bin folder is not in your PATH. Fix your PATH or use the full path to keytool.exe as shown in Part 6.1.
Long path errors — Android projects can exceed Windows' default 260-character path limit. Enable long paths in PowerShell (as Admin):
Emulator is extremely slow — enable hardware virtualization in BIOS/UEFI (Intel VT-x or AMD-V), then enable Windows Hypervisor Platform in Windows Features.
npx expo prebuild fails — check for missing android.package in app.json, run npm install first, and check for dependency version conflicts.
App shows red error screen — a JavaScript error, not a build error. Read the message on screen — it names the file and line. Fix it and reload (r in the Metro terminal).
Realistic Expectations
The timeline is longer than you expect. Between the 14-day testing requirement, Google's review process, and debugging, plan for 3–4 weeks from start to live.
AI-generated React Native code often has issues the AI couldn't test. Red screens, missing permissions, and native module errors are common. Budget time for debugging — it's normal.
Google can reject your app. Common reasons: missing privacy policy, misleading store listing, or the app crashing during review. Read Google's developer policies before submitting.
Finding 12 testers is harder than it sounds. Start recruiting before you finish building. Developer communities on Discord and Reddit (r/reactnative, r/androiddev, r/betatesting) organize tester exchanges.