Preparing Flutter App For Android Release (Google Play)

2022-06-19
Flutter
Dart
development
Android
Google Play

The Problem

Flutter app is surprisingly unprepared for the production release on Google Play - the iOS release is a relatively straightforward matter, where XCode (mostly) tells you what's missing, while Android app happily builds but then Google Play store starts throwing errors like "You uploaded an APK or Android App Bundle that was signed in debug mode" or "Keystore file not set for signing config release".

So here's what needs to be done.

The Solution

  • android/app/build.gradle should have defaultConfig.applicationId set to actual identifier, like e.g. net.hydralien.pictuvert - otherwise the store will complain that it's unavailable.

  • If you're uploading a new build, it's number should be incremented after "+" in pubspec.yaml (e.g. "version: 1.0.0+1")

  • android/key.properties file should exist (it's hidden from the version control), and have e.g.

    storePassword=YourPassword
    keyPassword=YourPassword
    keyAlias=upload
    storeFile=/Users/halien/upload-keystore.jks
    
  • android/app/build.gradle should have keystore definition at the top, before "android" section:

      def keystoreProperties = new Properties()
      def keystorePropertiesFile = rootProject.file('key.properties')
      if (keystorePropertiesFile.exists()) {
          keystoreProperties.load(new FileInputStream(keystorePropertiesFile))
      }
    
  • it also needs to define prod signing config before "buildTypes" section, like so:

      signingConfigs {
          release {
              keyAlias keystoreProperties['keyAlias']
              keyPassword keystoreProperties['keyPassword']
              storeFile keystoreProperties['storeFile'] ? file(keystoreProperties['storeFile']) : null
              storePassword keystoreProperties['storePassword']
          }
      }
    
  • and then inside the "buildTypes" section, igningConfig signingConfigs.debug should be changed to igningConfig signingConfigs.release

With all that in place, running flutter build appbundle should produce a valid production-signed bundle at build/app/outputs/bundle/release/app-release.aab

Hope this saves me some time next time I face this.