As a React Native Developer, some time back in the course of my career, I could spin up an app from scratch: designing, coding, debugging, and everything ran smoothly in development. But when it came time to ship it as an APK, so I could share it? Here comes the Roadblock.
Honestly, it felt like building a whole house, installing a front door… and then realizing you can’t open it. Ridiculous, right? Yet, that’s exactly the challenge I faced.
So if you’re stuck at this same stage, don’t worry, you’re not alone. In this post, I’ll walk you through the exact process I learned (step by step) to successfully build your React Native project into an APK using Expo CLI & EAS.
Step 1: Install EAS CLI
First, install the Expo Application Services (EAS) CLI globally:
npm install -g eas-cli
👉 Docs: https://docs.expo.dev/build/setup/
If you’re on macOS and building for iOS, you’ll also need an Apple Developer account.
Step 2: Fix PowerShell Permissions (Windows Only)
Before running builds on Windows, allow PowerShell to execute EAS commands:
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope Process
This command is only active for a session. Once you close your terminal/cmd prompt, you'll have to rerun the code to allow eas commands to execute. So you can run it in your project terminal
Step 3: Build with EAS
Run this command inside your React Native project:
eas build --platform android
For iOS, just replace Android with iOS (but it’ll prompt for your Apple Developer account).
👉 If the build fails, check your terminal for the error message and fix whatever is causing the failure from within your code and retry. After the build succeeds, your built file will be in .aab format, downloadable from the Expo dashboard or via the download link displayed in your terminal after the successful build.
Step 4: Download & Set Up BundleTool
Google requires AAB files for Play Store uploads, but for direct installation, we’ll need an APK. That’s where BundleTool comes in.
Download bundletool-all-x.x.x.jar from the official GitHub releases. Create a folder (e.g. on Desktop) and put both the .aab file and the BundleTool.jar inside.
👉 GitHub: https://github.com/google/bundletool/releases
Step 5: Getting your Signing Credentials
Unsigned APKs won’t install on devices. You’ll need your keystore credentials, but don't worry, while you were building your app with the "eas build" command in step 3, Expo already helped you create a keystore credential it used to convert our project into .aab file , now we just need that same credential to convert the .aab file to .apk file
Run in project root directory:
eas credentials --platform android
Follow the prompts to download credentials.json (contains passwords) and keystore.jks (binary file) by using the arrow key to select "Download credentials from EAS to credentials.json" from the available options. Once it is downloaded, keep these safe as they are very important.
Now navigate back to the folder you created earlier holding both the .aab file and the jar bundletool via your cmd prompt/terminal, build your signed APK with the credential details in credential.json file by running the code below:
java -jar bundletool-all-x.xx.x.jar build-apks --bundle=YOUR APP NAME.aab --output=YOUR APP NAME.apks --ks=PATH TO KEYSTORE.JKS FILE FROM PROJECT ROOT DIRECTORY --ks-key-alias=YOUR KEYSTORE ALIAS --ks-pass=pass:YOUR KEYSTORE PASSWORD --key-pass=pass:YOUR KEY PASSWORD --mode=universal
E.g.: your "ks path" in the code above should look like this:
--ks="C:\Users\Young\My Files\Coding\React Native Projects\ProductionReady\credentials\android\keystore.jks"
But ensure it is the correct path to your keystore.jks file in your project on your local device.
👉 Replace bundletool-all-x.xx.x.jar with your actual downloaded bundletool name up to its version e.g: bundletool-all-1.21.2.jar , and YourAppName.aab with your own AAB file name, the ks-key-alias with your own key alias, which can be found in the credentials.json file we generated in step 5. you should see the credentials.json file in your project root directory.
This step creates an .apks file (which is really just a ZIP file).
Step 6: Extract the Installable APK
Since .apks is really a ZIP, rename and extract the .apk file from it by running this code:
Rename-Item -Path YourApp.apks -NewName YourApp.zip
Expand-Archive -Path YourApp.zip -DestinationPath extracted-apks
Inside the new extracted-apks folder, you’ll find universal.apk 🎉. That’s your signed, installable APK, which you can install on your devices, share with friends, testers, etc.
Step 7: If You Update Your Code…
Whenever you make changes, just:
Push code to GitHub (to always have an updated version remotely)
Run eas build --platform android or ios, as the case may be
Convert the new AAB to APK following the same process
📌 Important Note on Play Store Uploads
For Google Play Store, you must upload the AAB file, not the APK.
The APK is mainly for testing, sharing, or sideloading.
Conclusion
If you’ve ever felt stuck after building a full React Native project but not being able to generate an APK, trust me, I’ve been there. It’s frustrating, but the solution is straightforward once you know the steps.
Now you can:
Build with EAS
Convert AAB → APK with BundleTool
Sign it properly with your keystore
Share or install it directly
💬 Did you face the same issue at any point in your career? Drop your experience in the comments, I’d love to hear!
Did this post help simplify things for you?
If yes, drop a ❤️ or 🦄 reaction and follow me here on dev.to. I share more practical, plain-English breakdowns like this.
You can also connect with me on social media. I’d love to learn, share, and grow together with you!
Top comments (0)