Skip to main content

Overview

This guide covers deploying Quest Hunter to Android using Expo Application Services (EAS). You’ll learn how to create builds, submit to Google Play Store, and distribute APK files.

Prerequisites

  • Google Play Console account ($25 one-time fee)
  • EAS CLI installed and configured
  • Project environment variables configured
  • Payment profile set up in Google Play Console
Quest Hunter’s Android package name is com.levinbaenninger.questhunter. You’ll need to use this package name in Google Play Console or change it in app.json.

Android Configuration

App Configuration

Quest Hunter is configured with the following Android settings in app.json:
"android": {
  "package": "com.levinbaenninger.questhunter",
  "permissions": [
    "android.permission.ACCESS_FINE_LOCATION",
    "android.permission.ACCESS_COARSE_LOCATION"
  ],
  "adaptiveIcon": {
    "backgroundColor": "#E6F4FE",
    "foregroundImage": "./assets/images/android-icon-foreground.png",
    "backgroundImage": "./assets/images/android-icon-background.png",
    "monochromeImage": "./assets/images/android-icon-monochrome.png"
  },
  "config": {
    "googleMaps": {
      "apiKey": "AIzaSyC0_rhFvjF2ui609lI7IYaUGmuOptp5Xp0"
    }
  },
  "edgeToEdgeEnabled": true,
  "predictiveBackGestureEnabled": false
}

Key Features

  • Location Permissions: Required for map and quest features
  • Adaptive Icon: Supports Android 8.0+ adaptive icons with foreground, background, and monochrome variants
  • Google Maps Integration: Configured with API key
  • Edge-to-Edge Display: Modern Android UI with edge-to-edge content
  • New Architecture: Enabled for improved performance
The Google Maps API key should be restricted to your app’s package name in Google Cloud Console for security. Generate your own key before production deployment.

Building for Android

Development Build

For local development and testing:
1

Build development APK

Create a development build with dev client:
eas build --profile development --platform android
This creates an APK with:
  • Development client enabled
  • Internal distribution
  • Debugging capabilities
2

Install on device

After the build completes, install on your Android device:
# Download the APK
eas build:download --platform android --profile development

# Install via ADB
adb install path/to/your-app.apk
Or scan the QR code from EAS build page to download directly on device.
3

Run the app

Start the development server:
bun dev
Or run directly on Android:
bun run android
# or
expo run:android

Preview Build

For internal testing before production:
eas build --profile preview --platform android
This creates an internal distribution build suitable for:
  • Internal team testing
  • QA verification
  • Stakeholder demos

Production Build (AAB for Play Store)

1

Configure credentials

Set up Android keystore with EAS:
eas credentials
Select Android and let EAS manage your keystore, or upload your own.
EAS can automatically generate and manage your Android keystore. This is recommended for most projects.
2

Create production build

Build Android App Bundle (AAB) for Google Play:
eas build --profile production --platform android
The production profile has autoIncrement: true, automatically incrementing the version code.
3

Monitor build progress

Track your build:
eas build:list --platform android
Or visit: https://expo.dev/accounts/[your-account]/projects/quest-hunter/builds

Submitting to Google Play Store

First-Time Setup

1

Create app in Google Play Console

  1. Go to Google Play Console
  2. Click “Create app”
  3. Enter app details:
    • App name: Quest Hunter
    • Default language: English (United States)
    • App/Game: App or Game (your choice)
    • Free/Paid: Free or Paid
  4. Accept declarations
2

Configure app details

Complete all required sections in Google Play Console:
  • App content: Privacy policy, ads declaration, target audience
  • Store presence: App details, graphics, categorization
  • Countries/regions: Select where to distribute
  • Content rating: Complete questionnaire
3

Submit first build

Use EAS to submit your production build:
eas submit --platform android
EAS will prompt you to:
  • Select the build to submit
  • Enter Google Service Account credentials (first time)
  • Choose release track (internal, alpha, beta, or production)

Service Account Setup

For automated submissions, configure a Google Service Account:
1

Create service account

  1. Go to Google Cloud Console
  2. Create a new project or select existing
  3. Enable Google Play Android Developer API
  4. Create service account with Play Console access
2

Download credentials

Download the JSON key file for your service account.
3

Configure EAS

eas submit --platform android
Select “Provide a path to a Google Service Account JSON file” and upload your credentials.

Release Tracks

Internal Testing

Quick distribution to up to 100 testers:
eas submit --platform android --track internal
  • No review required
  • Instant availability
  • Ideal for team testing

