当前位置: 首页 > news >正文

Android Studio Flamingo (火烈鸟) 升级踩坑记录

由于想要验证Compose最新的debug特性,而我目前使用的版本(Dolphin 小海豚)不支持,查看官网说明需要最新版本,所以不得已进行了一下Android Studio版本升级,过程中遇到一些问题,本文仅做记录。(真是不想升级,一升级就是连锁反应,需要处理的东西太多了,折腾很久。。)

目前去官网下载最新的稳定版本是 Android Studio Flamingo | 2022.2.1 代号:Flamingo,中文名:火烈鸟

发布日志请查看这里:https://developer.android.com/studio/releases

Android Studio、AGP、Gradle、JDK 版本设置

Android Studio 和 对应插件之间的对应关系:

在这里插入图片描述
Flamingo需要的AGP版本是8.0

注意这里的8.0就对应了工程根目录下build.gradle中的com.android.applicationcom.android.library两个插件的版本号:

在这里插入图片描述

这里以前旧版本中的写法是 dependencies { classpath("com.android.tools.build:gradle:7.3.1") } 现在官方全部采用 plugins {id xxx} 的写法了。

Android 插件 和 对应最低Gradle版本要求之间的对应关系:

在这里插入图片描述
注意这里的Gradle版本就对应gradle/wrapper/gradle-wrapper.properties中的版本:

在这里插入图片描述

这个包比较大,如果你的网比较好,就让AS帮你下,否则可以先到网上搜索一下自行下载好对应的zip包,然后放在C:\Users\用户名\.gradle\wrapper\dists 目录下(Windows用户,苹果同理)。这里可以先打开一下AS,然后看到AS显示正在下载gradle-8.0的提示就马上关闭。AS会在这个目录下生成缓存目录,然后你可以对照该目录下以前下载过的gradle版本,看它怎么放你就怎么放。再重新打开AS,它就会自动加载了,这是离线设置gradle包的方法。

使用 AGP 8.0 还有一些其他配置要求:

在这里插入图片描述

这里最关键的一点是对JDK版本的要求最低是 JDK 17,默认下载的Android Studio Flamingo 会打包自带 JDK 17 并且会自动配置,不需要自己另外下载和配置。但是一般情况下,你升级完肯定是有旧项目要使用新升级的AS打开的,这时旧项目中的JDK相关的配置,仍然需要手动修改,主要修改如下部分内容:

android {...compileOptions {sourceCompatibility JavaVersion.VERSION_17targetCompatibility JavaVersion.VERSION_17}kotlinOptions {jvmTarget = '17'...}
}
...

如果项目中有很多module都有这个配置,则需要全部修改,注意JDK 17是硬性要求,必须要修改。

如果不打算使用Flamingo自带的 JDK 17 ,那么需要自己电脑中独立安装JDK 17,配置好环境变量后,在AS中右键Open Module Settings或选择File->Project Structure按照下图配置:

在这里插入图片描述

以上版本对应关系均可以在这里找到:https://developer.android.com/build/releases/gradle-plugin

Compose 相关版本设置

接下来就是 Compose Compiler 和 对应兼容的 Kotlin 版本之间的对应关系:

在这里插入图片描述
我这里选择的是1.4.3,因为我后面 Compose UI 的版本选的是1.4.3,我想保持一致,当然你可以选择更高的。

但是需要注意的是,这里我们需要根据Compose编译器的版本去选择对应的Kotlin版本,因为其实是这样的,我们需要指定的Compose编译器版本才能去编译指定的Compose UI 版本,而指定的Compose编译器版本需要兼容指定的Kotlin版本,所以其实是要先看你的Compose UI 是用的什么版本。但是总的来说高版本的Compose编译器肯定是能编译低版本的Compose UI的。

以上对应关系可以在这里找到:https://developer.android.com/jetpack/androidx/releases/compose-kotlin

接下来就是 Compose UI 版本的选择:

