Flutter Android问题记录 - 升级Android Studio 2022.2.1版本后运行项目报错

news2024/11/13 3:35:09

文章目录

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


前言

最近一个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插件版本要求:

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(未验证)。

参考文档:

  • 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插件版本要求选择兼容的插件版本:

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/

从表中可以看到,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也有版本要求:

screenshot4

最后

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/443157.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

java工程师前景分析

本篇文章主要讲解java工程师的职业就业环境及职业剖析 作者:任聪聪 日期:2023年4月18日 java工程师目前属于很饱和的一个岗位(2023年4月18日),但也会伴随劳动市场的变化出现不饱和的情况的。 实际上对于想入行it行业的…

PHP下的MySQL的基础学习

文章目录 一、MySQL LIKE 子句二、MySQL UNION 操作符三、MySQL 排序四、MySQL GROUP BY 语句五、MySQL 连接的使用总结 一、MySQL LIKE 子句 我们知道在 MySQL 中使用 SQL SELECT 命令来读取数据, 同时我们可以在 SELECT 语句中使用 WHERE 子句来获取指定的记录。…

virsh dump 内核转储 crash 分析swapper内核进程

为了节约时间&#xff0c;虚拟机配置4G内存&#xff0c;避免dump时间过长、文件过大 <memory>4194304</memory><currentMemory>4194304</currentMemory> //memory这两个值最好设成一样<vcpu>4</vcpu>vnc登录虚拟机 编写一个CPU消耗程序a.…

Word控件Spire.Doc 【字体】教程(1):在 Word 中更改字体颜色

Spire.Doc for .NET是一款专门对 Word 文档进行操作的 .NET 类库。在于帮助开发人员无需安装 Microsoft Word情况下&#xff0c;轻松快捷高效地创建、编辑、转换和打印 Microsoft Word 文档。拥有近10年专业开发经验Spire系列办公文档开发工具&#xff0c;专注于创建、编辑、转…

【AI生产力工具】ChatPDF:将 PDF 文档转化为交互式阅读体验的利器

文章目录 简介一、ChatPDF 是什么&#xff1f;二、ChatPDF 的优势三、ChatPDF 的应用场景四、如何使用 ChatPDF&#xff1f;五、结语 简介 随着数字化时代的发展&#xff0c;PDF 文件已经成为了日常工作和学习中不可或缺的一部分。然而&#xff0c;仅仅将 PDF 文件上传或下载并…

网络抓包分析【IP,ICMP,ARP】以及 IP数据报,MAC帧,ICMP报和ARP报的数据报格式

网络抓包分析&#xff0c;IP数据报&#xff0c;MAC帧&#xff0c;ICMP报&#xff0c;ARP报格式以及不同网络通信的过程。 网络抓包工具 wireshark以太网v2MAC帧IP数据报格式ICMP报文格式ARP协议及ARP报文格式抓包分析IP数据报抓包分析icmp数据报的抓包分析ARP数据报的抓包分析 …

Windows下Release版本Qt程序生成日志和dump文件(用于程序异常崩溃检测)

文章目录 前言一、基于qInstallMessageHandler生成输出日志二、基于qBreakpad生成dump文件三、基于DbgHelp和SetUnhandledExceptionFilter生成dump文件四、示例完整代码五、下载链接总结 前言 在实际项目开发时&#xff0c;一般打包发布给客户的程序是release版本Qt程序&#…

Spark大数据处理学习笔记(2.2)搭建Spark Standalone集群

该文章主要为完成实训任务&#xff0c;详细实现过程及结果见【http://t.csdn.cn/DrziJ】 文章目录 一、在master虚拟机上安装配置Spark1.1 将spark安装包上传到master虚拟机1.2 将spark安装包解压到指定目录1.3 配置spark环境变量1.4 编辑spark环境配置文件1.5 创建slaves文件&…

Unity记录3.3-地图-柏林噪声生成 2D 地图

文章首发及后续更新&#xff1a;https://mwhls.top/4486.html&#xff0c;无图/无目录/格式错误/更多相关请至首发页查看。 新的更新内容请到mwhls.top查看。 欢迎提出任何疑问及批评&#xff0c;非常感谢&#xff01; 汇总&#xff1a;Unity 记录 摘要&#xff1a;柏林噪声生成…

再学C语言51:C库中的字符串函数(3)

