FlutterでAndroid実行時のJavaバージョンを変更する方法(Windows)

はじめに

今回は、FlutterでAndroidアプリを開発している際に、特定のJavaバージョンを使用する方法についてご紹介します。特に、Flutterがデフォルトで使用するJavaバージョンを変更し、プロジェクトの互換性を保つ手順を解説します。

背景

開発を進める中で、以下のような問題が発生しました。

  • Android Studioの不具合:当初使用していたAndroid Studio 2024.1.1で、突然停止するエラーが頻発。
  • Android Studioのアップデート:不具合解消のため、Android Studioを最新版の2024.2にアップデート(したからといってエラーがなくなるほど世の中甘くなかったorz)。
  • Javaバージョンの変更:アップデート後、Javaのバージョンが自動的に21に更新。

しかし、このJava 21への更新が新たな問題を引き起こしました。

問題点

  • パッケージの非互換性:いくつかのFlutterパッケージがJava 21では動作しないことが判明。

  • flutter doctor -vの結果

    fvm flutter doctor -v
    [√] Android Studio (version 2024.2)
        • Java version OpenJDK Runtime Environment (build 21.0.3+-12099254-b509.4)
    
  • JAVA_HOMEが無効:環境変数JAVA_HOMEをJava 17に設定しても、Flutterは同梱されているJVMを優先して使用するため効果なし。

新規プロジェクトをJava 21で作成すると動作はするものの、特定のパッケージを追加するとアプリが実行できない状況でした。

解決策:gradlew.batの編集

Flutterで使用するJavaのバージョンを手動で指定するために、gradlew.batファイルを編集する方法を採用しました。

手順

  1. gradlew.batファイルを見つける

    プロジェクトのルートディレクトリからandroid/gradlew.batを探します。

  2. ファイルを編集する

    gradlew.batをテキストエディタで開き、以下の内容を追加します。if defined JAVA_HOME goto findJavaFromJavaHomeの上に、JAVA_HOMEを設定しました。ここなら、有効化してくれます。

    @rem Find java.exe
    set JAVA_HOME="C:\Program Files\Android\jdk-17.0.11"
    if defined JAVA_HOME goto findJavaFromJavaHome
    

    C:\Program Files\Android\jdk-17.0.11 はJava 17のインストールパスです。ご自身の環境に合わせて変更してください。

  3. ファイルを保存する

    編集が完了したら、gradlew.batを保存します。

  4. プロジェクトを実行する

    flutter run などのコマンドでプロジェクトを実行します。指定したJavaバージョンでビルドが行われます。

通常の対応方法

特定のFlutterパッケージがJava 21で問題なく動作する場合、android/gradle/wrapper/gradle-wrapper.propertiesで以下に変更をすればgradleのバージョンが新しくなり動作します。

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

その他のバージョンの整合性についてはこちらでご確認ください。

なぜこの方法が必要だったのか

パッケージの互換性問題

特定のFlutterパッケージがJava 21では動作しないことが確認されました。パッケージのISSUEの回答にJava 21での動作が確認されていると書かれているモノの、私の環境のプロジェクトにパッケージを追加するとエラーが発生しました。

新規プロジェクトでは問題なし

ゼロから作成した新規プロジェクトでは、Java 21でも問題なく動作しました。しかし、既存のプロジェクトや特定のパッケージを使用する場合、Javaのバージョンが原因でビルドエラーが発生。

安定した開発環境の確保

最終的に、安定した開発環境を確保するために、Java 17を使用することに決めました。将来的には、パッケージがJava 21に対応することを期待していますが、それまではこの方法で開発を進める予定です。

人生いろいろ、エラーいろいろ

とりえあず、最初のエラー

* What went wrong:
Execution failed for task ':gradle:compileGroovy'.
> BUG! exception in phase 'semantic analysis' in source unit '~/.fvm\flutter_sdk\packages\flutter_tools\gradle\src\main\groovy\app_plugin_loader.groovy' Unsupported class file major version 65
[File->Open]でFlutterプロジェクト内ののandroidを開けると、丁寧に以下のようなエラーが表示されました。Fltuterでも見せてよ、、、

Your build is currently configured to use incompatible Java 21.0.3 and Gradle 7.5. Cannot sync the project.
We recommend upgrading to Gradle version 8.9.
The minimum compatible Gradle version is 8.5.
The maximum compatible Gradle JVM version is 18.
Possible solutions:

それでgradleのバージョンを上げたら、以下が発生。

Execution failed for task ':flutter_phone_direct_caller:compileDebugKotlin'.
> Error while evaluating property 'compilerOptions.jvmTarget' of task ':flutter_phone_direct_caller:compileDebugKotlin'.
   > Failed to calculate the value of property 'jvmTarget'.
      > Unknown Kotlin JVM target: 21

該当のパッケージを無効化していきましたが、次々とパッケージでエラーが発生しました。諦めて、Javaのバージョンを落とす方に方向転換。

まとめ

FlutterでAndroidアプリを開発する際、使用するJavaのバージョンによってはビルドエラーが発生することがあります。今回紹介した方法を使えば、Flutterがデフォルトで使用するJavaバージョンを手動で指定し、プロジェクトの互換性問題を解消できます。

同様の問題に直面している方は、ぜひ試してみてください。