找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 活动 交友 discuz
查看: 148|回复: 0

Android问题记录 - Unable to make field private final java.lang.String java.io.Fi

[复制链接]

2万

主题

162

回帖

18万

积分

管理员

积分
184954
发表于 2024-7-31 15:54:12 | 显示全部楼层 |阅读模式 IP:日本东京 Amazon数据中心

登录后更精彩...O(∩_∩)O...

您需要 登录 才可以下载或查看,没有账号?立即注册

×
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



问题描述

项目构建报错日志:

[AppleScript] 纯文本查看 复制代码
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的运行版本:

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

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

[AppleScript] 纯文本查看 复制代码
distributionUrl=https\://services.gradle.org/distributions/gradle-7.4-all.zip

打开Gradle官方的兼容性文档

可以看到从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配置后面加上:

[AppleScript] 纯文本查看 复制代码
--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,修改后变为:

[AppleScript] 纯文本查看 复制代码
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版本:

[AppleScript] 纯文本查看 复制代码
classpath 'com.android.tools.build:gradle:4.1.3'


新建项目用的是7.2.0版本:

[AppleScript] 纯文本查看 复制代码
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插件版本要求:

[color=rgba(0, 0, 0, 0.75)]
Android Gradle Plugin versionMinimum required Gradle versionMinimum required Java version
8.18.017
8.08.017
7.47.511
7.37.411
7.27.3.311
7.17.211
7.07.0.211
4.26.7.1/
4.1.06.5/
4.0.06.1.1/

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


参考文档:


从表中可以看到,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的版本:

[Java] 纯文本查看 复制代码
distributionUrl=https\://services.gradle.org/distributions/gradle-7.4-all.zip


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

最后更新日期:2024/03/12


Android Gradle Plugin versionMinimum required Gradle versionMinimum required Java version
8.38.417
8.28.217
8.18.017
8.08.017
7.47.511
7.37.411
7.27.3.311
7.17.211
7.07.0.211
4.26.7.1/
4.1.06.5/
4.0.06.1.1/

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

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

[Java] 纯文本查看 复制代码
// 修改前
classpath 'com.android.tools.build:gradle:4.1.3'
// 修改后
classpath 'com.android.tools.build:gradle:7.2.0'


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

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

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

[Java] 纯文本查看 复制代码
Could not find com.android.tools.build:gradle:7.2.


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

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



Android Gradle Plugin versionPatch 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以下版本有点老了,所以不再列出。如果有所遗漏,欢迎评论补充👏。


补充内容
  • 其他不兼容情况

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

  • Android Gradle插件版本和Gradle版本不兼容报错:

[Java] 纯文本查看 复制代码
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版本不兼容:

[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版本不兼容的新报错:

[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插件版本。

  • Android Gradle插件8.0版本

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

最后更新日期:2024/03/12



Android Studio versionRequired plugin version
Jellyfish | 2023.3.13.2-8.4
Iguana | 2023.2.13.2-8.3
Hedgehog | 2023.1.13.2-8.2
Giraffe | 2022.3.13.2-8.1
Flamingo | 2022.2.13.2-8.0
Electric Eel | 2022.1.13.2-7.4
Dolphin | 2021.3.13.2-7.3



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




回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|哩布大模型|Civitai大模型|IP定位|图反推|站长素材|deepseek|即梦视频|阿狗工具|花瓣网|pinterest|php手册|宝塔文档|CyberChef|猫捉鱼铃|手机版|小黑屋|下载狗|IPS|在线工具|分享屋 ( 鲁ICP备2021028754号 )

GMT+8, 2025-5-9 22:22

Powered by 分享屋 X3.5 Licensed

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表