Gradleビルドエラー:Unsupported class file major version 65の解決方法
問題の説明
Java 17に更新した後、FlutterプロジェクトでassembleDebug
を実行しようとすると、次のビルドエラーが発生します:
FAILURE: Build failed with an exception.
* What went wrong:
Could not open cp_settings generic class cache for settings file '.../android/settings.gradle'.
BUG! exception in phase 'semantic analysis' in source unit '_BuildScript_' Unsupported class file major version 65
このエラーは通常、以下の条件で発生します:
- Android StudioをLadybug(2024.2.1)以降にアップデートした
- Java 17がインストールされ、
JAVA_HOME
環境変数が設定されている gradle-wrapper.properties
でGradle 7.3.3などのサポート対象バージョンを使用しているように見える- Flutter doctorがJava 17使用を正しく認識している
エラーの根本原因
クラスファイルバージョン65はJava 21に対応していますが、プロジェクトで使用している実際のGradleバージョンはJava 17コンパイラでビルドされたバイトコードを解釈できません。つまり:
- Android Studioの更新でGradleプラグイン(AGP)が自動更新されている場合がある
- プロジェクトで古いGradleバージョンがハードコードされている
- FlutterのデフォルトJDKパスとシステムの
JAVA_HOME
に不一致がある可能性
解決方法
⚙️ 方法1: FlutterのJDKパスを明示的に設定(推奨)
最も効果的な解決策は、Flutterに明示的にJDK 17のパスを設定することです:
flutter config --jdk-dir /path/to/your/jdk-17
パスの見つけ方(macOSの例):
# macOSの場合
echo $(/usr/libexec/java_home -v 17)
# Windowsの場合(PowerShell)
$env:JAVA_HOME
設定後、プロジェクトのクリーンビルドを実行:
flutter clean
flutter pub get
./gradlew clean build
⚙️ 方法2: GradleとAGPのバージョンを一括更新
gradle-wrapper.properties
、settings.gradle
、build.gradle
の3ファイルを更新します:
1. gradle-wrapper.propertiesの更新
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-bin.zip # 8.10.2-allも可
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
2. settings.gradleのプラグインバージョン更新
plugins {
id "dev.flutter.flutter-plugin-loader" version "1.0.0"
- id "com.android.application" version "7.3.0" apply false
+ id "com.android.application" version "8.1.0" apply false
id "org.jetbrains.kotlin.android" version "1.8.22" apply false
}
3. app/build.gradleのJava/Kotlin設定更新
android {
compileOptions {
- sourceCompatibility JavaVersion.VERSION_1_8
- targetCompatibility JavaVersion.VERSION_1_8
+ sourceCompatibility JavaVersion.VERSION_17
+ targetCompatibility JavaVersion.VERSION_17
}
kotlinOptions {
- jvmTarget = '1.8'
+ jvmTarget = JavaVersion.VERSION_17.toString()
}
}
AGPバージョンの選び方
Android Gradle Plugin(AGP)とGradleバージョンの互換性が重要です:
- AGP 8.1.x → Gradle 8.0以上
- AGP 8.2.x → Gradle 8.4以上
- 公式互換性表を参照
🔄 方法3: Gradleキャッシュのクリア
一時的なキャッシュ問題が原因の場合はキャッシュ削除が有効:
# グローバルキャッシュ削除(全プロジェクトに影響)
rm -rf ~/.gradle # macOS/Linux
Get-ChildItem -Path $env:USERPROFILE\.gradle | Remove-Item -Recurse # Windows PowerShell
# プロジェクトレベルのクリーン
cd android
./gradlew clean
cd ..
flutter clean
⚙️ 方法4: 新規プロジェクト設定の流用
既存プロジェクトの設定ファイルを新規プロジェクトで生成したものに置き換えます:
新規Flutterプロジェクト作成
bashflutter create temp_fix_project
設定ファイルを既存プロジェクトにコピー:
/android/settings.gradle
/android/app/build.gradle
/android/gradle/wrapper/gradle-wrapper.properties
必須の差分(主にアプリIDや署名設定)をマージ
🔧 方法5: AGPアップグレードアシスタントの利用(上級者)
段階的なアップグレードが必要な複雑なプロジェクトでは:
- Android Studio Koala(2024.1.1) 以降をインストール
android
ディレクトリをAndroid Studioで開くRefactor > AGP Upgrade Assistant
を実行- 指示に従い段階的アップグレード(例:7.1.2 → 7.4.2 → 8.6.1)
各方法の選択ガイド
方法 | 実行時間 | リスク | 推奨シナリオ |
---|---|---|---|
JDKパスの設定 | ★☆☆ (低) | 低 | 即時対応が必要な場合 |
設定ファイル一括更新 | ★★☆ (中) | 中 | プロジェクトを最新化したい場合 |
Gradleキャッシュクリア | ★☆☆ (低) | 低 | 一時ファイル起因の不具合が疑われる場合 |
新規プロジェクト設定の流用 | ★★★ (高) | 高 | 設定ファイルが複雑化している場合 |
AGPアップグレードアシスタント | ★★★ (高) | 中〜高 | 大規模プロジェクトの段階的更新 |
Android Studio Ladybug特有の注意点
Ladybug(2024.2.1)では:
- デフォルトJDKが変更される可能性あり
coreLibraryDesugaring
が必要な依存関係がある場合、明示的に有効化:
android {
compileOptions {
coreLibraryDesugaringEnabled true
sourceCompatibility JavaVersion.VERSION_17
targetCompatibility JavaVersion.VERSION_17
}
}
dependencies {
coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.0.3'
}
エラーの根本的な解決に向けて
Unsupported class file major version 65は、Javaバイトコードと実行環境のバージョン不一致が原因です。長期的な安定運用のためには:
- JDKとGradleのバージョン互換性を公式ドキュメントで確認
flutter doctor -v
で全ての依存関係を監視android/.gitignore
に以下を追加し不要ファイル除外:**/.cxx .gradle build/
プロジェクトを最新ツールチェーンに保つことで、ビルドエラーの発生確率を大幅に低減できます。