-
Configure app.json for production.
{
"expo": {
"name": "My App",
"slug": "my-app",
"version": "1.0.0",
"icon": "./assets/icon.png",
"android": {
"package": "com.example.myapp",
"versionCode": 1,
"adaptiveIcon": {
"foregroundImage": "./assets/adaptive-icon.png",
"backgroundColor": "#FFFFFF"
},
"permissions": []
}
}
}
Set permissions to an empty array to avoid requesting unnecessary permissions. Expo adds only what your code actually uses.
-
Set up EAS Build.
npm install -g eas-cli
eas login
eas build:configure
Configure eas.json for production:
{
"build": {
"production": {
"android": {
"buildType": "app-bundle"
},
"autoIncrement": true
}
}
}
app-bundle produces an AAB (Android App Bundle), which is required by Google Play since August 2021.
-
Signing keys and Play App Signing.
EAS manages signing automatically. On first build:
- EAS generates an upload key (used to sign uploads)
- You opt into Play App Signing in Play Console (Google holds the app signing key)
This is the recommended flow. If you need to use your own keystore:
eas credentials
Select Android > production > manage keystore. You can upload an existing .jks file.
To export the upload key certificate for Play Console:
eas credentials --platform android
keytool -exportcert -alias <alias> -keystore <keystore.jks> | openssl sha1 -binary | openssl base64
-
Build for Play Store.
eas build --platform android --profile production
This produces an .aab file. Build typically takes 10-20 minutes.
-
Create a Google Play Console listing. Before the first submission:
- Go to play.google.com/console
- Create a new app (select app or game, free or paid)
- Fill the store listing: app name, short description (80 chars), full description (4000 chars)
- Upload screenshots: minimum 2 phone screenshots, optional tablet
- Upload feature graphic: 1024 x 500 px (required)
- Fill content rating questionnaire (IARC)
- Set target audience and content (is it for children?)
- Fill data safety section (what data the app collects)
-
Submit to Play Store.
eas submit --platform android
For automated submission, create a Google Cloud service account:
- Go to Google Cloud Console > IAM > Service Accounts
- Create a service account
- Grant "Service Account User" role
- Create a JSON key and download it
- In Play Console > Settings > API access > link the service account
- Grant the service account "Release manager" permission
Then configure in eas.json:
{
"submit": {
"production": {
"android": {
"serviceAccountKeyPath": "./google-service-account.json",
"track": "internal"
}
}
}
}
Do not commit the service account JSON. Add it to .gitignore.
Track options:
internal - up to 100 testers, no review required
alpha - closed testing
beta - open testing
production - public release
-
Staged rollouts. For production releases:
{
"submit": {
"production": {
"android": {
"track": "production",
"rollout": 0.1
}
}
}
}
Start with 10% rollout, monitor crash rates, then increase to 100%.
-
Target API level. Google Play requires targeting recent API levels:
| Deadline | Minimum targetSdkVersion |
|---|
| Aug 2025 | API 35 (Android 15) |
| Aug 2026 | API 36 (Android 16) |
Expo SDK handles this automatically. Check with:
npx expo config --type public | grep -i sdk