无法识别属性名 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:
- 打开 File → Project Structure → SDK Location
- 在 Gradle Settings 区域找到 Gradle JDK 设置
- 选择 JDK 11(如果未安装,可选择下载选项)
- 点击 Apply 保存更改
TIP
对于较新的 Android Studio 版本(如 2022.3.1+),路径可能是: Settings → Build, Execution, Deployment → Build Tools → Gradle → Gradle JDK
方案二:手动安装并配置 JDK 11
如果自动下载不可用,可手动安装:
从以下地址下载 JDK 11:
解压并放置在合适的位置
在 Android Studio 中指定 JDK 路径:
- File → Project Structure → SDK Location
- 在 JDK Location 字段中输入 JDK 11 的安装路径
(可选)清理缓存:File → Invalidate Caches / Restart
方案三:配置 Gradle 使用指定 JDK 版本
在 android
模块的 build.gradle
文件中配置:
android {
kotlin {
jvmToolchain(11) // 指定使用 JDK 11
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_11
targetCompatibility JavaVersion.VERSION_11
}
kotlinOptions {
jvmTarget = "11"
}
}
方案四:在不同环境中的配置
在 CI/CD 环境(如 AppCenter)中
设置环境变量:
JAVA_HOME: $(JAVA_HOME_11_X64)
在 Ionic 项目中
按照 Ionic 文档设置 Java 版本环境变量:
export JAVA_HOME=/path/to/jdk11
在 Flutter 项目中
确保 android/build.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 插件版本:
classpath 'com.android.tools.build:gradle:4.0.1'
注意事项
WARNING
- 确保项目中所有模块的 JDK 版本配置一致
- 移除已废弃的仓库引用(如
jcenter()
) - 检查并更新所有相关的 Gradle 插件版本
- 如果使用数据绑定,确保其配置与 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,以避免兼容性问题。