Ship a new version of your Android app to Google Play. Bump the version number, build a signed app bundle, upload, pick a release track. Walks through every tool you need to install — links for Mac, Windows, and Linux.
If this is your first time, install these once. Skip whichever you already have.
Google Play rejects re-uploads with the same versionCode. Open your app's build.gradle (or build.gradle.kts) — usually at app/build.gradle in your project — and bump it:
android {
defaultConfig {
versionCode 42 // bump this — must be unique & always increasing
versionName "1.2.1" // user-visible; bump on real changes (e.g. 1.2.0 → 1.2.1)
}
}
What each one is:
versionCode — an integer Google uses internally. Must increase every upload. Goes 1, 2, 3, … 42, 43.versionName — the string users see in the Play Store ("1.2.1"). Bump on real changes; can stay the same for tiny patch uploads.Google Play requires an AAB (Android App Bundle), not the old APK format. What an AAB is ↗.
Option A — Android Studio UI: Build → Generate Signed Bundle / APK → Android App Bundle → Next → choose keystore → Release → Finish. Output path is shown when it finishes.
Option B — terminal:
./gradlew bundleRelease
Output lands at app/build/outputs/bundle/release/app-release.aab.
keytool -genkey -v -keystore release.keystore -alias my-app -keyalg RSA -keysize 2048 -validity 10000 in a terminal (keytool docs ↗). Store the file and password somewhere safe. Lose the keystore and you can never ship updates to this app again.
Sign in to Google Play Console ↗ with the Google account on your developer registration. Pick your app from the list.
In the left sidebar under Testing and Production, you have four tracks:
For iterating, click Internal testing.
Click Create new release. Drag your app-release.aab file into the upload area. Wait for Play Console to process it (~30 seconds).
Fill in Release notes (what changed for testers). Then Next → Save → Send for review. For internal testing, this is effectively instant.
On the internal testing page, click Testers. Either:
Testers download via the Play Store as if it were a normal app, after they accept the invitation.
Time depends on the track:
Google emails when status changes. Watch in Play Console under Publishing overview.
When internal testing has been stable, promote to a wider track without re-uploading:
Play Console → release track → Promote release → pick target (Closed / Open / Production) → review changes → submit. Each promotion goes through the target track's review.
For Production releases, don't hand 100% to users on day one. Use staged rollout:
For automating uploads from a CI pipeline (GitHub Actions, etc.), use fastlane ↗. Install:
brew install fastlane # macOS
# or: sudo gem install fastlane (Linux/Windows)
Generate a service account JSON in Play Console (Setup → API access → Create new service account), grant it Release manager on your app, then:
fastlane supply --aab app-release.aab \
--track internal \
--json_key path/to/service-account.json
References: fastlane supply ↗ · Play Developer API ↗.