一、strcpy()函数 功能&#xff1a;复制字符串&#xff0c;在字符串中的作用等价于赋值运算符 示例代码&#xff1a; /* test of strcpy() function */ #include <stdio.h> #include <string.h>int main(void) {char arr1[] "Easy doesnt enter into grow…

基于html+css的图片展示19

准备项目 项目开发工具 Visual Studio Code 1.44.2 版本: 1.44.2 提交: ff915844119ce9485abfe8aa9076ec76b5300ddd 日期: 2020-04-16T16:36:23.138Z Electron: 7.1.11 Chrome: 78.0.3904.130 Node.js: 12.8.1 V8: 7.8.279.23-electron.0 OS: Windows_NT x64 10.0.19044 项目…

【AI生产力工具】Midjourney:为创意人士提供创造性灵感和支持的工具

文章目录 一、Midjourney是什么&#xff1f;二、Midjourney的优势三、Midjourney的应用四、结语 在现代社会&#xff0c;创意和创新成为越来越重要的能力。然而&#xff0c;创意灵感的获取却不是一件容易的事情&#xff0c;这就需要我们使用一些辅助工具来帮助我们发现和实现创…

照片尺寸怎么修改,3大工具推荐

照片尺寸怎么修改&#xff1f;对于许多人来说&#xff0c;调整图片的尺寸可能是一个日常任务&#xff0c;无论是个人或者工作上都可能会遇到这个需求。适当地调整图片的尺寸可以让图片更具专业性和美观性&#xff0c;而且能够减小文件大小&#xff0c;提高图片的加载速度。在电…

2023年4月北京/西安/郑州/深圳CDGA/CDGP数据治理认证考试报名

DAMA认证为数据管理专业人士提供职业目标晋升规划&#xff0c;彰显了职业发展里程碑及发展阶梯定义&#xff0c;帮助数据管理从业人士获得企业数字化转型战略下的必备职业能力&#xff0c;促进开展工作实践应用及实际问题解决&#xff0c;形成企业所需的新数字经济下的核心职业…

如何用 Leangoo领歌做迭代规划及迭代执行。

迭代是敏捷开发的核心&#xff0c;正确的迭代可以帮助敏捷团队提高工作交付速度&#xff0c;今天&#xff0c;我们深度看下如何用Leangoo领歌敏捷工具进行迭代规划和迭代执行&#xff0c;高效落地 Scrum。 1、确定迭代需要做的需求 在需求看板中&#xff0c;将已经梳理好的用…

C++ -3- 类和对象 (中) | 构造函数与析构函数(一)

文章目录 1.类的6个默认成员函数2.构造函数3.析构函数构造函数与析构函数应用场景缺省值初始化 1.类的6个默认成员函数 如果一个类中什么成员都没有&#xff0c;简称为空类。 空类中真的什么都没有吗&#xff1f;并不是&#xff0c;任何类在什么都不写时&#xff0c;编译器会自…

网络安全必学渗透测试流程

这个靶场是一个对渗透新手很友好的靶场。而且&#xff0c;该靶场包含了渗透测试的信息收集&#xff0c;漏洞利用和权限提升的全过程&#xff0c;对新手理解渗透测试的流程有很好的帮助。 靶场地址&#xff1a;https://hackmyvm.eu/machines/machine.php?vmHundred 靶场基本情…

关系数据库(查询优化)

选择操作的实现select * from student where Sno201212128; 简单的全表扫描法优点&#xff1a;对于小表简单有效 缺点&#xff1a;对于大表顺序扫描浪费时间效率低下索引扫描方法 连接操作的实现 连接操作是查询处理中最耗时的操作之一 select *from student,sc where s…

云上数据变革:Databend Cloud 正式发布

2023 年 4 月 20 日&#xff0c;Databend Cloud 经历了近两年的打磨终于发布了&#xff01;&#x1f389; 此次发布会由北京数变科技有限公司【Databend Labs】联合阿里云共同举办。Databend Cloud 借助于云原生数仓 Databend 实现了云简单易用的大数据分析场景。 以下内容来…

Python语言中的注释方法应用

Python语言中的注释方法 在Python编程中&#xff0c;与其他编程语言一样&#xff0c;有良好的注释部分&#xff0c;会让你的程序在后续的改进或优化中&#xff0c;变得便利。同时&#xff0c;给自己培养了良好的编程习惯。 在Python语言中&#xff0c;有两种注释方法。 1.单行…