Short answer
Create an upload keystore if you don’t have one, point the release build type at it in Gradle, and build a release bundle (flutter build appbundle, or Build > Generate Signed App Bundle in Android Studio). Check the signer with keytool before you upload. Keep the keystore and passwords out of git, and give CI the same file through secrets.
Rather not fix it yourself? App Fix Ticket starts with a fixed-price diagnosis, then a fixed price for the fix before any fix work.
Why the bundle is debug signed, and the fix
01
The debug key signed the build
“most app stores (including the Google Play Store) do not accept apps signed with a debug certificate for publishing.” Android Developers, Sign your app
Every debug or run build is signed with a key the tools make for you. It is fine for testing and refused for publishing.
02
Flutter’s release build still uses the debug key
“When building your app in release mode, configure Gradle to use your upload key.” Flutter docs, Build and release an Android app
A new Flutter project signs release builds with the debug key so flutter run --release works. Replace that line with a release signing config that reads android/key.properties, which holds storePassword, keyPassword, keyAlias and storeFile.
// android/app/build.gradle.kts, at the top import java.util.Properties import java.io.FileInputStream val keystoreProperties = Properties() val keystorePropertiesFile = rootProject.file("key.properties") if (keystorePropertiesFile.exists()) { keystoreProperties.load(FileInputStream(keystorePropertiesFile)) } // inside android { } signingConfigs { create("release") { keyAlias = keystoreProperties["keyAlias"] as String keyPassword = keystoreProperties["keyPassword"] as String storeFile = keystoreProperties["storeFile"]?.let { file(it) } storePassword = keystoreProperties["storePassword"] as String } } buildTypes { release { signingConfig = signingConfigs.getByName("release") } }03
CI builds without the keystore
“Keep the key.properties file private; don't check it into public source control.” Flutter docs, Build and release an Android app
key.properties and the keystore should stay out of git, so a CI job doesn’t have them unless you add them. Store both as CI secrets, write them to disk in the job, and fail the job if they are missing.
04
Check the signer before you upload
keytool prints the certificate that signed the bundle. A debug build shows CN=Android Debug as the owner.
keytool -printcert -jarfile build/app/outputs/bundle/release/app-release.aab05
The upload key isn’t the app signing key
“you need to sign your app bundle with an upload key before uploading it to the Play Console, and Play App Signing takes care of the rest.” Android Developers, Sign your app
With Play App Signing, you sign with an upload key and Google signs the copy users install. If Play then says the bundle is signed with the wrong key, that is a different error: the upload key doesn’t match the one Play has on file.
Checked against the vendor’s docs on : Android Developers: Sign your app; Flutter docs: Build and release an Android app.
Rather hand it over?
Fixed scope, fixed price, paid upfront. The work happens in writing; no call needed.
“Very responsive, attentive to fixing bugs, and completed the project as needed! Thank you!”
Related: Google Play debuggable APK or bundle · Google Play app bundle signed with the wrong key · Google Play version code already used · Google Play target API level 35