- Generated PKCS12 keystore (production-release.jks, alias: upload) - Updated GitHub secrets: KEYSTORE_BASE64/PASSWORD/KEY_ALIAS/KEY_PASSWORD - Added keystores/ to .gitignore - Added distribution/PLAY_CONSOLE_SETUP.md: step-by-step guide to create GCP service account, link to Play Console, first manual upload, and configure PLAY_STORE_SERVICE_ACCOUNT_JSON secret - Installed android-playstore-setup skills (sub-skills) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
369 lines
8.6 KiB
Markdown
369 lines
8.6 KiB
Markdown
# Play Store Release Tracks
|
|
|
|
## Overview
|
|
|
|
Google Play offers multiple release tracks for different stages of your app's release process. Each track serves a specific purpose and audience.
|
|
|
|
## Track Types
|
|
|
|
### 1. Internal Testing Track
|
|
|
|
**Purpose:** Rapid testing with your team
|
|
|
|
**Characteristics:**
|
|
- **Audience:** Up to 100 internal testers
|
|
- **Review time:** None (instant availability)
|
|
- **Rollout:** Immediate (100% to all testers)
|
|
- **Visibility:** Only invited testers can see and install
|
|
- **Version requirements:** Can have lower version code than production
|
|
|
|
**Best for:**
|
|
- Daily/continuous deployment from CI/CD
|
|
- QA team testing
|
|
- Dogfooding (internal employee usage)
|
|
- Quick iteration and bug fixes
|
|
|
|
**Setup:**
|
|
1. Play Console → Release → Testing → Internal testing
|
|
2. Create email list of testers
|
|
3. Share opt-in URL with team
|
|
4. Testers opt-in and can immediately download
|
|
|
|
**Limitations:**
|
|
- Maximum 100 testers
|
|
- Updates are immediate (can't schedule)
|
|
- No staged rollout option
|
|
|
|
---
|
|
|
|
### 2. Closed Testing (Alpha/Beta Tracks)
|
|
|
|
**Purpose:** Private testing with selected external testers
|
|
|
|
**Characteristics:**
|
|
- **Audience:** Unlimited testers via email lists or Google Groups
|
|
- **Review time:** Minimal (typically < 24 hours)
|
|
- **Rollout:** Immediate to all testers or staged
|
|
- **Visibility:** Only invited testers
|
|
- **Version requirements:** Can have lower version code than production
|
|
|
|
**Best for:**
|
|
- Beta tester program
|
|
- Customer advisory board testing
|
|
- Partner/client testing
|
|
- Pre-release validation with real users
|
|
|
|
**Setup:**
|
|
1. Play Console → Release → Testing → Closed testing
|
|
2. Create track (e.g., "alpha" or "beta")
|
|
3. Add testers:
|
|
- Email list (manual CSV upload)
|
|
- Google Group (automatic membership sync)
|
|
4. Share opt-in URL with testers
|
|
|
|
**Multiple closed tracks:**
|
|
You can create multiple closed tracks for different purposes:
|
|
- alpha: Early unstable builds
|
|
- beta: Stable pre-release builds
|
|
- partners: Partner testing
|
|
- qa-external: External QA testing
|
|
|
|
---
|
|
|
|
### 3. Open Testing (Public Beta)
|
|
|
|
**Purpose:** Public beta program
|
|
|
|
**Characteristics:**
|
|
- **Audience:** Anyone with the opt-in link
|
|
- **Review time:** Standard review (1-7 days typically)
|
|
- **Rollout:** Configurable (staged or full)
|
|
- **Visibility:** Discoverable in Play Store (with limitations)
|
|
- **Version requirements:** Must be higher than production
|
|
|
|
**Best for:**
|
|
- Public beta program
|
|
- Early adopter community
|
|
- Gathering feedback before production
|
|
- Testing at scale
|
|
|
|
**Setup:**
|
|
1. Play Console → Release → Testing → Open testing
|
|
2. Configure:
|
|
- Countries (where beta is available)
|
|
- Maximum testers (optional limit)
|
|
- Feedback settings
|
|
3. Publish opt-in URL or Play Store listing link
|
|
|
|
**Considerations:**
|
|
- Wider audience = more diverse feedback
|
|
- Can impact app ratings if buggy
|
|
- Higher review scrutiny than closed testing
|
|
- Beta users see "Early Access" badge
|
|
|
|
---
|
|
|
|
### 4. Production Track
|
|
|
|
**Purpose:** Public release to all users
|
|
|
|
**Characteristics:**
|
|
- **Audience:** All users in selected countries
|
|
- **Review time:** Standard review (1-7 days, can be longer)
|
|
- **Rollout:** Configurable (staged rollout recommended)
|
|
- **Visibility:** Fully visible in Play Store
|
|
- **Version requirements:** Must be higher than previous production
|
|
|
|
**Best for:**
|
|
- Official public releases
|
|
- App updates for all users
|
|
- Final release after testing phases
|
|
|
|
**Staged Rollout Options:**
|
|
- **5% → 10% → 20% → 50% → 100%** (recommended)
|
|
- Pause at any stage if issues detected
|
|
- Gradually increase to monitor stability
|
|
- Full rollback available if needed
|
|
|
|
**Review factors:**
|
|
- App content and policies
|
|
- Metadata and store listing
|
|
- Previous policy violations (if any)
|
|
- Random extended reviews sometimes occur
|
|
|
|
---
|
|
|
|
## Release Workflow
|
|
|
|
### Recommended Flow
|
|
|
|
```
|
|
Development
|
|
↓
|
|
Internal Testing (continuous, every commit)
|
|
↓
|
|
Closed Testing / Alpha (weekly releases)
|
|
↓
|
|
Open Testing / Beta (bi-weekly releases)
|
|
↓
|
|
Production (monthly major releases)
|
|
```
|
|
|
|
### Alternative Flow (Simpler)
|
|
|
|
```
|
|
Development
|
|
↓
|
|
Internal Testing (daily/continuous)
|
|
↓
|
|
Production with Staged Rollout (weekly/bi-weekly)
|
|
```
|
|
|
|
### Hotfix Flow
|
|
|
|
```
|
|
Critical Bug Detected
|
|
↓
|
|
Fix in Development
|
|
↓
|
|
Internal Testing (verify fix)
|
|
↓
|
|
Production with Fast Rollout (20% → 50% → 100%)
|
|
```
|
|
|
|
---
|
|
|
|
## Track Promotion
|
|
|
|
### Promoting Between Tracks
|
|
|
|
You can promote a release from one track to another without rebuilding:
|
|
|
|
**In Play Console:**
|
|
1. Navigate to: Release → [Source Track] → Releases
|
|
2. Find the release to promote
|
|
3. Click "Promote release"
|
|
4. Select target track
|
|
5. Update release notes if needed
|
|
6. Click "Review release"
|
|
7. Submit
|
|
|
|
**Benefits:**
|
|
- Same exact APK/AAB (no rebuild needed)
|
|
- Saves time and ensures consistency
|
|
- Keeps version code sequential
|
|
|
|
**Promotion Paths:**
|
|
- Internal → Alpha → Beta → Production
|
|
- Internal → Production (skip beta)
|
|
- Alpha → Production (skip beta)
|
|
|
|
**Restrictions:**
|
|
- Cannot promote to track with higher version code already
|
|
- Cannot promote from production to testing tracks
|
|
|
|
---
|
|
|
|
## Version Code Strategy
|
|
|
|
### Option 1: Continuous Versioning (Recommended)
|
|
|
|
All tracks use sequential version codes:
|
|
|
|
```
|
|
1 → Internal
|
|
2 → Internal
|
|
3 → Alpha
|
|
4 → Internal
|
|
5 → Alpha
|
|
6 → Beta
|
|
7 → Production
|
|
8 → Internal
|
|
...
|
|
```
|
|
|
|
**Pros:**
|
|
- Simple and clear
|
|
- Easy to track
|
|
- No mental overhead
|
|
|
|
**Cons:**
|
|
- Version numbers increase quickly
|
|
- Can't easily tell track from version code
|
|
|
|
### Option 2: Track-Based Versioning
|
|
|
|
Different ranges for different tracks:
|
|
|
|
```
|
|
Internal: 1000-1999 (e.g., 1001, 1002, 1003)
|
|
Alpha: 2000-2999 (e.g., 2001, 2002)
|
|
Beta: 3000-3999 (e.g., 3001, 3002)
|
|
Production: 1-999 (e.g., 1, 2, 3)
|
|
```
|
|
|
|
**Pros:**
|
|
- Can tell track from version code
|
|
- Organized by track
|
|
|
|
**Cons:**
|
|
- More complex to manage
|
|
- Promotion requires version code bump
|
|
- Can run out of range
|
|
|
|
### Option 3: Semantic Versioning Encoded
|
|
|
|
Encode semantic version in version code:
|
|
|
|
```
|
|
Version 1.2.3 = 10203 (Major.Minor.Patch)
|
|
Version 2.0.0 = 20000
|
|
Version 2.1.5 = 20105
|
|
```
|
|
|
|
**Pros:**
|
|
- Version code matches version name
|
|
- Clear relationship
|
|
|
|
**Cons:**
|
|
- Limited to 2.1.4.7 (max version code is 2100000000)
|
|
- Must update both version code and name together
|
|
|
|
---
|
|
|
|
## Release Notes Per Track
|
|
|
|
Different tracks can have different release notes:
|
|
|
|
**Internal Testing:**
|
|
```
|
|
- Fixed crash in user profile
|
|
- Updated API endpoints
|
|
- Added logging for debugging
|
|
```
|
|
(Can be technical for internal team)
|
|
|
|
**Production:**
|
|
```
|
|
- Improved app stability
|
|
- Enhanced user profile experience
|
|
- Performance optimizations
|
|
```
|
|
(User-friendly language)
|
|
|
|
---
|
|
|
|
## Best Practices
|
|
|
|
### 1. Use Internal Testing for CI/CD
|
|
- Deploy every commit or daily
|
|
- Catch issues early
|
|
- Team always has latest version
|
|
|
|
### 2. Beta Test Before Production
|
|
- Minimum 1 week in beta
|
|
- Monitor crash rates and reviews
|
|
- Fix issues before production
|
|
|
|
### 3. Use Staged Rollout for Production
|
|
- Start with 5-10%
|
|
- Monitor for 24-48 hours
|
|
- Increase gradually
|
|
- Pause if issues detected
|
|
|
|
### 4. Keep Testers Engaged
|
|
- Thank beta testers publicly
|
|
- Respond to feedback
|
|
- Share roadmap updates
|
|
- Offer early access to features
|
|
|
|
### 5. Monitor Metrics
|
|
- Crash-free rate per track
|
|
- ANR (App Not Responding) rate
|
|
- User feedback and ratings
|
|
- Install/uninstall rates
|
|
|
|
---
|
|
|
|
## Track Comparison Table
|
|
|
|
| Feature | Internal | Closed | Open | Production |
|
|
|---------|----------|--------|------|------------|
|
|
| Max Testers | 100 | Unlimited | Unlimited | Unlimited |
|
|
| Review Time | None | < 1 day | 1-7 days | 1-7 days |
|
|
| Staged Rollout | No | Optional | Yes | Yes |
|
|
| Public Visibility | No | No | Limited | Yes |
|
|
| Feedback Channel | Email | In-app | In-app + Reviews | Reviews |
|
|
| Minimum Updates | Immediate | Hours | Days | Days |
|
|
|
|
---
|
|
|
|
## Troubleshooting
|
|
|
|
**"Cannot create closed track"**
|
|
- Ensure app has been published once
|
|
- Check permissions (need release manager role)
|
|
|
|
**"Testers not receiving updates"**
|
|
- Verify testers opted in via link
|
|
- Check email list is correct
|
|
- Internal track: max 100 testers
|
|
|
|
**"Version code error on promotion"**
|
|
- Target track already has higher version code
|
|
- Increment version code before promotion
|
|
|
|
**"Review taking too long"**
|
|
- Standard: 1-7 days
|
|
- Contact Play Console support after 7 days
|
|
- Check for policy violations in email
|
|
|
|
---
|
|
|
|
## References
|
|
|
|
- [Release Tracks Overview](https://support.google.com/googleplay/android-developer/answer/9845334)
|
|
- [Testing with Internal Tracks](https://support.google.com/googleplay/android-developer/answer/9303479)
|
|
- [Staged Rollouts](https://support.google.com/googleplay/android-developer/answer/6346149)
|
|
- [App Review Process](https://support.google.com/googleplay/android-developer/answer/9859455)
|