Android问题记录 - 适配Android Studio Ladybug/Java 21/AGP 8.0

文章目录

  • 前言
  • 开发环境
  • 问题描述
  • 问题分析
    • 1. 适配Java 21
    • 2. 适配AGP 8.0
  • 解决方案
  • 补充内容
  • 最后


前言

Android Studio版本从Koala Feature Drop升级到Ladybug,出现了一系列报错。

开发环境

  • Flutter: 3.24.3
  • Android Studio: 2024.2.1 Patch 1
  • Java: 21.0.3
  • Gradle: 7.4
  • Android Gradle Plugin (AGP): 7.3.1

问题描述

升级Android Studio版本后,Flutter项目运行到Android设备出现报错,截取部分日志如下:

Execution failed for task ':gradle:compileGroovy'.
> BUG! exception in phase 'semantic analysis' in source unit '.../flutter/packages/flutter_tools/gradle/src/main/groovy/app_plugin_loader.groovy' Unsupported class file major version 65[!] Your project's Gradle version is incompatible with the Java version that Flutter is using
for Gradle.If you recently upgraded Android Studio, consult the migration guide at                         
https://flutter.dev/to/to/java-gradle-incompatibility.    

问题分析

日志中Flutter提供了迁移指南,迁移指南中是升级AGP的版本到7.3~7.6.1之间。可是现在项目的AGP版本是符合要求的,这说明这个迁移指南的内容过时了。那怎么办呢?

首先这个问题是升级Android Studio版本导致的,这让我想起一年多前的一个问题类似的问题:Android问题记录 - Unable to make field private final java.lang.String java.io.File.path accessible(持续更新)。倒不是我记性好,而是这篇文章我一直在持续更新。

先看看是不是Android Studio升级了Java版本,这是Koala Feature Drop版本的:

screenshot1

这是Ladybug版本的:

screenshot2

很明显Java版本从17升到了21,接下来开始尝试适配。

1. 适配Java 21

根据Gradle的兼容性要求:

screenshot3

Java 21版本在Gradle 8.5才开始支持,而当前项目的Gradle版本是7.4,看来问题的原因找到了,是Android Gradle版本和Java版本不兼容

现在开始尝试升级版本解决问题,首先将Gradle版本升级到8.5,打开Android项目下的gradle/wrapper/gradle-wrapper.properties文件修改版本:

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

重新运行项目,还是报错:

> Cannot use @TaskAction annotation on method IncrementalTransformTask.transform() because interface org.gradle.api.tasks.incremental.IncrementalTaskInputs is not a valid parameter to an action method.

看来导致这问题的原因不止一个,Android Gradle插件版本和Java版本不兼容很可能也是其中一个。在这个类似问题中,AGP为了兼容Java 17版本升级到了7.0+,那这次估计要升级到8.0+

打开Android项目下的settings.gradle文件,先升级到8.0试试:

id "com.android.application" version "8.0.0" apply false

还是报错,截取部分日志:

> Could not resolve all files for configuration ':xxx:androidJdkImage'.> Failed to transform core-for-system-modules.jar to match attributes {artifactType=_internal_android_jdk_image, org.gradle.libraryelements=jar, org.gradle.usage=java-runtime}.

一直升级到8.3版本才不继续报错。刚好,如果继续升级到8.4版本,那Gradle版本又要升级了,因为AGP 8.4最低要求Gradle 8.6。

id "com.android.application" version "8.3.0" apply false

到这还没解决全部报错,AGP进行了大版本升级,还需要继续适配。

2. 适配AGP 8.0

以下报错适配只是我遇到的,也许你还遇到了其他的,建议自行查看AGP 8.0的版本说明:Android Gradle Plugin 8.0.0。
当然,你也可以尝试使用AGP Upgrade Assistant完成迁移,只是不太好用,在后续补充内容中有介绍。

  1. 因为多环境打包或代码中用到了BuildConfig,但是从AGP 8.0开始,默认不生成BuildConfig,所以需要手动开启
> Product Flavor 'xxx' contains custom BuildConfig fields, but the feature is disabled.To enable the feature, add the following to your module-level build.gradle:`android.buildFeatures.buildConfig true`或者类似这样的报错:
/xxx/xxx.java:20: 错误: 找不到符号
import com.example.application.BuildConfig;又或者这样的报错:
/xxx/MainActivity.kt: (315, 16): Unresolved reference: BuildConfig

按照错误中的提示,在app/build.gradle中增加以下内容:

android.buildFeatures.buildConfig true

当然,你也可以增加这样的:

android {buildFeatures {buildConfig = true}
}
  1. 需要在构建脚本中指定命名空间,其实就是将AndroidManifest.xml中的命名空间迁移到这里
> Could not create an instance of type com.android.build.api.variant.impl.ApplicationVariantImpl.> Namespace not specified. Specify a namespace in the module's build file. See https://d.android.com/r/tools/upgrade-assistant/set-namespace for information about setting the namespace.If you've specified the package attribute in the source AndroidManifest.xml, you can use the AGP Upgrade Assistant to migrate to the namespace value in the build file. Refer to https://d.android.com/r/tools/upgrade-assistant/agp-upgrade-assistant for general information about using the AGP Upgrade Assistant.

