😺

Flutterプロジェクトにおけるコンパイラの衝突回避の方法

2024/11/28に公開

はじめに

Flutterを使ってandroidのアプリを作っていました。
androidのSDKを上げようと思い作業をしたのですが、コンパイラのバージョンが衝突するエラーが起きました。
今回試行錯誤の結果、対策らしきものが見つかったので整理します。

結論

以下で行けました。2,3の情報があまりなく、苦労しました。

  1. build.gradleにコンパイラの設定をする
  2. flutter pub cleanでライブラルのキャッシュを削除する
  3. flutterプロジェクトのコンパイラ設定はandorid/build.gradleでsubproject毎に設定する

エラー内容

以下のようなエラーです。

'compileDebugJavaWithJavac' task (current target is 1.8) and 'kaptGenerateStubsDebugKotlin' task (current target is 17) jvm target compatibility should be set to the same Java version.

パッケージごとに違うバージョンでエラーが出たり、1.8と17が逆だったりします。

設定内容

こちらの記事を参考にベースの設定をします
AGP8とJDK17に対応した際の調査結果まとめ|TechRacho by BPS株式会社

基本的には以下の内容です。

  • android/app/build.gradleでSDKのバージョンを指定しよう
  • android/app/build.gradleでJAVAコンパイラオプションを指定しよう
  • android/app/build.gradleでkotlin用のJAVAコンパイラオプションを指定しよう

私はこれを指定してもエラーが消えませんでした。
ので以下を実施しました。

上記設定をしてもだめな場合、flutterのライブラリキャッシュを消します。
flutter pub cache clean -f
どうやらflutterのライブラリでつかうコンパイラのバージョンがうまく解決されていないように思います。
gralde を更新後にキャッシュをクリアし改めてflutter pub getするとビルドできる場合がありました。

それでもだめな場合、全てのモジュールにコンパイラバージョンを指定します。
android/build.gradleに以下を追記します。

subproject毎にコンパイラを指定するコード
    subprojects {
        // android projectのコンパイラ設定を実施
        // ここで設定しないと全てのモジュールに設定がされないみたいで、モジュールごとに古いコンパイラを使ってしまってエラーになったりする
        afterEvaluate { project ->
            if (project.hasProperty("android")) {
                project.android {
                    compileSdkVersion 使いたいSDKバージョン
                    ndkVersion = 使いたいNDKバージョン
                    compileOptions {
                        sourceCompatibility JavaVersion.使いたいJAVAバージョン
                        targetCompatibility JavaVersion.使いたいJAVAバージョン
                    }
                }
                project.tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile).configureEach {
                    kotlinOptions {
                        jvmTarget = '使いたいJAVAバージョン'
                    }
                }
            }       
        }
    }
android/build.gradleのサンプル
allprojects {
    repositories {
        google()
        mavenCentral()
    }
    gradle.projectsEvaluated {
        tasks.withType(JavaCompile) {
            options.compilerArgs << "-Xlint:deprecation"
        }
    }
    subprojects {
        // android projectのコンパイラ設定を実施
        // ここで設定しないと全てのモジュールに設定がされないみたいで、モジュールごとに古いコンパイラを使ってしまってエラーになったりする
        afterEvaluate { project ->
            if (project.hasProperty("android")) {
                project.android {
                    compileSdkVersion 35
                    ndkVersion = '27.0.12077973'
                    compileOptions {
                        sourceCompatibility JavaVersion.VERSION_17
                        targetCompatibility JavaVersion.VERSION_17
                    }
                }
                project.tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile).configureEach {
                    kotlinOptions {
                        jvmTarget = '17'
                    }
                }
            }       
        }
   }
}

rootProject.buildDir = "../build"
subprojects {
    project.buildDir = "${rootProject.buildDir}/${project.name}"
}
subprojects {
    project.evaluationDependsOn(":app")
}

tasks.register("clean", Delete) {
    delete rootProject.buildDir
}

挙動をみると、flutterで使っているパッケージごとにコンパイラのバージョンが不一致であるというエラーが出てしまいます。android/app/build.gradleで指定してもライブラリのコンパイラバージョンは指定できていない?様に思いました。上記設定を実施すると無事ビルドできました。

Discussion