Welcome to Izz — practical tech reviews, gadget picks & buying guides.

Learn more

How to Fix Flutter Gradle Build Errors: Java, AGP, Kotlin and SDK Troubleshooting

Updated: September 2026

Flutter Android build errors often look more complicated than they really are.

One failed build can produce dozens of lines mentioning Gradle, Java, Kotlin, Android SDK, plugins and task names.

The key is not to fix every line.

The key is to find the first meaningful failure and identify which layer of the Android toolchain is actually broken.

This guide shows how to diagnose Flutter Gradle build errors systematically instead of randomly changing Java, Gradle and Android settings until the project happens to build.

The Most Important Rule

Do not start with the final line that says BUILD FAILED.

Scroll upward and look for the first specific error that explains why the build failed.

Understand the Flutter Android Build Stack

A Flutter Android build depends on several layers working together.

Layer What It Does
Flutter / Dart Compiles application code and invokes Android build tooling
Flutter plugins Connect Dart code to Android platform functionality
Gradle Runs the Android build
Android Gradle Plugin Provides Android-specific Gradle build logic
Kotlin / Java Compiles Android-side source code and plugins
Android SDK Provides platform APIs and build tools
Signing Signs release APK or AAB files

If one layer is incompatible with another, the build can fail even when your Dart code is completely correct.

Step 1: Reproduce the Error Clearly

Run the failing command from the project root.

For a normal debug build:

flutter run

For an Android App Bundle:

flutter build appbundle

For an APK:

flutter build apk

Do not make several configuration changes before you can reproduce the original error consistently.

Step 2: Read the First Meaningful Error

Gradle frequently prints secondary failures after the real problem.

Look for messages such as:

  • Unsupported class file major version
  • Minimum supported Gradle version
  • Plugin requires a newer Android Gradle Plugin
  • Android SDK not found
  • Failed to find target with hash
  • Kotlin version incompatible
  • Manifest merger failed
  • Duplicate class
  • Could not resolve dependency
  • Signing configuration error

That message tells you which layer to investigate.

Flutter Gradle Error Diagnostic Table

Error Pattern Likely Cause Check First
Unsupported class file major version Java and Gradle incompatibility Active Java version
Minimum supported Gradle version Gradle too old for AGP or plugin Gradle wrapper
Requires newer Android Gradle Plugin AGP too old AGP version and project age
Kotlin plugin/version error Kotlin configuration incompatible settings.gradle or build configuration
SDK location not found Android SDK path missing flutter doctor -v
Failed to find target / platform Missing SDK platform Android SDK Manager
Could not resolve dependency Network, repository or package problem Dependency name and repositories
Manifest merger failed AndroidManifest conflict First manifest conflict listed
Duplicate class Conflicting dependencies Plugin/dependency tree
Keystore / signing error Release signing configuration key.properties and keystore path

Step 3: Check Which Java Flutter Is Actually Using

This is one of the most common sources of confusion.

Your computer can have multiple Java installations.

Flutter may use a different Java runtime from the one returned by:

java -version

Run:

flutter doctor -v

Look for the line showing:

Java binary at:

That is the Java installation Flutter is actually using.

Why This Matters

Gradle versions only support certain Java versions.

A newer JDK with an older Gradle wrapper can produce errors such as:

Unsupported class file major version

Flutter's own migration documentation specifically warns about Java and Gradle compatibility.

Do Not Change Java Before Checking Gradle

A common mistake is:

  1. See a Java error.
  2. Install another JDK.
  3. Change JAVA_HOME.
  4. Still get an error.
  5. Install yet another Java version.

This can leave several JDKs installed while making it harder to know which one Flutter uses.

First identify:

  • Flutter version
  • Java version Flutter uses
  • Gradle wrapper version
  • Android Gradle Plugin version

Then check compatibility.

Step 4: Check the Gradle Wrapper

The Gradle version for a Flutter Android project is normally controlled by the wrapper inside the Android directory.

Look at:

android/gradle/wrapper/gradle-wrapper.properties

The distribution URL contains the Gradle version.

Example structure:

distributionUrl=https\://services.gradle.org/distributions/gradle-X.X-all.zip

Do not blindly copy a Gradle version from an old Stack Overflow answer.

The correct version depends on the AGP and Java combination used by the project.

Step 5: Check Android Gradle Plugin Compatibility

Android Gradle Plugin, commonly shortened to AGP, sits between Android development and Gradle.

Older Flutter projects may use older AGP structures, while projects generated by newer Flutter versions use newer Gradle configuration patterns.

If you recently upgraded Flutter or Android Studio and an old project suddenly fails, AGP/Gradle compatibility is one of the first places to check.

Use Flutter's Suggestions Before Guessing

Flutter's migration guidance recommends running:

flutter analyze --suggestions

when diagnosing Java, AGP and Gradle compatibility problems.

If Flutter reports an incompatible tool combination, follow the compatibility recommendation rather than choosing arbitrary versions.

