How to sign Flutter app bundle in order to publish it to Play Store?

1.3k Views Asked by At

I am following the guidance to open Android Studio and to select click Build > Generate Signed Bundle/APK.

There is no menu Build > Generate in Android Studio:

enter image description here

My Android Studio is freshest:

Android Studio Flamingo | 2022.2.1 Patch 2
Build #AI-222.4459.24.2221.10121639, built on May 12, 2023
Runtime version: 17.0.6+0-17.0.6b802.4-9586694 aarch64
VM: OpenJDK 64-Bit Server VM by JetBrains s.r.o.
macOS 13.4
GC: G1 Young Generation, G1 Old Generation
Memory: 2280M
Cores: 10
Metal Rendering is ON
Registry:
    dart.server.additional.arguments=autosnapshotting-thresholdMb-200,increaseMb-100,dir-/Users/polinach/Downloads/analyzer_snapshots,dirLimitMb-10000,delaySec-20
    actionSystem.assertFocusAccessFromEdt=false
    external.system.auto.import.disabled=true
    actionSystem.fix.alt.gr=false
    actionSystem.getContextByRecentMouseEvent=true
    ide.text.editor.with.preview.show.floating.toolbar=false
    gradle.version.catalogs.dynamic.support=true

Non-Bundled Plugins:
    Dart (222.4582)
    io.flutter (74.0.2)

What am I missing?

1

There are 1 best solutions below

4
Abdullah Bahattab On BEST ANSWER

On macOS or Linux, use the following command:

  keytool -genkey -v -keystore ~/upload-keystore.jks -keyalg RSA \
      -keysize 2048 -validity 10000 -alias upload

On Windows, use the following command in PowerShell:

  keytool -genkey -v -keystore %userprofile%\upload-keystore.jks ^
      -storetype JKS -keyalg RSA -keysize 2048 -validity 10000 ^
      -alias upload

Note: The keytool command might not be in your path—it’s part of Java, which is installed as part of Android Studio. For the concrete path, run flutter doctor -v and locate the path printed after ‘Java binary at:’. Then use that fully qualified path replacing java (at the end) with keytool. If your path includes space-separated names, such as Program Files, use platform-appropriate notation for the names. For example, on Mac/Linux use Program\ Files, and on Windows use "Program Files".

The -storetype JKS tag is only required for Java 9 or newer. As of the Java 9 release, the keystore type defaults to PKS12.

Create a file named [project]/android/key.properties that contains a reference to your keystore. Don’t include the angle brackets (< >). They indicate that the text serves as a placeholder for your values.

storePassword=<password-from-previous-step>
keyPassword=<password-from-previous-step>
keyAlias=upload
storeFile=<keystore-file-location>

The storeFile might be located at /Users/<user name>/upload-keystore.jks on macOS or C:\\Users\\<user name>\\upload-keystore.jks on Windows.

  1. Add the keystore information from your properties file before the android block:
   def keystoreProperties = new Properties()
   def keystorePropertiesFile = rootProject.file('key.properties')
   if (keystorePropertiesFile.exists()) {
       keystoreProperties.load(new FileInputStream(keystorePropertiesFile))
   }

   android {
         ...
   }
  1. Find the buildTypes block:
   buildTypes {
       release {
           // TODO: Add your own signing config for the release build.
           // Signing with the debug keys for now,
           // so `flutter run --release` works.
           signingConfig signingConfigs.debug
       }
   }

And replace it with the following signing configuration info:

   signingConfigs {
       release {
           keyAlias keystoreProperties['keyAlias']
           keyPassword keystoreProperties['keyPassword']
           storeFile keystoreProperties['storeFile'] ? file(keystoreProperties['storeFile']) : null
           storePassword keystoreProperties['storePassword']
       }
   }
   buildTypes {
       release {
           signingConfig signingConfigs.release
       }
   }

Note: You might need to run flutter clean after changing the gradle file. This prevents cached builds from affecting the signing process.

I just following this link and I got the app to publish. flutter offical