How to Publish a Flutter App on Google Play
Flutter compiles Dart code directly to native ARM code for Android, resulting in fast, smooth apps. The Android build process uses Gradle under the hood, but Flutter's tooling abstracts much of the complexity. This guide walks through generating a signed Android App Bundle, configuring Play App Signing, and navigating Google Play Console's requirements.
Prerequisites
- Flutter SDK 3.16+ installed
- Android Studio with SDK 33+ and command-line tools
- A Google Play Developer account ($25 one-time fee)
- JDK 17 installed and configured
- Your app tested on multiple Android emulators and devices
Step-by-Step Build Process
Create an upload keystore
Run `keytool -genkey -v -keystore ~/upload-keystore.jks -keyalg RSA -keysize 2048 -validity 10000 -alias upload`. Store this keystore securely. Create a key.properties file in android/ referencing the keystore path, password, and alias.
Configure Gradle signing
Edit android/app/build.gradle to read from key.properties and add the signing config to the release build type. Ensure the key.properties file is in .gitignore to avoid committing credentials.
Build the App Bundle
Run `flutter build appbundle --release`. Flutter compiles Dart to native code and packages everything into an AAB at build/app/outputs/bundle/release/app-release.aab. The AAB format is required by Google Play.
Verify the bundle
Use `flutter build appbundle --analyze-size` to check the bundle size. Install and test the release build on a device using `flutter install --release` to catch any release-mode-only issues.
Code Signing & Certificates
Set up Play App Signing
When uploading your first AAB, enroll in Play App Signing. Google manages the app signing key while you use the upload key. This protects against upload key loss — Google can generate a new upload key if needed.
Backup your upload keystore
While Google can reset your upload key, it's still best practice to back up the keystore file and key.properties securely. Store copies in a password manager or secure cloud storage.
Store Submission Steps
Create the app in Play Console
Click 'Create app', fill in app details. Choose the appropriate category. Flutter apps should use 'Application' type unless you're using Flame for games.
Complete the store listing
Add descriptions, screenshots, and graphics. Flutter's consistent rendering means you can use any Android device/emulator for screenshots. Include at least phone screenshots — tablet screenshots are optional but recommended.
Upload and configure release
Navigate to Release > Production > Create new release. Upload the AAB. Fill in release notes. Google processes the bundle and generates optimized APKs for each device configuration.
Complete compliance checklist
Fill in content rating, target audience, data safety form, and advertising declarations. All sections must be complete before you can roll out.
Roll out to production
Review the release summary and roll out. First-time app reviews can take 1-7 days. Consider using staged rollouts (10-20% initially) for larger apps.
Common Rejection Reasons & Fixes
Data Safety section incomplete
Flutter apps using packages like http, dio, firebase_analytics, or shared_preferences collect or store data. Declare everything accurately in the Data Safety form. Check each Flutter package's documentation for data collection details.
Crashes on specific devices
Flutter's Impeller renderer may cause issues on some GPUs. If crash reports show rendering errors, test with `--no-enable-impeller` flag and consider adding fallback logic. Check Firebase Crashlytics for device-specific patterns.
Permissions not justified
Google scrutinizes apps requesting broad permissions. Only declare permissions your app actually uses in AndroidManifest.xml. Remove unused plugin permissions by adding `<uses-permission android:name='...' tools:node="remove"/>` entries.
App icon doesn't meet guidelines
Google requires adaptive icons (foreground + background layers). Use the flutter_launcher_icons package with adaptive_icon_foreground and adaptive_icon_background configurations to generate compliant icons.
Pro Tips
- Use `flutter build appbundle --obfuscate --split-debug-info=build/debug-info` to obfuscate Dart code and reduce reverse engineering
- Enable R8/ProGuard in build.gradle for additional code shrinking and obfuscation
- Test on Android Go devices — they have limited memory and Flutter apps need optimization for these targets
- Use the Google Play Console's pre-launch report to catch issues before review
- Set `minSdkVersion` to 21 or higher — supporting Android 5.0+ covers 99%+ of active devices
Skip the hassle. Let us handle it.
Publishing a Flutter app on the Google Play (Android) involves dozens of steps, certificates, and potential rejection pitfalls. Our team handles the entire process for you — from build configuration to store approval.