Back to Blog

Setting Up Dev Mode for React Native with Expo SDK 56 and EAS

June 30, 20267 min read
React NativeExpoExpo SDK 56EASMobile DevelopmentAndroid

Setting Up Dev Mode for React Native

A practical step-by-step guide to setting up an Expo Development Build with Expo SDK 56 and EAS so you can run your React Native app on a real Android device during development.

Written for someone new to the React Native ecosystem but already comfortable with modern web tooling.

Recently I installed React Native, and the newest version, SDK 56, doesn't work particularly well with Expo Go. In all honesty, the documentation does mention that Expo Go is intended primarily for practice. As a beginner, though, you can understand the frustration.

I had to work through a number of hitches before I finally got everything working. This is the version of the setup guide I wish I'd had.

For this tutorial, we will be setting up for Android.

A development build is built once per native-module change (so typically very few times during a project's lifetime), and from then on the daily workflow is identical to Expo Go: run Metro, scan a QR code, and enjoy live reload.


Step 1 - Install expo-dev-client

npx expo install expo-dev-client

Always use npx expo install (not npm install) for expo-* packages.

The wrapper picks the version that matches your Expo SDK. Plain npm install grabs the absolute latest version, which may be ahead of what your SDK expects.

This package is what makes the resulting APK a development client (Metro connection, dev menu, fast refresh) instead of a release-style build.


Step 2 - Create a Free Expo Account

Go to expo.dev/signup and create an account if you don't already have one.

Pick your username carefully—it becomes part of your project URLs and isn't easily changed later.


Step 3 - Install eas-cli and Log In

npm install -g eas-cli

eas login

eas whoami

Verify this prints your username.

eas login prompts for your Expo email/username and password.


Step 4 - Link the Project to Your Expo Account

eas init

This creates an entry for your project on the Expo dashboard and writes a projectId UUID into your app.json under extra.eas.projectId.

It also adds:

  • "owner": "<your-username>"
  • An Android package field

The default package is usually:

com.anonymous.<name>

Change it immediately.

The Android package name is permanent on the Play Store, and installed development builds with different package names don't replace each other on your phone. You'll end up with duplicate apps.

Use a reverse-domain format that you control or could plausibly own:

"android": {
  ...
  "package": "com.yourdomain.yourapp"
}

Step 5 - Create eas.json

eas build:configure -p android

This generates an eas.json file with three build profiles:

  • development
  • preview
  • production

Open the file and edit the development profile to explicitly produce an APK rather than an Android App Bundle (.aab), which cannot be sideloaded.

This is usually already the default, but why risk it?

{
  "cli": {
    "version": ">= 20.3.0",
    "appVersionSource": "remote"
  },
  "build": {
    "development": {
      "developmentClient": true,
      "distribution": "internal",
      "android": {
        "buildType": "apk"
      }
    },
    "preview": {
      "distribution": "internal"
    },
    "production": {
      "autoIncrement": true
    }
  },
  "submit": {
    "production": {}
  }
}

The Key Fields

  • developmentClient: true — makes the APK a Metro-connecting development client. Without this, you'll build a release-style app.
  • distribution: "internal" — produces a sideloadable APK with a public download URL rather than a Play Store submission.
  • android.buildType: "apk" — explicitly outputs an APK instead of an AAB.

Leave production as .aab—that's what the Play Store requires.


Step 6 - Run the First Build

eas build --profile development --platform android

The CLI walks through several phases.

Credentials Prompt (First Build Only)

You'll be asked:

"Generate a new Android Keystore?"

Answer YES.

The keystore is a cryptographic file Android uses to sign your app. EAS manages it on their servers (encrypted and backed up).

It's permanent: if you lose the keystore for a published app, you can never update that app on the Play Store again.

EAS-managed credentials are the safe default.

You can later download a backup with:

eas credentials

Upload Phase

This typically takes 10–60 seconds.

EAS compresses your project (excluding node_modules) and uploads it to Expo's cloud.

Queue + Build

This usually takes 5–15 minutes, depending on queue times.

You'll receive a URL similar to:

https://expo.dev/accounts/<you>/projects/<app>/builds/<uuid>

You can watch the live build logs there.

You don't need to keep your terminal open—EAS will email you when the build completes.

When finished, the CLI prints:

  • A download URL
  • A QR code for installing the Android APK

Step 7 - Install on Your Android Device

Scan the QR code with your phone's Camera app.

Not Expo Go.

At this point, Expo Go is no longer relevant.

The Camera app detects the URL, opens it in your browser, and downloads the APK.

When the download finishes, Android will likely display:

"For your security, your phone currently isn't allowed to install unknown apps from this source."

Tap Settings, then enable:

Allow from this source

for whichever browser handled the download.

This is a one-time setup per browser.

After that, future builds install with a single tap.

The installed app appears in your app drawer using the name specified in your app.json.


Step 8 - Connect the Dev Build to Metro

npx expo start --dev-client

The --dev-client flag is essential.

Without it, Metro starts in Expo-Go mode, and the QR code won't work with your development build.

Inside the development build app on your phone:

If You're on the Same Wi-Fi Network

The app should automatically detect the running Metro server.

Simply tap to connect.

If You're on a Different Network (or Auto-Detection Fails)

Run:

npx expo start --dev-client --tunnel

This is slower because it adds an extra network hop, but it works reliably across different networks.

Once connected, your JavaScript bundle loads onto the device.

Fast Refresh now works exactly as expected:

  • Edit code
  • Save
  • See the changes instantly on your phone

When to Rebuild vs. Just Refresh

This is probably the most useful efficiency rule to internalize.

ChangeAction Needed
JS code, JSX, styling, business logicNone — Fast Refresh handles it
Adding/removing native modules (npx expo install)Rebuild via eas build --profile development --platform android
app.json changes (permissions, icons, package name)Rebuild
eas.json profile changesRebuild

In practice, 95% of your daily edits never trigger a rebuild.

You only re-run eas build when you've changed something native.


When to Rebuild vs. Just Refresh

This is probably the single most useful rule to remember when working with an Expo development build.

Most of the time, you do not need to create a new build. As long as you're only changing JavaScript code, Metro's Fast Refresh handles everything automatically.

JavaScript/TypeScript, JSX, styling, or business logic

Action: Nothing.

Fast Refresh automatically updates the app on your device.

Installing or removing native modules (for example, using npx expo install)

🔨 Action: Rebuild your development client.

Run:

eas build --profile development --platform android

Changes to app.json

Examples include:

  • Permissions
  • App icon
  • Splash screen
  • App name
  • Package name

🔨 Action: Rebuild your development client.

Changes to eas.json

🔨 Action: Rebuild your development client.

Build profile changes only take effect after creating a new build.

Rule of Thumb

If your change only affects JavaScript, don't rebuild—just save your file and let Fast Refresh do the work.

If your change affects the native app in any way (native modules, app configuration, permissions, icons, package name, or build configuration), create a new development build.

In practice, more than 90% of your day-to-day development doesn't require rebuilding. Your workflow is usually as simple as:

  1. Start Metro.
  2. Edit your code.
  3. Save.
  4. Watch Fast Refresh update the app instantly.

Reserve eas build for the relatively rare occasions when you've changed something native.

👨‍💻

Asiedu Saah

Senior Fullstack Engineer