NewPlatano

How React Native Builds Actually Work (APK, AAB, IPA, APP)

Beto, April 30, 2026 · 4,088 views

I explain how React Native build artifacts work for both Android and iOS platforms. You'll learn the differences between APK, AAB, IPA, and APP files, how to create them locally using native toolchains, and when to use each artifact type. If you want to ship React Native apps or understand the build process better, this video is for you.

You'll also learn the practical commands to generate release builds on your machine, the role of Gradle and Xcode build tools, and the limitations around building iOS apps on non-Mac machines. By the end, you'll have a clear mental model of React Native builds and how to produce them efficiently.

What's inside

  • Overview of React Native build artifacts: APK, AAB, IPA, and APP
  • Differences between Android APK and AAB files
  • Understanding iOS APP bundles and IPA files
  • How build artifacts relate to device installs and archive size
  • Building Android apps locally with Gradle wrapper commands
  • Building iOS apps locally using Xcode build CLI
  • Limitations of building iOS apps on Windows or Linux
  • Using Expo prebuild to generate native Android and iOS projects

Overview of React Native build artifacts: APK, AAB, IPA, and APP

React Native produces different types of build artifacts depending on the platform and build stage. For Android, the main artifacts are APK (Android Package) and AAB (Android App Bundle). APK is a self-contained installable file you can drop on any device. AAB is a bundle format used by Google Play to generate optimized APKs per device at install time.

On iOS, the APP bundle is the compiled app that runs on simulators or devices via Xcode. When ready to ship, the APP bundle is signed and packaged into an IPA file for distribution. These four artifact types represent the outputs of the build process and are essential for testing, sharing, and publishing your app.

Differences between Android APK and AAB files

The APK file is a complete installable package for Android devices. It contains all the app resources and code needed to run on any compatible device. The AAB file, on the other hand, is a publishing format for Google Play. You upload the AAB to the Play Store, and Google generates device-specific APKs to reduce download size.

In the video, the APK was about 138 MB, while the AAB was around 90 MB. The AAB is smaller because it defers device-specific optimization to Google Play. This means users don't download unnecessary resources, improving install size and efficiency.

Understanding iOS APP bundles and IPA files

For iOS, the APP bundle is the compiled app folder that runs on simulators or devices through Xcode. It is unsigned and mainly used for development and testing. When you want to distribute your app, you create an IPA file, which is a signed version of the APP bundle.

The IPA is the archive used for App Store submission or ad hoc distribution. I show how the APP bundle can be dragged into a simulator for testing, while the IPA is the final product for production installs. The IPA file size can be around 195 MB, but the actual installed size on a device is smaller due to Apple's optimization.

How build artifacts relate to device installs and archive size

The large archive sizes you see (APK, AAB, IPA) are not the actual sizes users install on their devices. These archives are the source of truth and contain all variants and resources. At install time, Apple and Google extract only the parts compatible with the user's device.

For example, an iPhone 17 Pro might install around 40 MB of the app, even if the IPA is 195 MB. This optimization reduces storage and download requirements. Understanding this helps set expectations about build sizes and what users experience.

Building Android apps locally with Gradle wrapper commands

To build Android artifacts locally, you navigate to the Android folder inside your React Native project. The Android project includes a Gradle wrapper, so you don't need to install Gradle globally. You run commands like:

  • to generate a release APK
  • to generate a signed AAB for Play Store

I show how the APK appears in the build outputs folder. The release APK is standalone and does not include Expo dev client tools, making it suitable for testing and distribution.

Building iOS apps locally using Xcode build CLI

For iOS, you open the iOS folder which contains a full Xcode project. You use the CLI tool to build your app. The command requires specifying the workspace, scheme, configuration (usually Release), and SDK (simulator or device).

Example command structure:

xcodebuild -workspace YourApp.xcworkspace -scheme YourApp -configuration Release -sdk iphonesimulator CODE_SIGNING_ALLOWED=NO

This produces an unsigned APP bundle you can install on simulators for testing. I also mention a blog post with a detailed guide on this process. This approach is more verbose than Android but essential for iOS development.

Limitations of building iOS apps on Windows or Linux

Apple requires Xcode to build iOS apps, and Xcode only runs on macOS. This means you cannot build iOS apps locally on Windows or Linux machines. If you don't have a Mac, you must use cloud build services like Expo Application Services (EAS) to build your iOS app remotely.

For Android, you can build on Windows, Linux, or Mac using Android Studio and Gradle. I strongly recommends getting a Mac if you plan to develop and build iOS apps locally.

Using Expo prebuild to generate native Android and iOS projects

If you use Expo, running generates native Android and iOS folders based on your dependencies and code. These folders contain the native projects needed for release builds.

This process turns your Expo-managed project into a bare React Native project with native code. You can then use Gradle and Xcode build tools to create APK, AAB, APP, and IPA artifacts. This is useful for customizing native code or producing release builds outside the Expo Go app.

Resources

CourseReact Native course

Let's connect!

Had a win? Get featured on Code with Beto.Share your story