Skip to content

Android Studio 中修复 'module java.base does not "opens java.io" to unnamed module' 错误

问题描述

在 Android Studio 中运行项目时,可能会遇到以下错误:

Unable to make field private final java.lang.String java.io.File.path accessible:
module java.base does not "opens java.io" to unnamed module @42760a00

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

  • 使用较新版本的 JDK(如 JDK 16+)
  • Gradle 版本与 JDK 版本不兼容
  • 项目配置过时或存在兼容性问题

该错误的核心原因是 Java 9+ 引入的模块系统限制了反射操作,而 Android 构建工具需要使用反射访问某些内部 API。

解决方案

方案一:使用兼容的 JDK 版本(推荐)

大多数 Android 项目最佳兼容 JDK 8 或 JDK 11:

  1. 下载并安装 JDK 8 或 JDK 11
  2. 在 Android Studio 中配置项目使用兼容的 JDK:
    • 打开 File > Project Structure
    • 在 SDK Location 中设置正确的 JDK 路径
    • 在 Gradle Settings 中选择相应的 Gradle JDK

TIP

对于新项目,建议使用 JDK 11;对于旧项目,JDK 8 通常更稳定。

方案二:更新 Gradle 配置

如果必须使用较高版本 JDK,需要确保 Gradle 配置兼容:

  1. 更新 gradle-wrapper.properties
properties
distributionUrl=https\://services.gradle.org/distributions/gradle-7.5-all.zip
  1. 更新项目级 build.gradle
groovy
buildscript {
    dependencies {
        classpath 'com.android.tools.build:gradle:7.2.1'
    }
}
  1. 设置兼容的 Kotlin 版本
groovy
ext.kotlin_version = '1.7.10'

方案三:添加 JVM 参数

在 gradle.properties 中添加以下参数来解决模块访问限制:

properties
org.gradle.jvmargs=-Xmx1536M \
--add-exports=java.base/sun.nio.ch=ALL-UNNAMED \
--add-opens=java.base/java.lang=ALL-UNNAMED \
--add-opens=java.base/java.lang.reflect=ALL-UNNAMED \
--add-opens=java.base/java.io=ALL-UNNAMED \
--add-exports=jdk.unsupported/sun.misc=ALL-UNNAMED

方案四:针对测试任务的特殊配置

如果错误仅在运行测试时出现,在 build.gradle 中添加:

groovy
tasks.withType(Test) {
    jvmArgs(
        '--add-opens', 'java.base/java.lang=ALL-UNNAMED',
        '--add-opens', 'java.base/java.util=ALL-UNNAMED'
    )
}

版本兼容性参考

JDK 与 Gradle 版本兼容性

  • JDK 8: Gradle 4.x - 6.x
  • JDK 11: Gradle 6.7 - 7.x
  • JDK 17+: Gradle 7.3+

详细兼容性信息请参考 官方兼容性表格

故障排除步骤

  1. 检查当前配置

    • Android Studio > File > Project Structure
    • 查看 Gradle 版本和 JDK 版本
  2. 清理缓存

    • File > Invalidate Caches / Restart
    • 删除项目中的 .gradle 文件夹
  3. 检查环境变量

    • 确保 JAVA_HOME 指向正确的 JDK 版本

注意事项

  • 不建议随意升级/降级 JDK 版本,应先确认项目兼容性
  • 修改 Gradle 配置后需要同步项目
  • 团队项目中应统一开发环境配置

总结

'module java.base does not "opens java.io" to unnamed module' 错误主要由 JDK 版本与 Gradle 版本不兼容引起。通过使用兼容的 JDK 版本、更新 Gradle 配置或添加适当的 JVM 参数,可以解决这一问题。对于大多数项目,使用 JDK 11 并更新到最新的 Gradle 和 Android Gradle Plugin 是最可靠的解决方案。