随笔博文

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 @7a4eb222

2023-10-19 15:23:13 michael007js 4344



前言

最近一个Flutter项目有新需求,开发时一直是在iOS设备上运行,花了几天做完后运行到Android设备测试,结果项目构建失败了。

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 @7a4eb222


开发环境

  • Flutter: 3.7.11

  • Android Studio: 2022.2.1

  • Java: 17.0.6

  • Gradle: 7.4

  • Android Gradle Plugin (AGP): 4.1.3

问题描述

项目构建报错日志:

Execution failed for task ':app:processDailyDebugMainManifest'.
> 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 @7a4eb222

问题分析

报错有点眼熟,根据以往开发经验,应该是Gradle版本和Java版本不兼容导致的问题。分析的切入点有了,接下来就是逐步去验证。

项目中的Gradle版本长时间没有变过,首先怀疑是不是Java版本变了。由于一直使用的是Android Studio内置的Java环境,所以直接看Android Studio的运行版本:

screenshot1

果然变了,我记得之前还是Java 11版本,现在变成了Java 17版本。难道是Android Studio版本升级导致的?找到Android Studio 2022.1.1的运行版本:

screenshot2

看来真是Android Studio版本升级导致的,接下来就是验证是不是兼容性有问题。找到Android项目内的gradle/wrapper/gradle-wrapper.properties文件,可以看到用的是Gradle 7.4版本。

distributionUrl=https\://services.gradle.org/distributions/gradle-7.4-all.zip
1

打开Gradle官方的兼容性文档

screenshot3

可以看到从Gradle 7.3版本开始就已经支持了Java 17版本,那没道理Gradle 7.4版本会出现报错呀。将Gradle版本改为7.6版本,重新运行还是构建报错,这下没有了头绪。

找了台还没升级Android Studio版本的电脑,同样的项目构建是正常的,同样做升级处理后,竟然还是构建正常!难道我前面的猜测错了,不是Android Studio升级的问题?将这台电脑上的Flutter版本也升到当前最新的3.7.11版本,测试项目构建还是正常!这下更没头绪了。(补充:后续电脑重启后问题得以重现。

带着报错信息去搜索,发现好多人建议降Java版本,降是不能降的,怎么能开倒车。除了降版本,还发现了一个解决方法,打开Android项目下的gradle.properties文件,在org.gradle.jvmargs配置后面加上:

--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

例如原来是org.gradle.jvmargs=-Xmx1536M,修改后变为:

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

实测可行,不过这更像是临时解决方法。当然,有方法总比没方法好,至少有了保底解决方法

新建一个Flutter项目,运行到Android设备,一切正常。对比Gradle版本,新建项目用的是7.5版本,这好像也没什么区别呀。仔细对比其他配置,我发现我遗漏了Android Gradle插件的版本。打开Android项目下的build.gradle文件,报错项目用的是4.1.3版本:

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

新建项目用的是7.2.0版本:

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

将新项目的Android Gradle插件版本改为4.1.3,出现同样的报错。将报错项目的版本改为7.2.0,重新运行项目一切正常

首页
关于博主
我的博客
搜索