Skip to content

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]
FlagDescription
--completeforce the release status to completed (1.0 user fraction)
--confirmexplicit confirmation required for production publishes (--complete / --staged on production)
--draftforce the release status to draft
--dry-runvalidate inputs and preview the release payload without any HTTP call
--format stringartifact type: apk or bundle (overrides extension auto-detect)
--keep-edit-on-failureskip the auto-discard cleanup on failure (debug)
--mapping stringProGuard/R8 deobfuscation file (mapping.txt) uploaded with the artifact so Play vitals can symbolicate obfuscated crash stacks
--output stringoutput format: table, json, or markdown (default: auto — table on TTY, json in pipes/CI)
--package stringAndroid package name (overrides .gplay/config.json pin)
--release-notes stringrelease notes text (applied to the app's default language)
--release-notes-dir stringdirectory of <locale>.txt files (with optional default.txt fallback)
--staged floatstart a staged rollout at this fraction (0 < f ≤ 1.0)
--track stringtarget track (internal, alpha, beta, production, or any closed-track name)
FlagDescription
--account stringname of a stored Account to use (overrides env and active Account)
--retry intretry transient failures (transport errors, 5xx, 429) up to N times with exponential backoff (default: 0, no retry)
--service-account stringpath to a service-account JSON, or inline JSON content (overrides --account, env, and active Account)
--timeout durationper-request API timeout, e.g. 30s or 2m (default: 60s for control-plane calls, none for uploads)
-v, --verboselog flow steps to stderr (info level)