[Flutter] CodemagicでだけAndroidアプリのビルドがエラーになる

に公開

開発環境

  • Flutter 3.29.2
  • macOS Sequoia 15.3.2
  • Android Studio 2024.3.1
  • OpenJDK 17

エラー

ローカルでビルドする場合は何も問題なくアプリバンドルが作られるが、Codemagicにてビルドを実行すると下記のようなエラーメッセージが出力されビルドに失敗する。

Running Gradle task 'bundleRelease'...                          

FAILURE: Build failed with an exception.

* What went wrong:
Could not resolve all artifacts for configuration 'classpath'.
> Could not resolve com.google.firebase:firebase-crashlytics-gradle:3.0.3.
  Required by:
      unspecified:unspecified:unspecified > com.google.firebase.crashlytics:com.google.firebase.crashlytics.gradle.plugin:3.0.3
   > Dependency requires at least JVM runtime version 17. This build uses a Java 11 JVM.

* Try:
> Run this build using a Java 17 or newer JVM.
> Run with --stacktrace option to get the stack trace.
> Run with --info or --debug option to get more log output.
> Run with --scan to get full insights.
> Get more help at https://help.gradle.org.

BUILD FAILED in 1m 30s
Running Gradle task 'bundleRelease'...                             91.4s
Gradle task bundleRelease failed with exit code 1


Build failed :|
Failed to build for Android

メッセージには JVMのバージョンは最低でも17を必要としているが、ビルドに使われているのは11だぞ と言われている。

CodemagicのデフォルトのJavaバージョンは現在は17だが、以前は11だった。
ということは現在は特に指定せずとも17のはずなのだけど、過去のIssueなどを漁ると JAVA_HOMEの環境変数を指定してバージョンを変えられるよ、とあったので明示的に指定してみる。
https://docs.codemagic.io/specs-macos/xcode-16-2/

が、エラーは変わらず。

エラーメッセージにはcrashlyticsがエラーの箇所になっているので一旦除外してみるとエラーメッセージが変わった。


FAILURE: Build failed with an exception.

* Where:
Build file '/Users/builder/clone/android/app/build.gradle' line: 2

* What went wrong:
An exception occurred applying plugin request [id: 'com.android.application']
> Failed to apply plugin 'com.android.internal.application'.
   > Android Gradle plugin requires Java 17 to run. You are currently using Java 11.
      Your current JDK is located in /Applications/Android Studio.app/Contents/jre/Contents/Home
      You can try some of the following options:
       - changing the IDE settings.
       - changing the JAVA_HOME environment variable.
       - changing `org.gradle.java.home` in `gradle.properties`.

ここに重大なメッセージが!
Your current JDK is located in /Applications/Android Studio.app/Contents/jre/Contents/Home

え?なんで? JAVA_HOMEのJava使うんじゃないの??
Android Studio同梱のJava使ってんの?

ということがわかった。

エラーメッセージには改善提案(意訳)として

  • IDEの設定を変えよ
  • JAVA_HOMEの環境変数を整備せよ
  • gradle.propertiesorg.gradle.java.homeの値をセットせよ

とのことだが、CodemagicなのでAndroidStudioの設定云々は無理、JAVA_HOMEはすでにセットしている。残るはgradle.propertiesの中でGradleが使うJavaの設定を変えるしかないが、Codemagicに併せるとローカルの開発に支障が出る(Javaのパス等が違う)ので、CodemagicのPre-build scriptでGradleが使用するJavaのバージョンを指定する。

Pre-build scriptに以下をセット。

flutter config --jdk-dir /Library/Java/JavaVirtualMachines/zulu-17.jdk/Contents/Home

これによってビルドにJava11が使われることはなくなった。

ここをクリアした後はGradleのバージョンだの、Kotkinのバージョンだのと細かいことは色々と出てきたが、個別にクリアするのは簡単だった。

そして無事にAndroidアプリもビルドが通り、リリースを再開することができるようになった。

あとがき

検索しまくってもこの解決策を見つけることはできなかったのは、みんなAndroid Studioを使わずVSCodeしてるからなのかな?
私は素のAndroidネイティブアプリをKotlinなりJavaなりで開発した経験はないのだけど、そういう経験がある人たちにとってはGradleの設定を疑うのは当然でしょ、ということで話題にも上らなかっただけなのか。

最初にこのエラーに遭遇したのは半年ほど前で、そのときは解決方法がわからず、一旦Androidのビルドは諦めていた。(CodemagicでAndroidのビルドは除外していた)

個人開発のアプリなのでAndroidはバージョンアップしない!という逃げのような回避策が取れるが、これが仕事であったなら相当にハマり続けただろうなあと思う。

半年ほど経って心機一転もう一度解決に取り組んでみようと思い、無事に解決にたどり着くことができた。

将来同じようなエラーにハマったときの自分のためにも備忘録として残しておくことにした。

誰かの助けになれば幸いです。

Discussion