Step 6: Be Careful With Old Flutter Android Projects

Flutter's Android Gradle structure has changed over time.

An old project may use an older method of applying Flutter Gradle plugins, while current projects use a declarative plugin configuration.

For that reason, copying an old project's entire android/ directory into a modern Flutter project can create build problems.

Likewise, following a 2021 tutorial line-by-line can introduce obsolete configuration.

Step 7: Check Kotlin Configuration

Kotlin compatibility matters because many Flutter plugins contain Android-side Kotlin code.

Flutter requires a sufficiently recent Kotlin setup, and newer Android Gradle Plugin releases are changing how Kotlin is integrated into Android builds.

In older Flutter projects, Kotlin may be configured differently from newer projects.

For Flutter projects created with newer build templates, version information may appear in:

android/settings.gradle

or:

android/settings.gradle.kts

rather than only in the old project-level build.gradle structure.

Do Not Automatically Add ext.kotlin_version

Old tutorials often tell users to add or modify:

ext.kotlin_version

That advice applies to older Gradle project structures.

Before editing, identify which Flutter Android build format your project actually uses.

AGP 9 and Built-In Kotlin

Android Gradle Plugin 9 introduces another important migration point.

AGP 9 uses built-in Kotlin support, and projects still relying on the legacy Kotlin Android plugin may require migration.

Flutter has documented a migration path for projects moving to AGP 9 and later.

This is another reason not to upgrade AGP independently without checking whether the Flutter project and plugins support the new configuration.

Step 8: Check Android SDK Versions

Flutter normally manages sensible Android SDK defaults through variables such as:

flutter.compileSdkVersion
flutter.minSdkVersion
flutter.targetSdkVersion

For many projects, these defaults should be left alone.

Flutter's Android release documentation says you typically only need to override them when a plugin or feature requires a different minimum or compile SDK level.

Common SDK Problems

  • Required Android platform not installed
  • Plugin requires a higher minSdk
  • compileSdk too old for a dependency
  • Android SDK path is invalid
  • Build tools installation is damaged

Use Android SDK Manager to confirm that the required platform exists.

Fix: Plugin Requires a Higher minSdk

You may encounter an error where a plugin requires a higher minimum Android API level than the project default.

Do not lower the plugin requirement.

If your product can accept dropping support for older Android versions, increase the project's minSdk appropriately.

Flutter's release documentation explicitly notes that plugins may require a higher minSdk than Flutter's default.

Step 9: Check Flutter Package Compatibility

Run:

flutter pub outdated

to inspect dependency versions.

Also run:

flutter pub get

to verify that dependency resolution succeeds.

If the failure started immediately after adding one package, that package should be high on the suspect list.

Fix: Could Not Resolve Dependency

This does not always mean Gradle itself is broken.

Possible causes include:

  • Temporary network failure
  • Repository unavailable
  • Incorrect dependency coordinates
  • Plugin referencing an unavailable Android dependency
  • Repository configuration problem

Read the exact dependency name Gradle cannot resolve.

That is more useful than deleting the whole Gradle cache immediately.

Step 10: Check Repository Configuration

Modern Android Gradle projects increasingly centralize repository configuration.

Common repositories include:

google()
mavenCentral()

Flutter also needs access to Flutter's Android artifacts where appropriate.

Do not add random Maven repositories simply because a build is failing.

Only add a repository when a dependency actually requires it.

Fix: Manifest Merger Failed

A manifest merger error usually means two Android configuration sources conflict.

Possible sources include:

  • Your app's AndroidManifest.xml
  • A Flutter plugin
  • Android permissions
  • Application attributes
  • Activity configuration

Gradle normally tells you which attributes conflict.

Fix that exact conflict rather than replacing the entire manifest.

Fix: Duplicate Class Error

A duplicate class usually means two dependencies include overlapping Android classes.

Common triggers include:

  • Two plugins depending on incompatible versions of the same library
  • Old Android support libraries mixed with AndroidX
  • Manual Android dependency duplicating one already supplied by a plugin

Identify which libraries provide the duplicated class before excluding dependencies blindly.

Fix: Namespace Error

Modern Android Gradle Plugin versions require Android modules to define a namespace.

Older Flutter plugins may fail if their Android module has not been updated for newer AGP expectations.

If the error comes from a dependency rather than your own app, first check whether a newer plugin version exists.

Editing cached package files should be a last resort because those changes can disappear the next time dependencies are refreshed.

Step 11: Use flutter clean Only When It Makes Sense

Run:

flutter clean

when stale generated build files may be involved.

Then:

flutter pub get

and rebuild.

Flutter's release documentation specifically notes that flutter clean can be useful after changing Gradle signing configuration because cached builds may otherwise interfere.

But flutter clean is not a universal fix for version incompatibility.

If Java and Gradle are incompatible, cleaning the project will not make them compatible.