在这里插入图片描述
这个就比较简单了,目前 Compose UI 的稳定版本是1.4.3,所以前面 Compose Compiler 我选择的也是1.4.3,官方的配置是使用 Compose Compiler 1.4.7 + Compose UI 1.4.3,当然你可以选择按照官方的这种配置方案。

以上版本可以在这里找到:https://developer.android.com/jetpack/androidx/releases/compose-ui

然后我们可以在项目根目录下的build.gradle中统一配置一下:

在这里插入图片描述

在app module模块中引用:

在这里插入图片描述

在这里插入图片描述
至于其他compose库的选择,可以参考这里,或者点击这里进行搜索,它们其实跟AS没有什么太大依赖关系了。

其他一些插件的版本设置

KSP插件版本

由于工程中有一些ksp的demo代码,所以需要更新KSP插件的版本,根据前面选择的kotlin版本到这个地方找对应的版本即可:https://github.com/google/ksp/releases,由于前面选择的kotlin版本是1.8.10,所以这里选择使用1.8.10-1.0.9的版本:

在这里插入图片描述

protobuf插件版本

这个开始我没更新,但是同步gradle后报错,更新后正常。最新版本可以在这里获取:https://github.com/google/protobuf-gradle-plugin/releases,目前最新版本是v0.9.3

在这里插入图片描述
注意,如果你项目中有使用protobuf,且版本是 ≤ 0.9.1 的版本,请跳过 0.9.2,直接升级到 0.9.3+,因为 0.9.2版本有个bug,使用会编译报错,官方在0.9.3版本中修复了。(别问我怎么知道的)

app module的build.gradle中也需要参考官方配置(如果报错的话):https://github.com/google/protobuf-gradle-plugin,目前我的配置如下(运行正常没有报错):

// DataStore-protobuf
protobuf {protoc {artifact = "com.google.protobuf:protoc:3.21.12"}// Generates the java Protobuf-lite code for the Protobufs in this project. See// https://github.com/google/protobuf-gradle-plugin#customizing-protobuf-compilation// for more information.generateProtoTasks {all().configureEach { task ->task.builtins {java {option 'lite'}kotlin {}}}}
}

配置阿里云镜像

如果没有条件“科学上网”,可能下载一些库会比较慢,此时可以配置一下配置阿里云镜像解除封印,速度会快很多,主要是以下几个地址:

maven { url 'https://maven.aliyun.com/repository/central' }
maven { url 'https://maven.aliyun.com/repository/public' }
maven { url 'https://maven.aliyun.com/repository/jcenter' }
maven { url 'https://maven.aliyun.com/repository/google' }
maven { url 'https://maven.aliyun.com/repository/releases' }
maven { url 'https://maven.aliyun.com/repository/snapshots' }
maven { url 'https://maven.aliyun.com/repository/gradle-plugin' }

修改settings.gradlepluginManagementdependencyResolutionManagement中的repositories内容为以上地址即可:

在这里插入图片描述

注意,以上地址如有变化访问不通可以参考这里获取最新地址:https://developer.aliyun.com/mvn/guide