Closed Testing (Alpha/Beta)

For larger test groups:
# Alpha track
eas submit --platform android --track alpha

# Beta track (can have multiple groups)
eas submit --platform android --track beta
  • Requires review (usually faster than production)
  • Can have multiple tester lists
  • Collect feedback before production

Production Release

Full public release:
eas submit --platform android --track production
Production releases require full review by Google Play. Review times typically range from a few hours to several days.

APK Distribution (Outside Play Store)

For direct APK distribution:
1

Build APK

Use the preview profile to generate an APK:
eas build --profile preview --platform android
2

Download APK

eas build:download --platform android --profile preview
3

Distribute APK

Users must:
  1. Enable “Install from Unknown Sources” on their device
  2. Download and install the APK
  3. Accept security warnings
Direct APK distribution is useful for enterprise deployment or beta testing, but Google Play distribution is recommended for public releases.

Updating the App

Version Management

Update version in app.json:
{
  "expo": {
    "version": "1.0.1"
  }
}
The Android version code is automatically incremented by EAS when using the production profile. You only need to update the version name for new releases.

Release Update

1

Update version

Increment version in app.json:
"version": "1.1.0"
2

Build and submit

# Build new version
eas build --profile production --platform android

# Submit to Google Play
eas submit --platform android
3

Publish update

In Google Play Console:
  1. Review the new release
  2. Add release notes
  3. Choose rollout percentage (optional)
  4. Send for review

Over-the-Air Updates (OTA)

For JavaScript and asset changes without rebuilding:
# Publish an update
eas update --branch production --message "Bug fixes and improvements"
OTA updates only work for JavaScript and asset changes. Native code changes (permissions, dependencies, etc.) require a new build and submission to Google Play.

Google Play Store Assets

Required Assets

Adaptive Icon Components
  • Foreground: ./assets/images/android-icon-foreground.png
  • Background: ./assets/images/android-icon-background.png
  • Monochrome: ./assets/images/android-icon-monochrome.png
Requirements:
  • 512x512 pixels
  • PNG format (32-bit)
  • Foreground should fit within safe zone (central 108x108 dp)

Store Listing Content

Prepare the following:
  • Short description: Up to 80 characters
  • Full description: Up to 4000 characters
  • App category: Choose appropriate category
  • Content rating: Complete IARC questionnaire
  • Privacy policy URL: Required for apps that access location

Permissions and Privacy

Location Permissions

Quest Hunter requires location permissions. In Google Play Console:
  1. Navigate to App content > Privacy policy
  2. Provide privacy policy URL
  3. In Data safety section, declare:
    • Location data collection (precise and approximate)
    • Purpose: App functionality (maps, quests)
    • Data is not shared with third parties (if applicable)
Apps that access location data must provide a valid privacy policy URL and complete the Data safety section.

Google Maps API Key

Secure your API key:
  1. Go to Google Cloud Console
  2. Navigate to APIs & Services > Credentials
  3. Create or edit your API key
  4. Add application restrictions:
    • Android apps
    • Package name: com.levinbaenninger.questhunter
    • SHA-1 certificate fingerprint (from your keystore)

Troubleshooting

Build Failures

Check build logs:
eas build:view [BUILD_ID]
Common issues:
  • Missing environment variables
  • Invalid package name
  • Keystore issues
  • Gradle build failures

Submission Errors

Each submission requires a unique version code. The production profile auto-increments, but if you see this error:
# Manually increment versionCode in app.json
"android": {
  "versionCode": 2
}

Google Play Rejection

Common rejection reasons:
  1. Incomplete Data Safety: Missing location permission declarations
  2. Privacy Policy: Missing or invalid privacy policy URL
  3. Misleading Content: Store listing doesn’t match app functionality
  4. Crashes: App crashes during review
  5. Permissions: Using permissions without clear purpose

Device Compatibility

Check device compatibility in Google Play Console:
  • Minimum SDK version is set appropriately
  • Required hardware features are declared
  • Screen sizes are supported

Staged Rollouts

Gradually release updates:
  1. In Google Play Console, select your release
  2. Choose “Staged rollout”
  3. Set percentage (e.g., 20%)
  4. Monitor crash rates and reviews
  5. Increase rollout percentage or halt if issues arise

Next Steps

iOS Deployment

Deploy to App Store and TestFlight

Web Deployment

Deploy web version with static export

Build docs developers (and LLMs) love