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的运行版本:

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

打开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,重新运行项目一切正常🎉!

所以根本原因还是版本不兼容,只不过是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插件版本要求:

最后更新日期:2023/05/03

Android Gradle Plugin version Minimum required Gradle version Minimum required Java version
8.2 8.1 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 /

官方文档中没找到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的版本:

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

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

Android Gradle Plugin version Minimum required Gradle version Minimum required Java version
8.2 8.1 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版本不是固定的,请按项目实际情况选择。

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

补充内容

  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实测没报错。

  1. Android Gradle插件8.0版本

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

Android Studio version Required plugin version
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

最后

如果这篇文章对你有所帮助,请不要吝啬你的点赞👍加星🌟,谢谢~

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
< <上一篇
下一篇>>