如果 Compose compiler 和 kotlin 版本之间出现兼容问题,可能需要在dependencyResolutionManagementrepositories中添加如下地址:

  maven {// For kotlin Compose Compiler 有对应的兼容 kotlin版本// check: https://github.com/jimgoog/ComposeAppUsingPrereleaseComposeCompiler#project-configurationurl "https://androidx.dev/storage/compose-compiler/repository/"}

这是因为前面提到过的,Compose Compiler 有对应的兼容 kotlin版本,不能乱用,如果出现兼容问题可以参考这个地址解决。

接下终于就可以同步gradle了。。。

在这里插入图片描述

不出意外,同步完果然报错了。。首先发现的错误是代码中不能访问BuildConfig类了,看来还是有需要调整兼容的地方要修改。。

重大更改:构建选项默认值变更

这部分是官网列出来的,在 AGP 8.0 以上以下构建选项的默认值与之前有所不同
在这里插入图片描述

上表中前3个值是与应用代码比较相关的,这三个以前默认是开启的,使用 AGP 8.0 以后需要用户手动开启,否则默认是关闭的。尤其是第一个,也就是说现在默认不会生成BuildConfig这个类了,哪个模块需要就在哪个模块中自行开启,因此需要在app module的build.gradle中做如下修改:

android {...buildFeatures {compose true // Enable BuildConfig only for modules that need it. AGP 8.0 开始需要手动开启buildConfig = true// 以下需要的话同样需要手动开启// aidl = true// renderScript = true}
}
...

这样就能在代码中访问到BuildConfig类了。

上表中后3个值中我们需要关注的是关于R类的生成,在默认情况下对于库模块是不可传递的,这意味着每个R类只包含库模块本身声明的资源,而不是来自其依赖项的资源。

gradle.properties文件中的nonTransitiveRClass标志控制R类的行为。从 AGP 8.0 开始,它在未指定时默认值为 true(不传递)。并且,在引用资源时必须使用 完全限定的命名空间 调用。

在这里插入图片描述

R类是将资源名称映射到代码中的 ID 的生成类。在 Android Studio Bumblebee / AGP 7.1 之前,R类是可传递的。这意味着构建不仅仅是为该库生成R类而是为该库所依赖的所有模块生成资源 ID。这一行为将导致体积更大的apk文件和更长的构建时间。

在非传递行为中,每个库模块R类仅包含模块本身声明的资源,从而减少了该模块R类的大小。

在这里插入图片描述

相比以前减少体积,加快构建速度,且不会出现同名R类资源覆盖问题(因为指定包名调用)。

提到R类,这里还有一个与R类相关的配置需要注意一下,虽然不是从AGP 8.0开始要求的,但是新版本中仍然是需要的:在gradle中指定namespace属性作为资源命名空间,以替代AndroidManifest.xml中的package属性。在以前AndroidManifest.xml中的package同时承担了applicationId和资源命名空间的角色,后来gradle中专门提供了一个applicationId用作应用标识,现在,直接使用两个专门的属性applicationIdnamespace分别表示应用标识和资源命名空间,更加明确了。

现在可以将package属性从AndroidManifest.xml删除了:
在这里插入图片描述
在这里插入图片描述

如果你使用 Android Studio Flamingo 运行 flutter 项目,可能会遇到与namespace相关的问题,例如:

在这里插入图片描述

这个有可能是Flutter插件所使用的AGP与AGP 8.0 冲突导致的,已经有人在github上提出了这个已知问题:[add-to-app] error : Namespace not specified. Please specify a namespace in the module’s build.gradle

另外,从 AGP 8.0 开始,以下选项值默认值不能修改,它们默认被强制设置为true,即便你在gradle.properties文件中声明,也会被忽略。

在这里插入图片描述
看了一眼,这个表中的标志我基本上从来没用过,所以直接跳过。

接下终于可以继续同步gradle了。。。

在这里插入图片描述
不出意外,同步完果然又双叒报错了。。

不过这次是一些Compose的代码报错,查看了一下基本上是一些api的变动,比如之前使用某个API需要添加实验性API的注解,现在注解报错,提示不存在了,说明该API转正了,那么直接将报错的注解删除即可。

如果是某个api方法不存在了、或方法参数改变了,这时需要查找对应的新版本的解决方法,不过好在 Compose UI虽然更新快,但是有更新日志:https://developer.android.com/jetpack/androidx/releases/compose-ui

比如下面这个报错了,不知道怎么正确实现,可以复制它,然后到上面的Compose UI Release Notes地址页面Ctrl+F搜索:

在这里插入图片描述
在这里插入图片描述
可以看到modifierElementOf这个api确实被删除了,替代方案是使用继承ModifierNodeElement类的方式,在AS找到ModifierNodeElement类源码:

在这里插入图片描述

复制ModifierNodeElementSample,然后到 https://cs.android.com/ 中搜索:

在这里插入图片描述

可以看到这里就能找到关于该类如何使用的官方的示例代码。其他报错Api可以参考这个方式查找,如果实在找不到,只能Google搜索一下了。

修复完相关代码报错后继续运行。。。

在这里插入图片描述

这次报了一个aar库找不到的错误:

在这里插入图片描述

这个错误非常奇怪,而且不是总是出现,它说在这个地址:https://maven.aliyun.com/repository/central/com/github/skydoves/landscapist/2.1.1/landscapist-2.1.1.aar 中 Could not find landscapist-2.1.1.aar,但实际上是可以访问到的,甚至能直接点击链接下载下来。不知道为什么,可能阿里云同步的文件有问题?无奈,我只能把settings.gradledependencyResolutionManagement的repositories里将mavenCentral()加了回去:

dependencyResolutionManagement {repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)repositories {mavenCentral() // 不加这个提示阿里云的地址找不到landscapist-2.1.1.aar // 阿里云镜像maven { url 'https://maven.aliyun.com/repository/central' }maven { url 'https://maven.aliyun.com/repository/public' }maven { url 'https://maven.aliyun.com/repository/jcenter' }maven { url 'https://maven.aliyun.com/repository/google' }maven { url 'https://maven.aliyun.com/repository/releases' }maven { url 'https://maven.aliyun.com/repository/snapshots' }maven { url 'https://maven.aliyun.com/repository/gradle-plugin' }}
}

但是加了mavenCentral()有可能国内的网访问很慢或者下载不到这个aar有可能需要科学上网。

加这个之后,就运行成功了。。真的不容易。。

新的 settings 插件 (尝试未果)

AGP 8.0.0-alpha09 引入了新的settings设置插件。设置插件可让您将全局配置(适用于所有模块的配置)集中在一个地方,这样您就无需在多个模块中复制和粘贴配置。此外,您可以使用设置插件来创建工具 执行配置文件,或关于如何运行工具的不同说明,并在它们之间切换。(官方终于知道要搞一个这个了,真是后知后觉,民间不知道搞了多少年了。。)

注意:设置插件目前只能在 Groovy 中使用。

要使用设置插件,请在settings.gradle文件中应用该插件:

apply plugin 'com.android.settings'

集中全局配置

要配置Global全局配置,请使用settings.gradle文件中的 android {} 新块。这是一个例子:

android {compileSdk 31minSdk 28...
}

但以上配置我尝试未能成功,在settings.gradle中添加apply plugin 'com.android.settings'报错不被识别,原因未知,如果有尝试成功的请留言告知。

Flavor 相关的其他配置

可以参考:https://developer.android.com/build/build-variants


最后再吐槽一下,Android官方也没有一个Android Studio升级的指南清单,每次都是自己遇到问题一个一个的现查现卖,每次升级都是大型车祸现场,简直不要太惨了。。

相关文章:

Android Studio Flamingo (火烈鸟) 升级踩坑记录

由于想要验证Compose最新的debug特性,而我目前使用的版本(Dolphin 小海豚)不支持,查看官网说明需要最新版本,所以不得已进行了一下Android Studio版本升级,过程中遇到一些问题,本文仅做记录。&a…...

【JAVA凝气】异常篇

哈喽~大家好呀,这篇来看看JAVA异常篇。 目录 一、前言 二、Exception 异常 1、Java 的非检查性异常 2、Java 检查性异常类 三、Error 错误 四、捕获异常 五、多重捕获块 六、throws/throw 关键字 七、自定义异常类 八、图书推荐 一、前言 异常是程序中的一…...

C++中的函数模板

目录 1. 什么是函数模板? 2. 如何定义函数模板? 3. 如何使用函数模板? 4. 函数模板与函数重载的区别是什么? 5. 函数模板与类模板有何异同点? 1. 什么是函数模板? - 函数模板是一种通用的函数描述&…...

MapReduce【Shuffle-Combiner】

概述 Conbiner在MapReduce的Shuffle阶段起作用,它负责局部数据的聚合,我们可以看到,对于大数据量,如果没有Combiner,将会在磁盘上写入多个文件等待ReduceTask来拉取,但是如果有Combiner组件,我们…...

postman接口自动化测试

Postman除了前面介绍的一些功能,还有其他一些小功能在日常接口测试或许用得上。今天,我们就来盘点一下,如下所示: 1.数据驱动     想要批量执行接口用例,我们一般会将对应的接口用例放在同一个Collection中&#xf…...

历经70+场面试,我发现了大厂面试的套路都是···

今年的金三银四刚刚过去,我又想起了我在去年春招时面试了50余家,加上暑期实习面试了20余家,加起来也面试了70余场的面试场景了。 基本把国内有名的互联网公司都面了一遍,不敢说自己的面试经验很丰富,但也是不差的。 …...

可视区域兼容性问题的思考及方法封装

今日在复习可视化尺寸获取时突发奇想,为什么要在怪异模式下使用document.body.clientWidth,在标准模式下使用document.documentElement.clientWidth?以及是否在IE8及以下的版本中其中一个获取方式将返回undefined或0。  出于该问题的思考&am…...

安全工具 | CMSeeK [指纹识别]

0x00 免责声明 本文仅限于学习讨论与技术知识的分享,不得违反当地国家的法律法规。对于传播、利用文章中提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,本文作者不为此承担任何责任,一旦造成后果请自行承担…...

Android新logcat使用技巧

Android新logcat使用技巧 logcat新UI出现后,我常困惑于怎么过滤log,和以前的UI差异比较大,新UI界面结构如下: 这个新的 logcat 的问题是如何过滤信息并不是很明显。 获取应用的日志信息 要获取我们当前调试应用的日志信息&…...

使用Makefile笔记总结

文章目录 一、简单了解Makefile1.1 Makefile示例1.2 基本规则1.3 make是如何工作的1.4 使用变量1.5 make自动推导 二、变量2.1 变量的定义和引用2.2 变量的两种高级用法2.3 override 和 define 关键字2.4 环境变量与目标变量2.5 自动变量 三、Makefile规则3.1 通配符3.2 目标依…...

npm下载依赖项目跑不起来--解决方案

code ERESOLVE npm ERR! ERESOLVE unable to resolve dependency tree npm ERR! npm ERR! While resolving: vue-element-admin4.4.0 npm ERR! Found: webpack4.46.0 npm ERR! node_modules/webpack npm ERR! webpack“^4.23.0” from the root project npm ERR! npm ERR! Coul…...

SolVES模型生态系统服务功能社会价值评估

查看原文>>>SolVES 模型生态系统服务功能社会价值评估(基于多源环境QGIS、PostgreSQL、ArcGIS、Maxent、R语言) 目录 第一章、理论基础与研究热点 第二章、SolVES 4.0 模型运行环境配置 第三章、SolVES 4.0 模型运行 第四章、数据获取与入…...

Godot引擎 4.0 文档 - 入门介绍 - 学习新功能

本文为Google Translate英译中结果,DrGraph在此基础上加了一些校正。英文原版页面: Learning new features — Godot Engine (stable) documentation in English 学习新功能 Godot 是一个功能丰富的游戏引擎。有很多关于它的知识。本页介绍了如何使用…...

如何进行MySQL漏洞扫描

MySQL是一款广泛使用的关系型数据库管理系统,但由于其复杂的结构和功能,也存在不少安全漏洞,容易被黑客攻击。为了解决这些安全问题,进行MySQL漏洞扫描是必要的。那么MySQL怎么进行漏洞扫描?如何进行漏洞扫描?接下来就让小编带大…...

C语言函数大全-- x 开头的函数(3)

C语言函数大全 本篇介绍C语言函数大全-- x 开头的函数 1. xdr_opaque 1.1 函数说明 函数声明函数功能bool_t xdr_opaque(XDR *xdrs, char *buf, u_int len);用于编码或解码任意长度的二进制数据 参数: xdrs : 指向 XDR 数据结构的指针,表…...

计算机图形学-GAMES101-12阴影

Shadow mapping 问题的提出 我们之前在进行着色时,对于每个物体仅考虑自己,而不考虑其他物体对它的影响。限定在光栅化中,如何解决阴影问题呢?阴影能被摄像机看到,但不能被光源所照亮。经典的Shadow mapping只能处理…...

iOS_Swift高阶函数

iOS_Swift高阶函数 #mermaid-svg-NxX1czIESDq47OQw {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-NxX1czIESDq47OQw .error-icon{fill:#552222;}#mermaid-svg-NxX1czIESDq47OQw .error-text{fill:#552222;stroke:#…...

探索Vue的组件世界-组件复用

目录 Mixin【混入】 缺陷 HOC(higher order component)【高阶组件】 相比较Mixin的优点: 不足: Renderless组件【函数式组件,无渲染组件,Vue社区使用比较多的一种业务复用模式】 优点: M…...

OMA通道-2

1 简介 本文档中指定的 API 使移动应用程序能够访问移动设备中的不同 SE,例如 SIM 或嵌入式 SE。 本规范提供了接口定义和 UML 图,以允许在各种移动平台和不同的编程语言中实现。 如果编程语言支持命名空间,则它应为 org.simalliance.openmob…...

SAP 用CO13冲销工序报工,但是没有产生货物移动(TCODE:CO1P 、 SE38 :CORUPROC,CORUAFWP)

前言 通常情况下,对PPO做GI或GR的时候,出现的异常可以在COGI中间被列出;在这些数据进入COGI之前,系统会把这些数据记录在CO1P中;换句话说,系统有时会出现DB的更新延时,当延时发生的时候&#xf…...

装饰模式(Decorator Pattern)重构java邮件发奖系统实战

前言 现在我们有个如下的需求,设计一个邮件发奖的小系统, 需求 1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其…...

突破不可导策略的训练难题:零阶优化与强化学习的深度嵌合

强化学习(Reinforcement Learning, RL)是工业领域智能控制的重要方法。它的基本原理是将最优控制问题建模为马尔可夫决策过程,然后使用强化学习的Actor-Critic机制(中文译作“知行互动”机制),逐步迭代求解…...

【入坑系列】TiDB 强制索引在不同库下不生效问题

文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...

【JavaSE】绘图与事件入门学习笔记

-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角,以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向,距离坐标原点x个像素;第二个是y坐标,表示当前位置为垂直方向,距离坐标原点y个像素。 坐标体系-像素 …...

【论文阅读28】-CNN-BiLSTM-Attention-(2024)

本文把滑坡位移序列拆开、筛优质因子,再用 CNN-BiLSTM-Attention 来动态预测每个子序列,最后重构出总位移,预测效果超越传统模型。 文章目录 1 引言2 方法2.1 位移时间序列加性模型2.2 变分模态分解 (VMD) 具体步骤2.3.1 样本熵(S…...

select、poll、epoll 与 Reactor 模式

在高并发网络编程领域,高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表,以及基于它们实现的 Reactor 模式,为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。​ 一、I…...

【C++从零实现Json-Rpc框架】第六弹 —— 服务端模块划分

一、项目背景回顾 前五弹完成了Json-Rpc协议解析、请求处理、客户端调用等基础模块搭建。 本弹重点聚焦于服务端的模块划分与架构设计,提升代码结构的可维护性与扩展性。 二、服务端模块设计目标 高内聚低耦合:各模块职责清晰,便于独立开发…...

Map相关知识

数据结构 二叉树 二叉树,顾名思义,每个节点最多有两个“叉”,也就是两个子节点,分别是左子 节点和右子节点。不过,二叉树并不要求每个节点都有两个子节点,有的节点只 有左子节点,有的节点只有…...

精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南

精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南 在数字化营销时代,邮件列表效度、用户参与度和网站性能等指标往往决定着创业公司的增长成败。今天,我们将深入解析邮件打开率、网站可用性、页面参与时…...

什么是Ansible Jinja2

理解 Ansible Jinja2 模板 Ansible 是一款功能强大的开源自动化工具,可让您无缝地管理和配置系统。Ansible 的一大亮点是它使用 Jinja2 模板,允许您根据变量数据动态生成文件、配置设置和脚本。本文将向您介绍 Ansible 中的 Jinja2 模板,并通…...