unrecognized Attribute name MODULE エラー
問題点
Android 12(API 31)以降のプロジェクトでビルド時に以下のエラーが発生する問題があります:
A failure occurred while executing org.jetbrains.kotlin.gradle.internal.KaptWithoutKotlincTask$KaptExecutionWorkAction
> java.lang.reflect.InvocationTargetException (no error message)
根本的なエラーはスタックトレースの最後の方に表示されています:
Caused by: java.lang.AssertionError: annotationType(): unrecognized Attribute name MODULE (class com.sun.tools.javac.util.SharedNameTable$NameImpl)
このエラーは、Android 12(API 31)以上のコンパイル環境でJDK 8を使用している場合に発生します。AndroidのビルドツールチェーンがJDK 11を必要とするようになったため、互換性の問題が生じています。
解決策
主な解決方法:JDK 11へのアップグレード
この問題を解決するには、プロジェクトで使用するJDKをバージョン11以上にアップグレードする必要があります。
WARNING
JDK 8とAndroid 12(API 31)以上の組み合わせでは動作しません。必ずJDK 11以上を使用してください。
Android Studioでの設定方法
Android Studio Arctic Fox以降では:
File > Settings > Build, Execution, Deployment > Build Tools > Gradle > Gradle JDK
- ドロップダウンからJDK 11を選択
新しいバージョンのAndroid Studioでは:
File > Project Structure > SDK Location
タブ- 「Gradle Settings」をクリックし、「Gradle JDK」フィールドでJDK 11を選択
- ドロップダウンの「Download JDK」オプションから直接ダウンロードも可能
手動でのJDK 11インストール
- Oracle JDK 11 または OpenJDK 11 をダウンロード
- ファイルを解凍し、適切な場所に配置
- Android Studioで上記の手順に従いJDKのパスを設定
各種環境別の対応
Flutterプロジェクトの場合
android/app/build.gradle
に以下の設定を追加:
android {
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
kotlinOptions {
jvmTarget = '1.8'
}
}
android/build.gradle
の依存関係を更新:
buildscript {
ext.kotlin_version = '1.7.10'
dependencies {
classpath 'com.android.tools.build:gradle:7.2.2'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
}
}
CI/CD環境(AppCenterなど)での設定
環境変数に以下を追加:
JAVA_HOME: $(JAVA_HOME_11_X64)
Unityプロジェクトの場合
baseProjectTemplate.gradle
ファイルを更新:
classpath 'com.android.tools.build:gradle:4.0.1'
Visual Studio for Macの場合
- Microsoft JDK 11 をインストール
Tools > SDK Manager > Locations
タブでJDKの場所を設定
追加のトラブルシューティング
キャッシュのクリア:
File > Invalidate Caches / Restart
で完全再起動
古いリポジトリの削除:
build.gradle
からjcenter()
や古いMavenリポジトリを削除
プロガード設定の確認:
gradle.properties
からandroid.enableR8=true
を削除app/build.gradle
からuseProguard true
を削除
TIP
この問題はLambda式を使用しているコードで特に発生しやすいですが、JDK 11にアップグレードすれば解決します。
根本原因
Android 12(API 31)の android.jar には、JDK 8では認識できない新しいアノテーション属性「MODULE」が含まれており、これがコンパイルエラーの原因となっています。JDK 11ではこの属性が正しく処理されるため、問題は解決します。
まとめ
unrecognized Attribute name MODULE
エラーは、Android 12以降のビルド環境においてJDKのバージョン不一致が原因で発生します。以下の手順で解決できます:
- JDK 11以上をインストール
- Android Studioの設定でJDK 11を指定
- 必要に応じてビルドスクリプトを更新
- CI/CD環境でもJDKバージョンを確認
Android開発環境は常に進化しており、最新のAPIを利用するには対応するツールチェーンのアップデートが必要です。定期的な環境の見直しを行うことをおすすめします。