Submit an Expo/React Native app to the Google Play Store. Covers Play Console setup, signing keys, AAB format, EAS Build and Submit, service accounts, content ratings, and staged rollouts. Use when the user wants to publish to Google Play.
Use this skill when the user:
com.example.myapp (set in app.json)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:
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
# Select "Download credentials" to get the keystore
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:
Submit to Play Store.
eas submit --platform android
For automated submission, create a Google Cloud service account:
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 requiredalpha - closed testingbeta - open testingproduction - public releaseStaged 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
User: "I want to publish my Expo app on Google Play for the first time."
Agent:
app.json has package, versionCode, icon, and adaptive iconmobile_validateStoreMetadata for Android-specific checkseas build --platform android --profile production| Step | MCP Tool | Description |
|---|---|---|
| Validate config | mobile_validateStoreMetadata | Check app.json has all required Android fields |
| Build | mobile_buildForStore | Trigger eas build --platform android --profile production |
| Check build | mobile_checkBuildHealth | Verify project compiles before EAS build |
buildType: "app-bundle" in eas.json..gitignore immediately.autoIncrement: true.