Do Not Delete Every Cache First

Deleting Gradle caches can force dependencies to download again and may fix genuinely corrupted files.

It can also turn a clear build error into a long re-download process without fixing the underlying problem.

Try targeted diagnosis first.

Step 12: Compare With a Fresh Flutter Project

This is one of the best diagnostic techniques.

Create a clean project:

flutter create gradle_test

Then try:

cd gradle_test
flutter build apk

If the Fresh Project Also Fails

The problem is probably in the development environment:

  • Java
  • Android SDK
  • Flutter installation
  • Gradle download/network environment

If the Fresh Project Builds

The environment is probably usable.

Focus on the original project's:

  • Plugins
  • Gradle configuration
  • AndroidManifest
  • Old project structure
  • Signing configuration

Step 13: Diagnose Release-Only Gradle Errors Separately

If:

flutter run

works but:

flutter build appbundle

fails, do not assume the entire Android environment is broken.

The issue may be release-specific.

Common Release-Only Causes

  • Keystore path
  • Wrong key alias
  • Incorrect password
  • Missing key.properties
  • R8 or shrinking configuration
  • Release-only environment variables

Fix: Keystore or Signing Error

Flutter's official Android release workflow uses:

android/key.properties

to reference the upload keystore.

On Windows, file paths inside this configuration may require escaped backslashes.

For example:

C:\\Users\\YourName\\upload-keystore.jks

Keep key.properties and private signing material out of public source control.

Step 14: Check the Build Outside Flutter

Sometimes running Gradle directly can provide more focused Android build output.

From the project:

cd android

On Windows:

gradlew.bat tasks

or another appropriate Gradle command.

This can help separate a pure Android Gradle issue from Flutter tooling.

Step 15: Change One Thing at a Time

This is the most valuable troubleshooting habit.

Do not simultaneously:

  • upgrade Flutter
  • change Java
  • change Gradle
  • change AGP
  • upgrade every plugin
  • delete caches

If the build starts working afterward, you will not know which change fixed it.

Worse, you may introduce a second compatibility problem while fixing the first.

A Better Flutter Gradle Troubleshooting Flow

Use This Order

  1. Reproduce the error.
  2. Find the first meaningful failure.
  3. Run flutter doctor -v.
  4. Identify the active Java version.
  5. Check Gradle and AGP compatibility.
  6. Check Android SDK requirements.
  7. Check Kotlin only if the error points there.
  8. Check recently added plugins.
  9. Compare with a fresh Flutter project.
  10. Use flutter clean only when stale outputs are plausible.
  11. Investigate signing separately for release-only failures.

When Should You Upgrade Flutter?

Upgrade intentionally, not as a panic button.

A Flutter upgrade can solve compatibility problems when a project genuinely needs newer Android tooling.

But it can also require updates to plugins and Android build files.

Before upgrading an important project:

  • Commit your current work to Git.
  • Record the Flutter version that currently works.
  • Review package compatibility.
  • Test the upgrade on a branch if possible.

When Should You Regenerate the Android Folder?

Regenerating platform files can help when a very old Flutter Android structure is difficult to migrate.

But do not delete the Android folder casually if it contains custom:

  • permissions
  • Firebase configuration
  • signing setup
  • deep links
  • native code
  • Gradle customizations

Back up and understand those changes first.

Common Mistakes That Make Gradle Errors Worse

Copying Versions From Random Tutorials

Gradle, AGP and Java compatibility changes over time.

Fixing the Last Error Instead of the First

The last error is often only the result of an earlier failure.

Using flutter clean as the Only Strategy

Cleaning cannot solve genuine tool-version incompatibility.

Changing Java Without Checking Which Java Flutter Uses

The terminal Java version may not be the same JDK Flutter is using.

Editing Package Cache Files

Those changes can be overwritten and may hide the need for a maintained plugin version.

Upgrading Everything at Once

This destroys your ability to identify the actual cause.

Final Checklist

Before declaring a Flutter Gradle problem mysterious, check:

  • You found the first meaningful error.
  • You ran flutter doctor -v.
  • You know which Java Flutter is using.
  • You checked Gradle and AGP compatibility.
  • The required Android SDK platform is installed.
  • The project's Kotlin configuration matches its build structure.
  • Plugins are reasonably current and compatible.
  • A fresh Flutter project builds in the same environment.
  • Release signing is checked separately when only release builds fail.

Final Thoughts

Most Flutter Gradle errors are not solved by memorizing one magic command.

They are solved by identifying which layer of the build stack is failing.

Think in this order:

Flutter → plugin → Gradle → AGP → Java/Kotlin → Android SDK → signing.

Once you know the failing layer, the error message becomes much easier to understand.

The best habit is simple: change one relevant thing at a time and verify the result.

Continue the Flutter Android Series

Official Sources & Further Reading

Daddy Izz
Daddy Izz

Writing about tech, gadgets and buying guides at Izz.