APP — ANDROID DEPLOYMENT

Building & Publishing to Google Play Store

A complete, up-to-date guide for building, signing, and submitting your Flutter app to Google Play Store — updated for 2025–26 requirements including mandatory AAB format and targetSdkVersion 35.

Flutter 3.xAndroid App Bundle (AAB)targetSdk 35Play Integrity APIDart 3.x
⚠️

2025–26 Breaking Changes — Read Before You Start

Google Play now
requires AAB (Android App Bundle)
— APK uploads are rejected for both new apps and updates. Additionally,
targetSdk 35 (Android 15)
is mandatory for all new submissions starting August 31, 2025. Older APK-only tutorials from 2023–2024 are now outdated and may cause your app submission to be rejected.

1

Prerequisites

Everything you need before starting the deployment process

FLUTTER SDK3.x (Latest Stable)
DART3.x
TARGET SDK35 (Android 15)
MIN SDK21+
BUILD FORMATAAB (Mandatory)
PLAY DEV FEE$25 (one-time)
  • Flutter SDK installed and updated to the latest stable version
  • Android Studio with Android SDK and build tools configured
  • JDK 8 or higher (bundled with Android Studio)
  • Google Play Developer Account ($25 one-time registration fee)
  • App icon — 512×512px PNG, no transparency or alpha channel
  • At least 2 phone screenshots (recommended: 4–8 at 1080×1920px or higher)
  • Privacy Policy URL — must be a hosted web page, not a PDF
  • App tested on a real physical device (not just emulator)
⚠️

If you lose your keystore file, you cannot update your app. You would have to publish as a completely new app with a new package name. Back it up securely immediately after creation.

2

Prepare Your Flutter App

Configure app version, targetSdk, and app metadata before building

Before building, ensure your app is fully developed and tested. Update the following critical configurations inandroid/app/build.gradle:

Groovy — android/app/build.gradle
android {
// Target SDK 35 is mandatory for new submissions (Aug 2025)
compileSdkVersion 35

defaultConfig {
applicationId "com.yourcompany.appname"
minSdkVersion 21
targetSdkVersion 35// Required — Android 15
versionCode 1// Increment for every Play Store upload
versionName "1.0.0"
}
}
ℹ️

versionCode must strictly increase with every upload. Google Play will reject a build if versionCode is the same as or lower than the previous release.

Then clean previous build artifacts and fetch all dependencies:

Bash — Clean & Fetch
flutter clean
flutter pub get
3

Generate Upload Keystore

Create a signing key — required once per app, stored securely forever

Google Play uses two separate keys: an upload key (you manage) and an app signing key (Google manages via Play App Signing). You only need to generate the upload keystore.

BASH — MACOS / LINUX
keytool -genkey -v \
-keystore ~/upload-keystore.jks \
-keyalg RSA \
-keysize 2048 \
-validity 10000 \
-alias upload
POWERSHELL — WINDOWS
keytool -genkey -v `
-keystore $env:USERPROFILE\upload-keystore.jks `
-storetype JKS `
-keyalg RSA `
-keysize 2048 `
-validity 10000 `
-alias upload

Follow the prompts to enter your keystore password, key password, and organization details. Then create a key.properties file in the android/ directory:

PROPERTIES — ANDROID/KEY.PROPERTIES
storePassword = your_keystore_password
keyPassword = your_key_password
keyAlias = upload
storeFile = ../upload-keystore.jks# relative path from android/app/
🔐

Never commit key.properties or the .jks file to Git. Add both to your .gitignore immediately. In CI/CD pipelines, inject these values via environment variables instead.

4

Configure Gradle Build Script

Wire your keystore into the release build type

Open android/app/build.gradle and add the signing configuration to link your upload keystore to release builds:

GROOVY — ANDROID/APP/BUILD.GRADLE
// Add at the top of the file, before the android block
def keystorePropertiesFile = rootProject.file('app/key.properties')
def keystoreProperties = new Properties()
keystoreProperties.load(new FileInputStream(keystorePropertiesFile))

android {
signingConfigs {
release {
keyAlias keystoreProperties['keyAlias']
keyPassword keystoreProperties['keyPassword']
storeFile file(keystoreProperties['storeFile'])
storePassword keystoreProperties['storePassword']
}
}

buildTypes {
release {
signingConfig signingConfigs.release
minifyEnabled true// Enable R8 code shrinking
shrinkResources true// Remove unused resources
}
}
}
ℹ️

You may need to run flutter clean after changing the Gradle file to prevent cached builds from affecting the signing process.

5

Build Release AAB

⚡ AAB Mandatory

