Skip to content

How to Publish a Flutter App on Google Play (2026)

From flutter build appbundle to a live closed test: signing with an upload key, version numbers in pubspec.yaml, target API 36, and the 12-tester requirement.

Updated 3 min readBy the TestersZone team

Short answer

Create an upload keystore, reference it from android/key.properties in your Gradle signing config, set the version in pubspec.yaml, make sure you target API 36, then run flutter build appbundle. Upload the .aab from build/app/outputs/bundle/release/ to a closed testing track in Play Console.

1. Set the application ID

In android/app/build.gradle(.kts), set applicationId to your permanent package name, like com.yourdomain.appname. It can’t change after your first upload. See package names.

2. Create an upload key

Generate a keystore with keytool (Android Studio’s Generate Signed Bundle wizard also works). Store the file outside your repo and back it up.

Create android/key.properties with storePassword, keyPassword, keyAlias and storeFile, and add it to .gitignore.

3. Wire up signing in Gradle

In android/app/build.gradle(.kts), load key.properties and add a release signingConfig that uses those values, then set the release build type to use it. Flutter’s official “Build and release an Android app” docs show the exact snippet for both Groovy and Kotlin DSL.

With Play App Signing (the default), this key is your upload key. Google holds the app signing key. Lose the upload key and you can request a reset.

4. Version and target SDK

  • In pubspec.yaml, version: 1.0.0+1 means versionName 1.0.0 and versionCode 1. Bump the number after + on every upload. See version code already used.
  • Since August 31, 2026, new apps and updates must target API 36. Upgrade Flutter, and confirm targetSdk in the Gradle file. See target API 36.

5. Build the bundle

Run flutter build appbundle. The output is build/app/outputs/bundle/release/app-release.aab. Flutter builds for the 64-bit ABIs Play needs.

6. Flutter-specific gotchas

ProblemFix
App crashes only in releaseCheck code shrinking rules for plugins, and test a release build locally
Internet works in debug, not releaseAdd the INTERNET permission to the main AndroidManifest.xml
Wrong app name on deviceSet android:label in AndroidManifest.xml
Icon is the Flutter logoGenerate launcher icons for all densities

After the bundle is built: same path for every app

  1. Create the app in Play Console and complete the store listing and App content. See does a closed test need a store listing.
  2. Upload the .aab to a closed testing track (internal first is optional). See upload your first AAB.
  3. Attach a tester list and publish. Share the opt-in link.
  4. On a new personal account: keep 12+ testers opted in for 14 days, then apply for production access.

Frequently asked questions

Should I build an APK or an app bundle with Flutter?

For Google Play, build an app bundle with flutter build appbundle. New apps must use App Bundles. Use APKs only for sideloading tests.

Do I need to obfuscate Dart code?

It’s optional. If you use Flutter’s obfuscation flags, keep the generated symbol files so you can read crash stack traces later.

Where do I set the app icon for Flutter Android?

Android launcher icons live in android/app/src/main/res. Many developers use a package to generate every density from one image.

Sources and how we keep this accurate

Policy facts are checked against Google's own documentation on the date shown above. Google can change requirements at any time, so confirm in your Play Console. Where we give advice or estimates rather than Google's rules, we say so. TestersZone is independent and not affiliated with Google. Drafts are AI-assisted and reviewed by our team.

Need 12 testers? Get them free.

Test 3 apps, earn 60 credits, and list your app for up to 20 real testers with verified daily check-ins.

Start free

Keep reading

Browse all guides, or see the quick answers, guides and comparisons.