gplay releases upload
Upload an AAB (or a legacy APK) and attach it to a release on the given track.
Performs the full Edit lifecycle in one call: edits.insert → bundles.upload (or apks.upload) → tracks.update → edits.commit
AAB vs APK is auto-detected by file extension (.aab / .apk); pass --format apk|bundle to override when the extension is ambiguous. The rest of the pipeline — track assignment, release notes, --mapping, draft-by- default on production, --dry-run, --confirm — is identical for both.
Pass --mapping <mapping.txt> to upload the artifact's ProGuard/R8 deobfuscation file in the same Edit, so Play vitals can symbolicate obfuscated crash stacks. To attach a mapping to an already-published version, use gplay releases mappings upload instead.
Targeting production defaults to a draft release (ADR-0002) unless --complete or --staged is supplied. Any string is accepted as --track so closed-test tracks with custom names just work.
[experimental] APK upload — Google has required the AAB for new apps since August 2021, so .apk uploads only serve existing apps still distributed as APKs; if the app requires an App Bundle, Google's rejection of the APK passes through verbatim.
gplay releases upload <artifact> [flags]| Flag | Description |
|---|---|
--complete | force the release status to completed (1.0 user fraction) |
--confirm | explicit confirmation required for production publishes (--complete / --staged on production) |
--draft | force the release status to draft |
--dry-run | validate inputs and preview the release payload without any HTTP call |
--format string | artifact type: apk or bundle (overrides extension auto-detect) |
--keep-edit-on-failure | skip the auto-discard cleanup on failure (debug) |
--mapping string | ProGuard/R8 deobfuscation file (mapping.txt) uploaded with the artifact so Play vitals can symbolicate obfuscated crash stacks |
--output string | output format: table, json, or markdown (default: auto — table on TTY, json in pipes/CI) |
--package string | Android package name (overrides .gplay/config.json pin) |
--release-notes string | release notes text (applied to the app's default language) |
--release-notes-dir string | directory of <locale>.txt files (with optional default.txt fallback) |
--staged float | start a staged rollout at this fraction (0 < f ≤ 1.0) |
--track string | target track (internal, alpha, beta, production, or any closed-track name) |
Global flags
Section titled “Global flags”| Flag | Description |
|---|---|
--account string | name of a stored Account to use (overrides env and active Account) |
--retry int | retry transient failures (transport errors, 5xx, 429) up to N times with exponential backoff (default: 0, no retry) |
--service-account string | path to a service-account JSON, or inline JSON content (overrides --account, env, and active Account) |
--timeout duration | per-request API timeout, e.g. 30s or 2m (default: 60s for control-plane calls, none for uploads) |
-v, --verbose | log flow steps to stderr (info level) |