Skip to content

无法识别属性名 MODULE 错误的解决方案

问题描述

在将 Android 项目升级到 Android S(Android 12 预览版)后,编译时出现以下错误:

unrecognized Attribute name MODULE (class com.sun.tools.javac.util.SharedNameTable$NameImpl)

这个错误通常出现在以下情况:

  • 使用 compileSdkVersion 31 或更高版本
  • 使用 JDK 8 进行编译
  • 项目中包含 Lambda 表达式相关的代码

错误堆栈跟踪显示问题出现在 KAPT(Kotlin 注解处理)阶段,提示无法识别 MODULE 属性名。

根本原因

Android 12(API 级别 31)及更高版本需要 JDK 11+ 进行编译。Android 工具链已默认切换到 JDK 11,如果继续使用 JDK 8 会导致编译时出现兼容性问题。

解决方案

方案一:更新 Android Studio 中的 JDK 版本

在 Android Studio 中更新 Gradle 使用的 JDK:

  1. 打开 File → Project Structure → SDK Location
  2. Gradle Settings 区域找到 Gradle JDK 设置
  3. 选择 JDK 11(如果未安装,可选择下载选项)
  4. 点击 Apply 保存更改

TIP

对于较新的 Android Studio 版本(如 2022.3.1+),路径可能是: Settings → Build, Execution, Deployment → Build Tools → Gradle → Gradle JDK

方案二:手动安装并配置 JDK 11

如果自动下载不可用,可手动安装:

  1. 从以下地址下载 JDK 11:

  2. 解压并放置在合适的位置

  3. 在 Android Studio 中指定 JDK 路径:

    • File → Project Structure → SDK Location
    • JDK Location 字段中输入 JDK 11 的安装路径
  4. (可选)清理缓存:File → Invalidate Caches / Restart

方案三:配置 Gradle 使用指定 JDK 版本

android 模块的 build.gradle 文件中配置:

kotlin
android {
    kotlin {
        jvmToolchain(11)  // 指定使用 JDK 11
    }
    
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_11
        targetCompatibility JavaVersion.VERSION_11
    }
    
    kotlinOptions {
        jvmTarget = "11"
    }
}

方案四:在不同环境中的配置

在 CI/CD 环境(如 AppCenter)中

设置环境变量:

bash
JAVA_HOME: $(JAVA_HOME_11_X64)

在 Ionic 项目中

按照 Ionic 文档设置 Java 版本环境变量:

bash
export JAVA_HOME=/path/to/jdk11

在 Flutter 项目中

确保 android/build.gradle 中的配置正确:

gradle
buildscript {
    ext.kotlin_version = '1.7.10'  // 使用兼容的 Kotlin 版本
    dependencies {
        classpath 'com.android.tools.build:gradle:7.2.2'
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
    }
}

在 Unity 项目中

更新 Android Gradle 插件版本:

gradle
classpath 'com.android.tools.build:gradle:4.0.1'

注意事项

WARNING

  1. 确保项目中所有模块的 JDK 版本配置一致
  2. 移除已废弃的仓库引用(如 jcenter()
  3. 检查并更新所有相关的 Gradle 插件版本
  4. 如果使用数据绑定,确保其配置与 JDK 11 兼容

DANGER

不兼容的配置会导致构建失败,请确保:

  • JDK 版本 ≥ 11
  • Android Gradle Plugin 版本 ≥ 4.0.1
  • Kotlin 版本 ≥ 1.7.10
  • 移除所有对旧版本 Java 的强制指定

总结

Android 12 及以上版本需要 JDK 11 进行编译,这是导致 "unrecognized Attribute name MODULE" 错误的主要原因。通过更新开发环境和构建配置中的 JDK 版本,可以解决此问题并确保项目正常编译。

确保您的开发环境、CI/CD 流水线以及所有相关工具都使用 JDK 11,以避免兼容性问题。