app/build.gradle中指定命名空间:

android {namespace = "com.example.application"
}

同时移除AndroidManifest.xml文件中过时的package="com.example.application"
完成以上操作后,你还是可能会遇到这个报错,但是请仔细看看,那应该是其他子项目(模块)的报错,可以在Android项目下的build.gradle中增加以下内容解决:

allprojects {subprojects {afterEvaluate { project ->if (project.hasProperty('android')) {project.android {if (namespace == null) {namespace project.group}}}}}
}

解决方案

完成以下操作解决问题:

  1. 升级Gradle版本

修改Android项目下的gradle/wrapper/gradle-wrapper.properties文件,版本至少升级到8.5

distributionUrl=https\://services.gradle.org/distributions/gradle-8.5-all.zip
  1. 升级AGP版本

修改Android项目下的settings.gradle文件,版本至少升级到8.3

id "com.android.application" version "8.3.0" apply false
  1. 适配AGP 8.0

请参考前面问题分析中的适配AGP 8.0内容。

补充内容

  1. AGP Upgrade Assistant

这是官方提供的升级助手,点击Android Studio菜单栏的[Tools] -> [AGP Upgrade Assistant]唤起。从7.3.1升级到8.0.0是这样的:

screenshot4

点击Run selected steps完成迁移,迁移完成后还可以撤销迁移。是不是感觉好像还不错?这里有一个问题,如果你的项目没能被识别为Android项目(例如卡在Gradle sync now报错),点击升级助手是没反应的,Android Studio的日志是这么说的:

Unable to obtain application's Android Project

这就难受了,项目需要通过AGP升级助手迁移完成后才能识别为Android项目,但是使用升级助手的前提是能被识别为Android项目,所以这升级助手最好提前用提前迁移。至于以上迁移截图是通过新建Android测试项目得到的。

  1. Kotlin版本需不需要升级

通常不需要。具体版本兼容要求请看:兼容性说明。

  1. Could not find com.otaliastudios:transcoder:0.9.1

由于JCenter的弃用,transcoder库迁移到了Maven,需要将版本升级到0.10.0及以上。这个报错和当前问题没什么关系,只是遇到了顺便记录。

最后

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


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

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

FPGA实现PCIE采集电脑端视频转SFP光口万兆UDP输出,基于XDMA+GTX架构,提供2套工程源码和技术支持

目录 1、前言工程概述免责声明 2、相关方案推荐我已有的PCIE方案10G Ethernet Subsystem实现万兆以太网物理层方案 3、PCIE基础知识扫描4、工程详细设计方案工程设计原理框图电脑端视频PCIE视频采集QT上位机XDMA配置及使用XDMA中断模块FDMA图像缓存UDP视频组包发送UDP协议栈MAC…

高效改进!防止DataX从HDFS导入关系型数据库丢数据

高效改进!防止DataX从HDFS导入关系型数据库丢数据 针对DataX在从HDFS导入数据到关系型数据库过程中的数据丢失问题,优化了分片处理代码。改动包括将之前单一分片处理逻辑重构为循环处理所有分片,确保了每个分片数据都得到全面读取和传输&…

Git文件操作指令和文件状态

一、Git 文件操作指令 1、查看指定文件的状态 git status [filename] 我们在新创建且初始化过后的 git 仓库中新建一个 文件,然后在 git 的命令行中输入此指令后,就可以看到 的状态: 在此显示的是 Untracked 的状态,也就是未…

visual studio设置修改文件字符集方法

该方法来自网文,特此记录备忘。 添加两个组件,分别是Force UTF-8,FileEncoding。 截图如下: 方法如下:vs中点击“扩展”->“管理扩展”,输入utf搜索,安装如下两个插件,然后重启vs&#xf…

【pytorch DistributedDataParallel 及amp 使用过程遇到的问题记录 】

目录 环境问题单机多卡时:超时错误部分报错内容:解决方法: 存在没有使用梯度的参数报错内容:解决方法:方法1 找到不参与梯度计算的层**且**没有用处的层,删除方法2 DistributedDataParallel 增加参数:find_unused_parameters True DDP 训练时第一个batc…

2 两数相加

解题思路: \qquad 这道题可以用模拟很直观的解决,模式加法的计算过程,只不过套了一层链表的外衣。题目给出的数字在链表中是按照逆序排列的,即链表头节点的值代表相加数字的个位,这样只需要从链表头开始计算加法即可得…

系统登录接口文档Demo

