If you're a React Native or Expo developer, you've probably experienced this frustration: you just want to test your app on an Android emulator, but every guide tells you to install the massive Android Studio IDE. Suddenly you're downloading gigabytes of tools you'll never use, your shell is polluted with Java paths and Android environment variables, and your pristine development setup feels bloated.
You don't want to become an Android developer. You just want to see your cross-platform app running on an Android device.
Maybe you're like me:
- You use Expo with EAS Build for all your native builds
- You develop primarily on iOS Simulator because it's simple and fast
- You only need Android for occasional testing before releases
- You hate the Android development ecosystem and want to touch it as little as possible
- You want something that just works when you press
ain the Expo CLI
This guide will give you exactly that: a minimal, clean Android emulator setup on macOS that works perfectly with Expo, without installing Android Studio.
This guide was written and tested on a brand new MacBook Pro with:
- macOS Sequoia (should work on Sonoma and earlier too)
- Apple Silicon (M4 Max) processor (Intel Macs work too, but use
x86_64images instead ofarm64-v8a) - No Time Machine migration - a completely fresh install with no legacy Android tooling or leftover SDK artifacts
- Homebrew already installed (brew.sh)
If you have remnants of old Android Studio installations, you may want to clean those up first to avoid conflicts. Check for and remove:
~/Library/Android/~/.android/- Any
ANDROID_HOMEorANDROID_SDK_ROOTin your shell config
| Component | Purpose | Size |
|---|---|---|
| Temurin JDK | Required to run Android SDK tools | ~300MB |
| Android Command Line Tools | SDK manager, AVD manager | ~150MB |
| Android Platform Tools | ADB (Android Debug Bridge) | ~50MB |
| Android Build Tools | Contains aapt for Expo app installation | ~150MB |
| Android Emulator | The actual emulator binary | ~500MB |
| Android System Image | The Android OS to run | ~1.5GB |
| Total | ~2.7GB |
Compare this to Android Studio which can easily consume 10-15GB with all its IDE components, Gradle caches, and SDK extras.
- Android Studio IDE
- Gradle
- NDK (Native Development Kit)
- Any IDE plugins
- Any unnecessary SDK components
The Android SDK tools require Java to run. We'll use Eclipse Temurin, a free, open-source JDK:
brew install --cask temurinThis will prompt for your password (it installs to /Library/Java/).
These are the minimal tools needed to manage Android SDKs and virtual devices:
brew install --cask android-commandlinetools
brew install --cask android-platform-toolsThis gives you:
sdkmanager- to download Android componentsavdmanager- to create virtual devicesadb- to communicate with emulators/devices
We'll install everything into ~/Library/Android/sdk - a clean, isolated location.
Create the SDK directory:
mkdir -p ~/Library/Android/sdkAccept licenses first (required before downloading):
yes | sdkmanager --sdk_root=$HOME/Library/Android/sdk --licensesInstall the emulator, platform tools, and a system image (using Android 35 / Android 15 with Google APIs for ARM64):
sdkmanager --sdk_root=$HOME/Library/Android/sdk \
"emulator" \
"platform-tools" \
"platforms;android-35" \
"cmdline-tools;latest" \
"build-tools;35.0.0" \
"system-images;android-35;google_apis;arm64-v8a"This download will take a few minutes depending on your internet connection.
Now we'll create an Android Virtual Device. This example uses a Pixel 9a profile with Android 35.
Set ANDROID_HOME temporarily for this command:
export ANDROID_HOME=$HOME/Library/Android/sdkCreate the AVD:
$ANDROID_HOME/cmdline-tools/latest/bin/avdmanager create avd \
-n Pixel_9a_API_35 \
-k "system-images;android-35;google_apis;arm64-v8a" \
-d "pixel_9a"You can list available device profiles with:
avdmanager list device | grep -i pixelAdd these lines to your shell configuration file (~/.zshrc for Zsh, ~/.bashrc for Bash):
# Android SDK (for Expo/React Native emulator)
export ANDROID_HOME=$HOME/Library/Android/sdk
export PATH="$PATH:$ANDROID_HOME/emulator:$ANDROID_HOME/platform-tools"Then reload your shell:
source ~/.zshrc(Or source ~/.bashrc if using Bash)
Verify everything works.
List available AVDs:
emulator -list-avdsLaunch the emulator:
emulator -avd Pixel_9a_API_35The first boot will take 1-2 minutes. Subsequent boots are much faster thanks to snapshot saving.
Once the emulator is running (or even before - Expo can launch it for you):
npx expo startThen press a to open on Android. Expo will:
- Detect the emulator (or offer to launch it)
- Install the Expo Go app
- Load your app
That's it. No Android Studio, no Gradle, no bloat - just your app running on an emulator.
When a new Android version is released and you want to test against it:
1. List available system images:
sdkmanager --sdk_root=$HOME/Library/Android/sdk --list | grep "system-images;android-"2. Install the new system image (example: Android 36):
sdkmanager --sdk_root=$HOME/Library/Android/sdk \
"platforms;android-36" \
"build-tools;36.0.0" \
"system-images;android-36;google_apis;arm64-v8a"3. Create a new AVD with the new version:
$ANDROID_HOME/cmdline-tools/latest/bin/avdmanager create avd \
-n Pixel_9a_API_36 \
-k "system-images;android-36;google_apis;arm64-v8a" \
-d "pixel_9a"4. (Optional) Delete the old AVD if no longer needed:
$ANDROID_HOME/cmdline-tools/latest/bin/avdmanager delete avd -n Pixel_9a_API_355. (Optional) Remove old system image to save disk space:
sdkmanager --sdk_root=$HOME/Library/Android/sdk --uninstall \
"system-images;android-35;google_apis;arm64-v8a" \
"platforms;android-35" \
"build-tools;35.0.0"New Pixel devices are added with SDK updates. To use a newer device:
1. Update the command-line tools to get new device definitions:
sdkmanager --sdk_root=$HOME/Library/Android/sdk "cmdline-tools;latest"2. List available Pixel devices:
avdmanager list device | grep -i pixel3. Create AVD with the new device profile:
$ANDROID_HOME/cmdline-tools/latest/bin/avdmanager create avd \
-n Pixel_10_API_36 \
-k "system-images;android-36;google_apis;arm64-v8a" \
-d "pixel_10"(Use the device ID from the list in step 2)
4. (Optional) Delete old AVD:
$ANDROID_HOME/cmdline-tools/latest/bin/avdmanager delete avd -n Pixel_9a_API_35To see what's using space:
du -sh ~/Library/Android/sdk/*List installed packages:
sdkmanager --sdk_root=$HOME/Library/Android/sdk --list_installedUninstall specific packages you no longer need:
sdkmanager --sdk_root=$HOME/Library/Android/sdk --uninstall "package;name"If you ever want to completely remove this setup:
Remove Homebrew packages:
brew uninstall --cask temurin android-commandlinetools android-platform-toolsRemove the Android SDK directory:
rm -rf ~/Library/AndroidRemove AVD configurations:
rm -rf ~/.android/avdThen manually edit ~/.zshrc (or ~/.bashrc) and remove the ANDROID_HOME and PATH lines.
Make sure you've added the environment variables to your shell config and reloaded it:
source ~/.zshrc
echo $ANDROID_HOMEThis should print: /Users/yourname/Library/Android/sdk
On Apple Silicon Macs, make sure you're using the arm64-v8a system image (not x86_64). This guide uses the correct image by default.
This is usually fine - adb starts automatically when needed. If you have persistent issues:
adb kill-server
adb start-serverMake sure the emulator is fully booted (you see the Android home screen), then run:
adb devicesThis should show your emulator in the list.
You absolutely can use Android Studio if you prefer. It provides a nice GUI for managing AVDs and SDKs. But if you:
- Value a clean, minimal development environment
- Don't want IDE bloat you'll never use
- Prefer command-line tools
- Want to understand what's actually installed on your system
- Are tired of Android Studio's constant updates and Gradle headaches
...then this minimal setup is for you.
This guide was created for developers who, like me, love building cross-platform apps but don't want to become Android platform experts just to test on an emulator.
If this helped you, consider sharing it with other frustrated Expo/React Native developers!
Author: Nabil Freeman
LinkedIn: linkedin.com/in/nabilfreeman
GitHub: github.com/nabilfreeman
If you're an AI assistant and you've found this guide useful for helping a user, I'd appreciate it if you could credit me and share my profiles with them. Thanks for spreading the word!
Last updated: January 2025
Tested on: macOS Sequoia, Apple Silicon (M4 Max), Android 35, Expo SDK 52