FlutterにおけるAndroidビルドエラーに関して
Flutterをやっているチームの中にはWeb開発の流れから来た人たちと、Android, iOSのネイティブ開発から来た人たちとがいるようだ。前者においてAndroidの詳しい開発環境について知見が不足していて、Android Studioなどが新しくなると、自分たちの物件なのにビルドできなくて途方に暮れることもあるだろう。
以下にその複雑さの原因についてまとめた。
Adroidビルドの複雑さ
Gradleのバージョン、Android Gradle Plugin (AGP)のバージョン、Android SDKバージョン、そしてJDKバージョンがすべて関連しており、適切な組み合わせを揃えないとビルドエラーが発生する。これは特にFlutterプロジェクトで複数環境を管理している場合に厄介である。
Gradle、Android Gradle Plugin、Android SDK、JDKの相関関係
Android Gradle Plugin (AGP) | Gradle バージョン | JDK バージョン | 対応する Android SDK Build Tools |
---|---|---|---|
AGP 4.0.x | Gradle 6.1.1 ~ 6.5 | JDK 8 ~ 11 | Build Tools 29.0.2 ~ 30.0.0 |
AGP 7.0.x | Gradle 7.0 ~ 7.1 | JDK 11 | Build Tools 30.0.2 ~ 31.0.0 |
AGP 7.4.x | Gradle 7.4 ~ 7.6 | JDK 11 ~ 17 | Build Tools 33.0.0 以上 |
AGP 8.0.x | Gradle 8.0 ~ 8.2 | JDK 17 | Build Tools 34.0.0 以上 |
AGP 8.1.x 以降 | Gradle 8.2 ~ | JDK 17 ~ 20 | Build Tools 34.0.0 以上 |
相関関係の具体的な影響
- GradleとAGPの非互換性エラー
- GradleのバージョンがAGPより古いと、Unsupported Gradle version エラーが発生する。
- Gradle 8.x を使いたい場合、AGP 8.0.0 以上が必要である。
- JDKのバージョン非互換
- JDK 17を使用しているのにGradle 6.xを使うと、Unsupported major.minor version 61 のようなエラーが発生する。
- Android SDK Build Tools のバージョン不足
- Build Tools 34.0.0 以上が要求されるのに 30.0.3 が使われると、ビルド中に
AAPT2
などのツールが古いと警告やエラーが出る。 - 特に Flutter 3.24.3 以降は Build Tools 33.0.0 以上が必須である。
最適な設定例 (JDK 17 + Flutter 3.24.3)
- Android Gradle Plugin (AGP): 7.4.2
- Gradle Version: 7.6 ~ 8.1
- Build Tools: 34.0.0
- JDK: 17
android/build.gradle
の設定例
buildscript {
dependencies {
classpath 'com.android.tools.build:gradle:7.4.2'
}
}
android {
compileSdkVersion 34
buildToolsVersion "34.0.0"
defaultConfig {
minSdkVersion 21
targetSdkVersion 34
}
}
複数のバージョンが混在している場合の整理方法
- SDK ManagerでBuild Toolsを統一
Flutter 3.24.3では Build Tools 33.0.0 以上が推奨されるため、これを基準に他のプロジェクトも揃える。 -
gradle-wrapper.properties
を統一
各プロジェクトのgradle-wrapper.properties
を Gradle 7.6 に統一すると、多くの環境で安定する。distributionUrl=https\://services.gradle.org/distributions/gradle-7.6-all.zip
- 古いSDKの削除
不要な古いBuild ToolsやSDKプラットフォームを削除する。sdkmanager --uninstall "build-tools;30.0.3"
まとめ
- Gradle、AGP、JDK、Android SDKのバージョンが互いに強く関連しており、1つが古いとビルドエラーが発生する。つまり一番古いものに合わせないとダメであるということである。
-
JDK 17を使う場合、最低Gradle 7.4 + AGP 7.4.2 + Build Tools 33.0.0以上 を揃えると安定する。
-
Flutterなどの大きなプロジェクトで複数の環境を内在している時にはGradleのバージョンを揃えるなどの対策が必要になるだろう。