Android to Play Store
Build and deploy your Android app to Google Play Store
Android to Play Store
This guide walks you through building and deploying your Android app to the Google Play Store.
Prerequisites
Before you begin, ensure you have:
- Java Development Kit (JDK) 11+ installed
- Android SDK installed (
ANDROID_HOMEconfigured) - Mobile project that builds to Android (native Kotlin/Java, React Native, Flutter, Ionic/Capacitor, Expo, or MAUI)
- Google Play Developer account with API access
- MySigner account with Google Play credentials configured
- Keystore uploaded to MySigner
New to MySigner? Complete the Getting Started guide first.
Step 1: Set Up Google Play Credentials
Create a Service Account
- Go to Google Cloud Console
- Create a new project or select an existing one
- Enable the Google Play Android Developer API
- Navigate to IAM & Admin → Service Accounts
- Create a new service account
- Grant the Service Account User role
- Create a JSON key and download it
Link to Google Play Console
- Go to Google Play Console
- Navigate to Users and permissions
- Click Invite new users
- Enter the service account email (from the JSON key)
- Grant Release manager access (the minimum required — Admin works too but grants more than needed)
- Click Invite user
Add to MySigner
- Go to MySigner dashboard → Google Play
- Click Add Credential
- Upload the JSON key file
- MySigner will verify the connection
Step 2: Upload Your Keystore
Android apps must be signed with a keystore. Upload yours to MySigner:
- Go to MySigner dashboard → Keystores
- Click Upload Keystore
- Fill in the details:
| Field | Description |
|---|---|
| Keystore File | Your .jks or .keystore file |
| Keystore Password | Password for the keystore |
| Key Alias | Alias of the signing key |
| Key Password | Password for the key (often same as keystore) |
- Click Upload
- Click Activate to set as default
Important: Keep a backup of your keystore! If lost, you cannot update your app on Google Play.
Step 3: Verify Setup
Run the doctor command:
mysigner doctor
Ensure you have:
- ✓ Google Play credentials
- ✓ Active keystore
- ✓ JDK installed
- ✓ Gradle configured
Step 4: Prepare Your App
First-Time Upload
For new apps, you must upload the first build manually:
- Build an AAB locally or use MySigner
- Go to Google Play Console
- Create a new app
- Upload the AAB to any track (Internal is recommended)
- Complete the app listing requirements
After the first upload, MySigner can handle all subsequent releases.
Version Management
MySigner auto-increments your version code. Ensure your build.gradle is set up:
android {
defaultConfig {
versionCode 1
versionName "1.0.0"
}
}
Step 5: Ship to Internal Testing
From your project's root directory:
mysigner ship internal --platform android
This command:
- Detects your project and framework (React Native, Flutter, Ionic/Capacitor, Expo, native Kotlin/Java, MAUI)
- Pre-builds if needed (
cap sync android,flutter pub get,expo prebuild, etc.) - Fetches keystore from MySigner
- Increments version code
- Builds a signed AAB
- Uploads to Internal Testing track
Example Output
🤖 My Signer - Ship to Google Play (Internal Testing)
================================================================================
This will:
1️⃣ Detect and build your Android project
2️⃣ Sign with your keystore
3️⃣ Upload to Google Play (internal track)
⏱️ Estimated time: 3-10 minutes
================================================================================
[1/3] Building Android App Bundle (AAB)
================================================================================
✓ Found: Android project (Native Android)
📦 Package: com.company.myapp
🔢 Version: 1.2.0 (41 → 42)
↳ Auto-incremented (41 already on Play Store)
⏱️ Estimated: 2-5 minutes
================================================================================
[2/3] Signing with Keystore
================================================================================
🔐 Fetching keystore from My Signer...
✓ Using keystore: Production Key
✓ Keystore ready at: ~/.mysigner/keystores/production.jks
✓ Build complete in 2m 18s
📦 AAB: app/build/outputs/bundle/release/app-release.aab
================================================================================
[3/3] Uploading to Google Play
================================================================================
🔐 Fetching Google Play credentials...
✓ Credentials loaded
Uploading to Internal Testing...
▸ Uploading... 28.4 MB / 28.4 MB (100%)
▸ Processing complete
================================================================================
🎉 SUCCESS! Your app is on Google Play (internal track)!
================================================================================
📊 Summary
Package: com.company.myapp
Version: 1.2.0 (42)
Track: internal
AAB Size: 28.4 MB
⏱️ Time Breakdown
Build: 2m 18s
Upload: 45s
──────────────────────────────
Total: 3m 03s
📁 Files Created
AAB: app/build/outputs/bundle/release/app-release.aab
🔮 Next Steps
1. Add internal testers in Google Play Console
2. Testers will receive the build automatically
Google Play Console: https://play.google.com/console
Step 6: Distribute to Testers
Internal Testing
- Limited to 100 testers
- Testers must be added by email in Google Play Console
- No review required, available immediately
Add Internal Testers
- Go to Google Play Console → Testing → Internal testing
- Click Testers tab
- Create or select a list
- Add email addresses
- Share the opt-in link with testers
Promotion Tracks
Google Play uses tracks for progressive releases:
Internal → Closed (Alpha) → Open (Beta) → Production
Ship to Different Tracks
# Internal Testing (100 testers max)
mysigner ship internal --platform android
# Closed Testing (Alpha)
mysigner ship alpha --platform android
# Open Testing (Beta)
mysigner ship beta --platform android
# Production
mysigner ship production --platform android
With Release Notes
mysigner ship beta --platform android --release-notes "Bug fixes and performance improvements"
Staged Rollouts
For production releases, Google Play supports staged rollouts to minimize risk. You can manage staged rollouts directly in the Google Play Console:
- Go to Google Play Console → Your app → Production
- Select a release and choose Staged rollout
- Set the initial percentage (e.g., 10%)
- Gradually increase as you gain confidence
Staged Rollout Strategy
| Stage | Percentage | Duration | Action |
|---|---|---|---|
| 1 | 5-10% | 1-2 days | Monitor crash rates |
| 2 | 25% | 1-2 days | Check user feedback |
| 3 | 50% | 1 day | Validate at scale |
| 4 | 100% | - | Full release |
Monitor your crash-free rate in Google Play Console. If it drops below 99%, consider halting the rollout.
Time Estimates
| Track | Review Time | Availability |
|---|---|---|
| Internal | None | Immediate |
| Closed (Alpha) | None | Immediate |
| Open (Beta) | None | Immediate |
| Production | 0-7 days | After review |
New apps and apps flagged for review may take longer. Most updates to production go live within hours.
Workflow Diagram
┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ Build │────▶│ Sign │────▶│ Upload │
│ AAB │ │ Keystore │ │ to Track │
└─────────────┘ └─────────────┘ └─────────────┘
│
┌──────────────────────────────────────┤
│ │
▼ ▼
┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ Internal │────▶│ Beta │────▶│ Production │
│ Testing │ │ Testing │ │ Release │
└─────────────┘ └─────────────┘ └─────────────┘
Common Issues
"Package name not found"
The package name doesn't match any app in your Google Play Console.
Fix:
1. Ensure the app exists in Google Play Console
2. Check the package name in build.gradle matches
3. Verify your service account has access to the app
"Version code already exists"
The version code must be higher than any previously uploaded version.
Fix: ```bash
MySigner auto-increments, but you can also set manually
In build.gradle, increase versionCode
### "APK signature is invalid"
Keystore or signing configuration issue.
**Fix:**
1. Verify keystore credentials in MySigner
2. Check key alias and passwords are correct
3. Re-upload keystore if needed
### "Upload failed - API error"
Google Play API permission issue.
**Fix:**
1. Verify service account email has Release Manager access
2. Check Google Play API is enabled in Cloud Console
3. Re-upload Google Play credentials
### Build fails with Gradle error
**Fix:**
```bash
# Clean and rebuild
cd android && ./gradlew clean
# Run with verbose output
mysigner ship internal --platform android --verbose
Best Practices
Version Naming
Use semantic versioning:
1.0.0 - Major.Minor.Patch
- Major: Breaking changes, major features
- Minor: New features, improvements
- Patch: Bug fixes
Release Notes
Write clear, user-friendly release notes:
What's New in 1.2.0:
• Faster app loading
• Fixed login issues on some devices
• New dark mode option
• Bug fixes and stability improvements
Testing Strategy
- Internal: Core team testing
- Closed Alpha: Extended team, power users
- Open Beta: Wider audience, opt-in
- Production: Staged rollout
Next Steps
- GitHub Actions CI/CD - Automate Android deployments
- Keystores Management - Manage signing keys
- Troubleshooting - More issue solutions
Related Commands
ship- Full ship command referencekeystore- Keystore managementandroid- Android-specific commandsdoctor- Diagnose issues
Related Dashboard Pages
- Releases - Configure release notes per track, run the AI translate / rewrite workflow, manage the release checklist before submission
- Screenshot Studio - Generate Play Store screenshots and push them directly to Google Play
- Reviews & Ratings - Reply to Play Store reviews and use response templates
- Analytics - Track installs / ANR rate / crash rate / retention during staged rollouts