| name | mobile-android-submission |
|---|---|
| description | 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. |
| standards-version | 1.7.0 |
Use this skill when the user:
- Wants to submit their app to the Google Play Store
- Needs help with Android signing keys or Play App Signing
- Asks about Play Console, AAB format, or staged rollouts
- Gets a build or submission error for Android
- Mentions "play store", "android submit", "google play", "aab", "signing key", or "eas submit android"
- Google Play Developer account: enrolled ($25 one-time fee)
- Project path: where the Expo project lives
- Package name: e.g.
com.example.myapp(set inapp.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
permissionsto 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.jsonfor production:{ "build": { "production": { "android": { "buildType": "app-bundle" }, "autoIncrement": true } } }app-bundleproduces 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
.jksfile.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
.aabfile. 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 requiredalpha- closed testingbeta- open testingproduction- 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
User: "I want to publish my Expo app on Google Play for the first time."
Agent:
- Verifies
app.jsonhaspackage,versionCode, icon, and adaptive icon - Runs
mobile_validateStoreMetadatafor Android-specific checks - Builds with
eas build --platform android --profile production - Guides user through Play Console: create app, fill listing, upload screenshots
- Helps create a service account for automated submission
- Submits to internal track first for testing
- After testing, promotes to production with a 10% staged rollout
| 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 |
- Not using AAB format - Google Play requires AAB (not APK) for new apps. Set
buildType: "app-bundle"ineas.json. - Committing the service account key - The JSON key grants full Play Console access. Add it to
.gitignoreimmediately. - versionCode not incrementing - Play Console rejects uploads with a versionCode equal to or lower than the current published version. Use
autoIncrement: true. - Missing data safety section - Google requires declaring all data the app collects. Incomplete declarations can result in app removal.
- Targeting an old API level - Google rejects updates that do not target a recent API level. Use the latest Expo SDK to stay compliant.
- Feature graphic missing - The 1024x500 feature graphic is required. Without it, you cannot publish.
- Content rating not completed - The IARC questionnaire must be filled before the app can go live. It takes 5 minutes but is easy to forget.
- App Store Prep - prepare metadata and assets before submission
- Mobile iOS Submission - equivalent flow for Apple App Store
- Mobile Auth Setup - auth patterns (relevant for data safety disclosure)