Android问题记录 - Unable to make field private final java.lang.String java.io.File.path accessible(持续更新)

文章目录

  • 前言
  • 开发环境
  • 问题描述
  • 问题分析
  • 解决方案
  • 补充内容
  • 最后


前言

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

开发环境

  • 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 @2374ab37

问题分析

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

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

Android问题记录 - Unable to make field private final java.lang.String java.io.File.path accessible(持续更新)_第1张图片

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

Android问题记录 - Unable to make field private final java.lang.String java.io.File.path accessible(持续更新)_第2张图片

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

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

打开Gradle官方的兼容性文档:

Android问题记录 - Unable to make field private final java.lang.String java.io.File.path accessible(持续更新)_第3张图片

可以看到从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,重新运行项目一切正常!

所以根本原因还是版本不兼容,只不过是Android Gradle插件版本和Java版本不兼容

稍微查了下,Android Gradle插件4.1.0版本于2020年8月发布,Java 17版本于2021年9月发布,这么一看,不兼容很正常,毕竟Android Gradle插件4.1.3版本发布时,Java 17版本都还没发布。

分析还没结束,前面通过将Android Gradle插件版本改为7.2.0解决了报错,可是这个插件版本一定要是7.2.0吗?这是我整理的Android Gradle插件版本要求:

Android Gradle Plugin version Minimum required Gradle version Minimum required Java version
8.1 8.0 17
8.0 8.0 17
7.4 7.5 11
7.3 7.4 11
7.2 7.3.3 11
7.1 7.2 11
7.0 7.0.2 11
4.2 6.7.1 /
4.1.0 6.5 /
4.0.0 6.1.1 /

官方文档中没找到4.x.x版本明确的Java版本要求,所以用/表示,不过,根据个人经验应该是Java 8(未验证)。

参考文档:

  • Android Gradle plugin release notes
  • Past Android Gradle Plugin releases

从表中可以看到,4.1.0版本的Android Gradle插件最低只要求6.5版本的Gradle,这就是为什么在升级Android Studio 2022.2.1版本之前项目还能运行正常的原因。

Android Gradle插件从7.0版本开始要求Java 11,那会不会这个版本就是解决当前问题的最低版本呢?经过实测可以确定是的,只要插件版本大等于7.0,当前问题就不会出现。

解决方案

打开Android项目下的gradle/wrapper/gradle-wrapper.properties文件找到Gradle的版本:

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

7.4即Gradle的版本。根据Android Gradle插件版本要求选择兼容的插件版本:

最后更新日期:2023/10/15

Android Gradle Plugin version Minimum required Gradle version Minimum required Java version
8.3 8.3 17
8.2 8.2 17
8.1 8.0 17
8.0 8.0 17
7.4 7.5 11
7.3 7.4 11
7.2 7.3.3 11
7.1 7.2 11
7.0 7.0.2 11
4.2 6.7.1 /
4.1.0 6.5 /
4.0.0 6.1.1 /

从表中可以看到,7.4版本的Gradle只能选择7.3及以下版本的插件,同时根据前面的问题分析,最终满足兼容要求的Android Gradle插件版本范围是7.0~7.3

打开Android项目下的build.gradle文件,将插件版本设置为满足兼容要求的版本:

// 修改前
classpath 'com.android.tools.build:gradle:4.1.3'
// 修改后
classpath 'com.android.tools.build:gradle:7.2.0'

注意,7.2.0版本不是固定的,请按项目实际情况选择。

重新运行项目检查问题是否已经解决,如果还未解决,请参考问题分析中的保底解决方法

如果遇到类似这样的报错:

Could not find com.android.tools.build:gradle:7.2.

解决办法很简单,补全版本名称即可。例如7.2补全为7.2.0,这种版本名称末尾补0的小版本肯定是能够找到的。如果需要补丁版本,请看以下整理的一些Android Gradle插件补丁版本:

最后更新日期:2023/10/15

Android Gradle Plugin version Patch versions
8.3 /
8.2 /
8.1 /
8.0 [8.0.1] [8.0.2]
7.4 [7.4.1]
7.3 /
7.2 [7.2.1] [7.2.2]
7.1 [7.1.1] [7.1.2] [7.1.3]
7.0 [7.0.1]

7.0以下版本有点老了,所以不再列出。如果有所遗漏,欢迎评论补充。

补充内容

  1. 其他不兼容情况

根据问题分析可以知道当前报错是由于Android Gradle插件版本和Java版本不兼容导致的,那其他不兼容情况的报错是什么样的呢?

  • Android Gradle插件版本和Gradle版本不兼容报错:
A problem occurred evaluating project ':app'.
> Failed to apply plugin 'com.android.internal.version-check'.
   > Minimum supported Gradle version is 7.3.3. Current version is 7.2. If using the gradle wrapper, try editing the distributionUrl in /xxx/gradle/wrapper/gradle-wrapper.properties to gradle-7.3.3-all.zip

7.2版本的Android Gradle插件最低要求7.3.3版本的Gradle,但当前Gradle版本是7.2

  • Gradle版本和Java版本不兼容:
Could not open settings generic class cache for settings file '/xxx/settings.gradle' (/Users/xxx/.gradle/caches/7.1/scripts/33mryj9ed7jrwo0cnqayrtkt7).
> BUG! exception in phase 'semantic analysis' in source unit '_BuildScript_' Unsupported class file major version 61

Java 17版本最低要求7.3版本的Gradle,但当前Gradle版本是7.1。不过让人意外的是,7.2版本的Gradle实测没报错。

2023/07/16更新:

维护老Android项目时遇到一个关于Gradle版本和Java版本不兼容的新报错:

Unable to make protected void java.net.URLClassLoader.addURL(java.net.URL) accessible: module java.base does not "opens java.net" to unnamed module @7a187f14

解决办法:打开Android项目下的gradle/wrapper/gradle-wrapper.properties文件修改Gradle版本,Java 17版本实测最低需要7.2版本的Gradle。只修改Gradle版本大概率还会继续报错,请参考前面的解决方案继续修改Android Gradle插件版本。

  1. Android Gradle插件8.0版本

暂时不推荐使用该版本。8.0版本本月(2023/04)才发布,现在使用可能会遇到一些问题,比如一些过时API被移除,可以参考Android Gradle plugin API updates文档。 除此之外,对Android Studio也有版本要求:

最后更新日期:2023/10/15

Android Studio version Required plugin version
Iguana | 2023.2.1 3.2-8.3
Hedgehog | 2023.1.1 3.2-8.2
Giraffe | 2022.3.1 3.2-8.1
Flamingo | 2022.2.1 3.2-8.0
Electric Eel | 2022.1.1 3.2-7.4
Dolphin | 2021.3.1 3.2-7.3

最后

如果这篇文章对你有所帮助,点赞收藏支持一下吧,谢谢~


本篇文章由@crasowas发布于CSDN。

你可能感兴趣的:(问题记录,Android,flutter,android,android,studio,gradle)