Skip to main content

Migrating Flutter Android app to Android Gradle Plugin 9.0.0

How to migrate your Flutter app's Android Gradle files to build apps with Android Gradle Plugin 9.0.0+.

Summary

#

To build a Flutter app for Android, the Android Gradle Plugin (AGP) must be applied. As of AGP 9.0.0, the following migrations are required to successfully apply AGP 9+.

First, built-in Kotlin is the new default, meaning any apps using the kotlin-android plugin will not build successfully. You must migrate from kotlin-android to built-in Kotlin.

Second, AGP 9+ will only use the new AGP DSL interfaces. This means any old DSL types will not be properly read. The Flutter team is working on migrating old DSL types to use the new DSL: Issue #180137. In the meantime, you can set a gradle property flag to use the old DSL.

In a future Flutter release, support will be added for applying AGP 9+. For now, all projects must be migrated manually.

To learn more about Android Gradle Plugin, see the Android Gradle Plugin docs.

Migrate

#

These instructions assume you are updating from an AGP version created before 9.0.0 to an AGP version 9.0.0+. You should also use the minimum compatible dependency versions listed in the Android Gradle Plugin docs.

Update the Gradle file

#

If your app doesn't apply the kotlin-android plugin (also called Kotlin Gradle Plugin), then skip to the next step.

First, find the kotlin-android plugin, likely located in the plugins block of the <app-src>/android/build.gradle or <app-src>/android/build.gradle.kts file. As an example, consider the build.gradle.kts file from a Flutter app created before this change:

Before:

kotlin
plugins {
    id("com.android.application")
    id("kotlin-android")
    // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins.
    id("dev.flutter.flutter-gradle-plugin")
}

android {
    ...
    kotlinOptions {
        jvmTarget = JavaVersion.VERSION_17.toString()
    }
    ...
}
...

Next, remove the kotlin-android plugin and the kotlinOptions block:

kotlin
ugins {
  id("com.android.application")
  -id("kotlin-android")
  // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins.
  id("dev.flutter.flutter-gradle-plugin")


droid {
  ...
  -kotlinOptions {
      -jvmTarget = JavaVersion.VERSION_17.toString()
  -}
  ...

Replace the kotlinOptions block with the following:

kotlin
otlin {
  +compilerOptions {
      +jvmTarget = org.jetbrains.kotlin.gradle.dsl.JvmTarget.JVM_17
  +}

Here is how the file will likely end up:

After:

kotlin
plugins {
    id("com.android.application")
    // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins.
    id("dev.flutter.flutter-gradle-plugin")
}

android {
    ...
    kotlin {
        compilerOptions {
            jvmTarget = org.jetbrains.kotlin.gradle.dsl.JvmTarget.JVM_17
        }
    }
    ...
}
...

Set the Gradle property flag

#

Next, to use the old AGP DSL, set the gradle property flag android.newDsl to false in your app's <app-src>/android/gradle.properties file.

properties
g.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError
droid.useAndroidX=true
android.newDsl=false

Validate

#

Execute flutter run to confirm that your app builds and launches on a connected Android device or emulator.

Timeline

#

In stable release: TBD (for more details, see issue Issue #179914)

References

#

Relevant issue: Issue #175688: Audit flutter for compatibility with the AGP 9.0.0 Issue #180137: Migrate from old to new AGP DSL

The Gradle build files in your app vary based on the Flutter version used when your app was created. Consider staying up-to-date with the latest version of the build files by periodically running flutter upgrade in your app's directory.