APK uploads are rejected by Google Play — AAB is required for all submissions

FormatUse CasePlay Store UploadFile Size
AAB(.aab)Play Store production release✓ Required15–30 MB typical
APK(.apk)QA testing, direct distribution, enterpriseX Rejected for new appsLarger (all ABIs bundled)

Build AAB for Play Store submission:

Bash — Build Release AAB (Recommended)
# Standard release build
flutter build appbundle --release

# Output location:
# build/app/outputs/bundle/release/app-release.aab
Bash — Build with Obfuscation (Production Recommended)
flutter build appbundle --release \
--obfuscate \
--split-debug-info=build/app/outputs/symbols

# --obfuscate: Scrambles Dart class/method names (prevents reverse engineering)
# --split-debug-info: Saves symbol maps for Firebase Crashlytics crash reports
# Keep the symbols/ folder safe — needed for decoding crash logs
ℹ️

If you still need an APK for QA testing or direct distribution (not Play Store), build a split APK instead of a fat APK: flutter build apk --release --split-per-abi . This generates separate, smaller APKs per CPU architecture.

Your AAB will be generated at: build/app/outputs/bundle/release/app-release.aab

6

Google Play Console — App Setup

Create your app listing and complete required store details

1

Create a Google Play Developer Account

Register at play.google.com/console . Pay the one-time $25 USD registration fee to access the Play Console.

2

Create a New App

Click Create app → Enter app name, select default language, choose app or game type, and set free or paid status. Accept the declarations and click Create app.

3

Complete the Setup Checklist

Play Console shows a "Set up your app" checklist. Complete all required sections: App content, Content rating, Data safety, Target audience, and Privacy policy.

4

Enable Play App Signing

In Setup → App integrity, enroll in Play App Signing. Google will manage your deployment key — you only upload with your upload key. This is the recommended approach for all new apps.

5

Complete Store Listing

Add your app icon (512×512px PNG, no alpha), screenshots (minimum 2), short description (80 characters max), and full description (up to 4,000 characters).

⚠️

Package name cannot be changed after your app is published. Double-check the applicationId in build.gradle before your first submission.

7

Testing Tracks — Test Before Production

Always test through Internal Testing before promoting to Production

Google Play Console offers multiple testing tracks. Always release through Internal Testing first to validate the AAB in a real Play Store environment before going live.

TrackTestersReview RequiredWhen to Use
Internal TestingUp to 100 (by email)InstantFirst AAB validation, team testing
Closed (Alpha)Groups or unlimited by linkFast (hours)Beta testers, wider feedback
Open (Beta)Public opt-inStandardPre-launch public testing
ProductionAll usersStandard (1–3 days)Full public release
1

Navigate to Internal Testing

In Play Console, go to Testing → Internal testing in the left sidebar.

2

Create a New Release

Click Create new release. Upload your app-release.aab file. Play Console will validate the AAB for errors and policy violations.

3

Add Testers

Add tester email addresses. They will receive an opt-in link to install the app via the Play Store — simulating the exact production install experience.

8

Publish to Production

Submit your app for Google Play review and public release

1

Promote from Testing or Create Production Release

In Internal Testing, click Promote release → Production. Alternatively, go to Production → Create new release and upload your AAB directly.
2

Upload the AAB

Click Upload and select your signed app-release.aab . Play Console will validate the file and confirm it is signed in release mode.
3

Configure Release Details

Fill in the release name(e.g. "1.0.0") and release notes (what's new). Verify all information is accurate before proceeding.
4

Choose Rollout Strategy (Optional)

Gradual rollout — release to a percentage of users (e.g. 10%, then 50%, then 100%) to catch issues early. Full rollout — release to all users immediately.
5

Review and Send for Review

Review all details and click Review release → Start rollout to production. Your app enters Google Play's review queue.
6

Review Timeline

New developer accounts:3–7 days(stricter scrutiny). Established accounts: 1–3 days. Once approved, the app becomes available on Google Play Store.
7

Monitor Performance

After launch, track performance in Play Console under Android vitals. Monitor crash rates, ANRs, installation metrics, user ratings, and reviews. Respond to feedback promptly.
ℹ️

For every subsequent update, always increment versionCode in build.gradle before building. Play Store will reject any upload with the same or lower versionCode as an existing release.

Conclusion

By following these steps, you can successfully build and publish your Flutter app to Google Play Store. Remember to always use AAB format , target SDK 35 , and back up your keystore file securely. Keep your app updated regularly, monitor Android Vitals for performance issues, and respond promptly to user feedback to maintain a high rating and ensure a positive user experience.