接口描述 该接口用于用户登录验证。通过用户名和密码进行身份验证,成功后返回一个用于后续请求的认证 token。这个 token 是访问受保护资源的凭证。 时序图: 登录请求: 登录查询接口: POST {url}/api/user/login 请求体: {"username…

简单的 curl HTTP的POSTGET请求以及ip port连通性测试

简单的 curl HTTP的POST&GET请求以及ip port连通性测试 1. 需求 我们公司有一个演示项目,需要到客户那边进行项目部署,项目部署完成后我们需要进行项目后端接口的测试功能,但是由于客户那边么有条件安装类似于postman这种的测试工具&am…

Linux:进程优先级 进程调度切换 调度算法

#1024程序员节|征文# 目录 1.进程优先级 1.1 概念 1.2 为什么有优先级 1.3 Linux进程优先级 2. 概念预备 2.1 并发 2.2 寄存器 主要类型: 2. 进程的调度与切换 3.1 进程调度 3.2 进程切换 4. 调度算法 4.1 runqueue内部结构 4.2 如何调度…

Git使用GUI界面实现任意历史版本对比

首先进入版本历史查看界面 标记某次提交 选择某次提交并和标记的提交对比 可以查看比较结果了,具体到每一个文件每一行代码

一篇文章快速认识 YOLO11 | 目标检测 | 模型训练 | 自定义数据集

本文分享YOLO11的目标检测,主要内容是自定义数据集、数据标注、标签格式转换、模型训练、模型推理等。 目录 1、数据标注 2、Labelme的json转为YOLO的txt 3、配置YOLO11代码工程 4、数据集yaml配置文件 5、YOLO11模型结构配置文件 6、编写训练代码 7、开始训…

Unity 开发学习笔记(0):

文章目录 前言为什么要去学Unity安装国际版Unity总结 前言 我最近打算学习一下Unity。所以打算从零开始做一下相关的学习笔记。 为什么要去学Unity 上位机的上限就这样,没有运动控制和机器视觉,薪资上不去C# 我非常熟练,所以学习Unity成本…

excel判断某一列(A列)中的数据是否在另一列(B列)中

如B列如果有7个元素,在A列右边的空白列中,输入如下公式: COUNTIF($B$1:$B$7,A1), 其中,$B$1:$B$7代表A列中的所有数据即绝对范围,A1代表B列中的一个单元格.

JVM 加载 class 文件的原理机制

JVM 加载 class 文件的原理机制 JVM(Java虚拟机)是一个可以执行Java字节码的虚拟机。它负责执行Java应用程序和应用程序的扩展,如Java库和框架。 文章目录 JVM 加载 class 文件的原理机制1. JVM1.1 类加载器1.2 魔数1.3 元空间 2. 类加载2.1 …

openpnp - 底部相机视觉识别CvPipeLine的参数bug修正

文章目录 openpnp - 底部相机视觉识别的CvPipeLine的参数bug概述笔记openpnp的视觉识别参数的错误原因备注补充 - 如果要直接改默认的底部视觉要注意END openpnp - 底部相机视觉识别的CvPipeLine的参数bug 概述 底部相机抓起一个SOD323的元件,进行视觉识别。 识别…

点餐系统需求分析说明书(软件工程分析报告JAVA)

目录 1 引言 4 1.1 编写目的 4 1.2 项目背景 4 1.3 定义 4 1.4 预期的读者 5 1.5 参考资料 5 2 任务概述 5 2.1 目标 5 2.2 运行环境 5 2.3 条件与限制 6 3 数据描述 6 3.1 静态数据 6 3.2 动态数据 6 3.3 数据库介绍 6 3.4 对象模型 6 3.5 数据采集 7 4 动态模型 7 4.1 脚本 …

《深度学习》 了解YOLO基本知识

目录 一、关于YOLO 1、什么是YOLO 2、经典的检测方法 1)one-stage单阶段检测 模型指标介绍: 2)two-stage多阶段检测 二、关于mAP指标 1、概念 2、IOU 3、关于召回率和准确率 4、示例 5、计算mAP 一、关于YOLO 1、什么是YOLO YOL…

基于泊松洞过程建模的异构蜂窝网络信干比增益与近似覆盖率分析

大家好,我是带我去滑雪! 移动通信业务的高速增长使得传统同构蜂窝网络结构不能满足用户对通信质量的要求,而异 构网络架构可以有效解决这种问题。文中对泊松洞过程下异构蜂窝网络的覆盖率进行研究。首 先,利用泊松洞过程( Poisson…

求助帖:ubuntu22.10 auto install user-data配置了为何还需要选择语言键盘(如何全自动)

0-现象:配置好autoinstll的PXE与user-data文件安装过程仍然要人工选语言、键盘等,非全自动;—— 1.硬件环境:x86_64机器 U盘(/dev/sda); 2.软件环境:DHCPPXE启动做好grub与pxe的aut…

【AI绘画】Midjourney进阶:留白构图详解

博客主页: [小ᶻZ࿆] 本文专栏: AI绘画 | Midjourney 文章目录 💯前言💯什么是构图为什么Midjourney要使用构图 💯留白构图特点使用场景提示词书写技巧测试 💯小结 💯前言 【AI绘画】Midjourney进阶&…