- Created a new PostCSS configuration file to integrate Tailwind CSS. - Added a skills lock file containing various Expo skills with their respective source and computed hashes.
247 lines
5.1 KiB
Markdown
247 lines
5.1 KiB
Markdown
# Submitting to Google Play Store
|
|
|
|
## Prerequisites
|
|
|
|
1. **Google Play Console Account** - Register at [play.google.com/console](https://play.google.com/console)
|
|
2. **App Created in Console** - Create your app listing before first submission
|
|
3. **Service Account** - For automated submissions via EAS
|
|
|
|
## Service Account Setup
|
|
|
|
### 1. Create Service Account
|
|
|
|
1. Go to Google Cloud Console → IAM & Admin → Service Accounts
|
|
2. Create a new service account
|
|
3. Grant the "Service Account User" role
|
|
4. Create and download a JSON key
|
|
|
|
### 2. Link to Play Console
|
|
|
|
1. Go to Play Console → Setup → API access
|
|
2. Click "Link" next to your Google Cloud project
|
|
3. Under "Service accounts", click "Manage Play Console permissions"
|
|
4. Grant "Release to production" permission (or appropriate track permissions)
|
|
|
|
### 3. Configure EAS
|
|
|
|
Add the service account key path to `eas.json`:
|
|
|
|
```json
|
|
{
|
|
"submit": {
|
|
"production": {
|
|
"android": {
|
|
"serviceAccountKeyPath": "./google-service-account.json",
|
|
"track": "internal"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
```
|
|
|
|
Store the key file securely and add it to `.gitignore`.
|
|
|
|
## Environment Variables
|
|
|
|
For CI/CD, use environment variables instead of file paths:
|
|
|
|
```bash
|
|
# Base64-encoded service account JSON
|
|
EXPO_ANDROID_SERVICE_ACCOUNT_KEY_BASE64=...
|
|
```
|
|
|
|
Or use EAS Secrets:
|
|
|
|
```bash
|
|
eas secret:create --name GOOGLE_SERVICE_ACCOUNT --value "$(cat google-service-account.json)" --type file
|
|
```
|
|
|
|
Then reference in `eas.json`:
|
|
|
|
```json
|
|
{
|
|
"submit": {
|
|
"production": {
|
|
"android": {
|
|
"serviceAccountKeyPath": "@secret:GOOGLE_SERVICE_ACCOUNT"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
```
|
|
|
|
## Release Tracks
|
|
|
|
Google Play uses tracks for staged rollouts:
|
|
|
|
| Track | Purpose |
|
|
|-------|---------|
|
|
| `internal` | Internal testing (up to 100 testers) |
|
|
| `alpha` | Closed testing |
|
|
| `beta` | Open testing |
|
|
| `production` | Public release |
|
|
|
|
### Track Configuration
|
|
|
|
```json
|
|
{
|
|
"submit": {
|
|
"production": {
|
|
"android": {
|
|
"track": "production",
|
|
"releaseStatus": "completed"
|
|
}
|
|
},
|
|
"internal": {
|
|
"android": {
|
|
"track": "internal",
|
|
"releaseStatus": "completed"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
```
|
|
|
|
### Release Status Options
|
|
|
|
- `completed` - Immediately available on the track
|
|
- `draft` - Upload only, release manually in Console
|
|
- `halted` - Pause an in-progress rollout
|
|
- `inProgress` - Staged rollout (requires `rollout` percentage)
|
|
|
|
## Staged Rollout
|
|
|
|
```json
|
|
{
|
|
"submit": {
|
|
"production": {
|
|
"android": {
|
|
"track": "production",
|
|
"releaseStatus": "inProgress",
|
|
"rollout": 0.1
|
|
}
|
|
}
|
|
}
|
|
}
|
|
```
|
|
|
|
This releases to 10% of users. Increase via Play Console or subsequent submissions.
|
|
|
|
## Submission Commands
|
|
|
|
```bash
|
|
# Build and submit to internal track
|
|
eas build -p android --profile production --submit
|
|
|
|
# Submit existing build to Play Store
|
|
eas submit -p android --latest
|
|
|
|
# Submit specific build
|
|
eas submit -p android --id BUILD_ID
|
|
```
|
|
|
|
## App Signing
|
|
|
|
### Google Play App Signing (Recommended)
|
|
|
|
EAS uses Google Play App Signing by default:
|
|
|
|
1. First upload: EAS creates upload key, Play Store manages signing key
|
|
2. Play Store re-signs your app with the signing key
|
|
3. Upload key can be reset if compromised
|
|
|
|
### Checking Signing Status
|
|
|
|
```bash
|
|
eas credentials -p android
|
|
```
|
|
|
|
## Version Codes
|
|
|
|
Android requires incrementing `versionCode` for each upload:
|
|
|
|
```json
|
|
{
|
|
"build": {
|
|
"production": {
|
|
"autoIncrement": true
|
|
}
|
|
}
|
|
}
|
|
```
|
|
|
|
With `appVersionSource: "remote"`, EAS tracks version codes automatically.
|
|
|
|
## First Submission Checklist
|
|
|
|
Before your first Play Store submission:
|
|
|
|
- [ ] Create app in Google Play Console
|
|
- [ ] Complete app content declaration (privacy policy, ads, etc.)
|
|
- [ ] Set up store listing (title, description, screenshots)
|
|
- [ ] Complete content rating questionnaire
|
|
- [ ] Set up pricing and distribution
|
|
- [ ] Create service account with proper permissions
|
|
- [ ] Configure `eas.json` with service account path
|
|
|
|
## Common Issues
|
|
|
|
### "App not found"
|
|
|
|
The app must exist in Play Console before EAS can submit. Create it manually first.
|
|
|
|
### "Version code already used"
|
|
|
|
Increment `versionCode` in `app.json` or use `autoIncrement: true` in `eas.json`.
|
|
|
|
### "Service account lacks permission"
|
|
|
|
Ensure the service account has "Release to production" permission in Play Console → API access.
|
|
|
|
### "APK not acceptable"
|
|
|
|
Play Store requires AAB (Android App Bundle) for new apps:
|
|
|
|
```json
|
|
{
|
|
"build": {
|
|
"production": {
|
|
"android": {
|
|
"buildType": "app-bundle"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
```
|
|
|
|
## Internal Testing Distribution
|
|
|
|
For quick internal distribution without Play Store:
|
|
|
|
```bash
|
|
# Build with internal distribution
|
|
eas build -p android --profile development
|
|
|
|
# Share the APK link with testers
|
|
```
|
|
|
|
Or use EAS Update for OTA updates to existing installs.
|
|
|
|
## Monitoring Submissions
|
|
|
|
```bash
|
|
# Check submission status
|
|
eas submit:list -p android
|
|
|
|
# View specific submission
|
|
eas submit:view SUBMISSION_ID
|
|
```
|
|
|
|
## Tips
|
|
|
|
- Start with `internal` track for testing before production
|
|
- Use staged rollouts for production releases
|
|
- Keep service account key secure - never commit to git
|
|
- Set up Play Console notifications for review status
|
|
- Pre-launch reports in Play Console catch issues before review
|