Avatar ·

Ошибка "unrecognized Attribute name MODULE" при сборке Android/Kotlin проекта

Всем привет! Я начинающий Kotlin-разработчик, пишу своё первое Android-приложение. Использую последнюю версию Android Studio (Hedgehog). Проект создавал через шаблон "Empty Compose Activity". Сборка проекта падает с ошибкой: ``` unrecognized Attribute name MODULE (class com.sun.tools.javac.util.SharedNameTable$NameImpl) ``` Вот мой файл build.gradle.kts (уровень модуля): ```kotlin plugins { id("com.android.application") id("org.jetbrains.kotlin.android") version "1.9.22" } android { namespace = "com.example.myapp" compileSdk = 34 defaultConfig { applicationId = "com.example.myapp" minSdk = 24 targetSdk = 34 versionCode = 1 versionName = "1.0" } compileOptions { sourceCompatibility = JavaVersion.VERSION_17 targetCompatibility = JavaVersion.VERSION_17 } kotlinOptions { jvmTarget = "17" } } dependencies { implementation("androidx.core:core-ktx:1.12.0") implementation("androidx.lifecycle:lifecycle-runtime-ktx:2.7.0") implementation("androidx.activity:activity-compose:1.8.2") } ``` Версия Gradle в проекте — 8.4, а плагин AGP (Android Gradle Plugin) — 8.2.2. Java стоит OpenJDK 17. Ошибка появляется при попытке запустить на эмуляторе. Что я делаю не так? Почему возникает эта ошибка и как её исправить? Пробовал чистить кэш, пересобирать проект — не помогает. Заранее спасибо! <<>>

Причина ошибки

Ошибка unrecognized Attribute name MODULE возникает из-за несовместимости между версией Java (JDK), используемой для сборки, и версией плагина Kotlin или Android Gradle Plugin (AGP). Конкретно: начиная с Java 9, в байт-коде появился атрибут Module, который используется для модульной системы Java. Старые версии инструментов сборки (например, утилита javac из JDK) не умеют корректно обрабатывать этот атрибут, когда он встречается в скомпилированных классах.

В вашем случае проблема в том, что вы используете OpenJDK 17, но при этом Gradle или AGP могут подтягивать старую версию javac (часть JDK) или использовать его несовместимым образом. Чаще всего это происходит, когда в системе установлено несколько JDK, и Gradle выбирает неправильный.

Решение

Вот пошаговая инструкция, как исправить ошибку:

  1. Проверьте, какая Java используется Gradle
    Откройте терминал в корневой папке проекта и выполните:
    ./gradlew --version
    (на Windows — gradlew --version). Обратите внимание на строку JVM — там должно быть указано 17 или выше. Если там Java 11 или 8 — это проблема.
  2. Настройте JDK в Android Studio
    Зайдите в File → Settings → Build, Execution, Deployment → Build Tools → Gradle. Убедитесь, что в поле Gradle JDK выбран OpenJDK 17 (или 21, если у вас последняя версия). Если нет — выберите правильный.
  3. Обновите AGP и Kotlin плагин
    В корневом build.gradle.kts (уровень проекта) обновите версии:
    plugins {
        id("com.android.application") version "8.4.0" apply false
        id("org.jetbrains.kotlin.android") version "1.9.24" apply false
    }
    В модульном build.gradle.kts оставьте только id("com.android.application") и id("org.jetbrains.kotlin.android") — без версий.
  4. Явно укажите JDK в gradle.properties
    Добавьте в файл gradle.properties (в корне проекта):
    org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8 -Djava.home="C:\Program Files\Java\jdk-17"
    Путь к JDK замените на свой актуальный.
  5. Очистите кэш и пересоберите
    После всех изменений выполните:
    ./gradlew clean
    ./gradlew assembleDebug

Почему это работает?

Ошибка исчезает, потому что мы:

  • Убираем несовместимость версий (AGP 8.4+ корректно работает с Java 17)
  • Обновляем Kotlin плагин, который тоже адаптирован под новые JDK
  • Явно указываем Gradle, какой JDK использовать — это исключает случайный выбор старой версии

После этих действий атрибут Module будет корректно обрабатываться, и сборка пройдёт успешно.

<<>>

Альтернативный подход: использование JDK 11

Если по каким-то причинам вы не можете обновить AGP или Kotlin плагин (например, из-за legacy кода), можно временно откатиться на JDK 11. Этот JDK не генерирует атрибут Module, и ошибка не возникнет.

  1. Скачайте OpenJDK 11 (например, jdk-11.0.22)
  2. В Android Studio: File → Project Structure → SDK Location → JDK Location укажите путь к JDK 11
  3. В build.gradle.kts измените:
    compileOptions {
        sourceCompatibility = JavaVersion.VERSION_11
        targetCompatibility = JavaVersion.VERSION_11
    }
    kotlinOptions {
        jvmTarget = "11"
    }
  4. Пересоберите проект через Build → Clean Project и затем Rebuild Project

Важно: Это временное решение. JDK 11 уже устарел, и многие библиотеки (например, Jetpack Compose) могут требовать Java 17+ для новых функций. Рекомендую в ближайшее время обновить все инструменты до актуальных версий.