[Flutter] Module was compiled with an incompatible version of Kotlin. The binary version of its metadata is 1.9.0, expected version is 1.6.0.

  • FlutterでAndroidアプリを開発中
  • build時にModule was compiled with an incompatible version of Kotlin. The binary version of its metadata is 1.9.0, expected version is 1.6.0.というようなエラーが出る

1. Kotlinのバージョンを最新にする

タイトルのようなエラーメッセージで調べていてすぐに出てくる解決策は、以下のようにKotlinのバージョンを最新にするという情報かと思います。

■対象ファイル:{PROJECT}/android/build.gradle

buildscript {
    ext.kotlin_version = '1.7.10' <- ここを最新バージョンにする
    repositories {
        google()
        mavenCentral()
    }

    dependencies {
        classpath 'com.android.tools.build:gradle:7.3.0'
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
    }
}

(以下略)

これで解決した方はもうこの記事は閉じていただいて大丈夫です。

2. Kotlinのバージョンを最新にしても解決しない場合

あまり情報が出てこなかったためもしかしたら珍しいケースなのかもしれませんが、Kotlinのバージョンを最新にするだけでは解決しないことがありました(タイトルのエラーは消えるのですが別のエラーが出ました)。

以下の情報は試行錯誤しながら修正していった情報を整理したものであり、すべてが必要かは状況によると思いますので、少しずつ試していっていただくと良いかと思います。

エラーメッセージの確認

まずは1. Kotlinのバージョンを最新にするを試しても変わらないエラーの確認です。

e: {PATH_TO_PROJECT}/build/image_gallery_saver/.transforms/281ca46a94cc94c4acb0a67341989ad7/transformed/out/jars/classes.jar!/META-INF/image_gallery_saver_release.kotlin_module: Module was compiled with an incompatible version of Kotlin. The binary version of its metadata is 1.9.0, expected version is 1.6.0.
e: /home/{USER_HOME}/.gradle/caches/transforms-3/2a906bd74167c91b7d8f79a19e3e5ee2/transformed/jetified-activity-1.7.2/jars/classes.jar!/META-INF/activity_release.kotlin_module: Module was compiled with an incompatible version of Kotlin. The binary version of its metadata is 1.8.0, expected version is 1.6.0.

(以下略)

実施事項1

色々と調べていたところGradleのバージョンも関係している可能性がありそうということが判明したので、以下のように修正しました。

■対象ファイル:{PROJECT}/android/build.gradle

buildscript {
    ext.kotlin_version = '1.8.22' <- ここをバージョンアップ
    repositories {
        google()
        mavenCentral()
    }

    dependencies {
        classpath 'com.android.tools.build:gradle:8.1.2' <- ここをバージョンアップ
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
    }
}

■対象ファイル:{PROJECT}/android/gradle/wrapper/agradle-wrapper.properties

distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.0-all.zip <- ここをバージョンアップ

上記の修正後に再ビルドするとエラーが以下のように変わりました。使用しているライブラリimage_gallery_saverの名前空間の問題のようです。

* What went wrong:
A problem occurred configuring project ':image_gallery_saver'.
> Could not create an instance of type com.android.build.api.variant.impl.LibraryVariantBuilderImpl.
   > Namespace not specified. Specify a namespace in the module's build file. See https://d.android.com/r/tools/upgrade-assistant/set-namespace for information about setting the namespace.

実施事項2

名前空間が指定されていないということですので、以下のように修正して、名前空間が指定されていない場合は指定するようにします。

■対象ファイル:{PROJECT}/android/build.gradle

allprojects {
    repositories {
        google()
        mavenCentral()
    }
    // 追記:ここから
    subprojects {
        afterEvaluate { project ->
            if (project.hasProperty('android')) {
                project.android {
                    if (namespace == null) {
                        namespace project.group
                    }
                }
            }
        }
    }
    // 追記:ここまで
}

再度ビルドするとエラーがさらに以下のように変わりました。image_gallery_saverをコンパイルしようとした際に、compileDebugJavaWithJavacタスクがJava 1.8をターゲットにしているのに対し、compileDebugKotlinタスクがJava 17をターゲットにしているために、両方のタスクでバージョンが異なるというエラーのようです。

* What went wrong:
Execution failed for task ':image_gallery_saver:compileDebugKotlin'.
> 'compileDebugJavaWithJavac' task (current target is 1.8) and 'compileDebugKotlin' task (current target is 17) jvm target compatibility should be set to the same Java version.
  Consider using JVM toolchain: https://kotl.in/gradle/jvm/toolchain

実施事項3

image_gallery_saverのコンパイル時のバージョンが問題ということだと推測される(これは不正確な可能性がありますのでご注意ください)ため、image_gallery_saverで指定されているKotlinのバージョンと今回開発しているKotlinのバージョンを揃えてみます。

まずはimage_gallery_saverのKotlinのバージョンを確認します。当時使用していたimage_gallery_saverのバージョンは2.0.3でしたので、そのバージョンで使用されているKotlinのバージョンをソースから確認します。

group 'com.example.imagegallerysaver'
version '1.0-SNAPSHOT'

buildscript {
    ext.kotlin_version = '1.7.10' <- ここを確認
    repositories {
        google()
        mavenCentral()
    }

    dependencies {
        classpath 'com.android.tools.build:gradle:7.3.0'
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
    }
}

(以下略)

開発中のアプリのKotlinのバージョンを同じバージョンにします。

■対象ファイル:{PROJECT}/android/build.gradle

buildscript {
    ext.kotlin_version = '1.7.10' <- ここを合わせる
    repositories {
        google()
        mavenCentral()
    }

    dependencies {
        classpath 'com.android.tools.build:gradle:8.1.2'
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
    }
}

再々ビルドを行うとエラーが消えてビルドが正常に完了しました。

2. Kotlinのバージョンを最新にしても解決しない場合を振り返ってみると、最終的にKotlinのバージョンはもとに戻っているため、Gradleのバージョン変更と名前空間を指定することだけが重要だったのかもしれません。

冒頭にも述べたとおり2. Kotlinのバージョンを最新にしても解決しない場合の内容は試行錯誤的に修正したため、もしかしたらまだ不適切な設定が残っている可能性がありますのでご注意ください。

※たとえば、実施事項3の最後にGradleのバージョンは実施事項1で修正したままですが、もしかしたらKotlinのバージョンに併せて適切なバージョンに変更する必要があるかもしれません。