メインコンテンツへスキップ

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

· loading · loading ·
kiitosu
著者
kiitosu
画像処理やデバイスドライバ、データ基盤構築からWebバックエンドまで、多様な領域に携わってきました。地図解析や地図アプリケーションの仕組みにも経験があり、幅広い技術を活かした開発に取り組んでいます。休日は草野球とランニングを楽しんでいます。
目次

はじめに
#

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に以下を追記します。
:::details 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バージョン'
                    }
                }
            }       
        }
    }

:::

:::details 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で指定してもライブラリのコンパイラバージョンは指定できていない?様に思いました。上記設定を実施すると無事ビルドできました。

Reply by Email

関連記事

github clientからコミットを試みた時にhuskyでエラーが出た
· loading · loading
inject_lambda_context で表示されるcold_startがTrueになる条件
· loading · loading
aws-vaultのsessionの時間制限
· loading · loading