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

news2024/10/3 23:34:40

由于想要验证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_17
        targetCompatibility 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-configuration
      url "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删除了:
在这里插入图片描述
在这里插入图片描述

另外,从 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搜索一下了。。

新的 settings 插件 (尝试未果)

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

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

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

apply plugin 'com.android.settings'

集中全局配置

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

android {
  compileSdk 31
  minSdk 28
  ...
}

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

Flavor 相关的其他配置

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


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

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

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

相关文章

FPGA驱动WM8731音频收发全网最细讲解 提供2套工程源码和技术支持

目录 1、前言2、WM8731音频解读3、vivado工程1介绍4、vivado工程2介绍5、上板调试验证6、资料获取 1、前言 本文用FPGA驱动WM8731音频芯片,实现音频相关的应用,适用于在校学生做毕业设计、研究生项目开发,也适用于在职工程师做项目开发&…

Ae 首选项:启动和修复

使用“首选项”里面的启动和修复 Start and Repair面板,可以解决 Ae 中的首选项设置问题,而无需更改、删除或者重新进行设置。 启动选项 Startup Options 启用主屏幕 Enable Home Screen 确定是否在启动 Ae 时显示主屏幕。 更改将在下次启动时有效。 显示…

element-plus 问题

对话框内部下拉框会在左上角 在对话框内打开下拉框后点击关闭按钮,尚未关闭的下拉框会在左上角出现(或闪现) 解决方案: popper-append-to-body 此方法失效,改用 :teleported"false" teleported:…

JDBC和数据库连接池

文章和代码已经归档至【Github仓库:https://github.com/timerring/java-tutorial 】或者公众号【AIShareLab】回复 java 也可获取。 文章目录 JDBC 概述基本介绍模拟JDBCJDBC 带来的好处 JDBC 快速入门JDBC 程序编写步骤JDBC 第一个程序 获取数据库连接5种方式方式1…

接入 GPT-4 的 AI 虚拟女友,一周狂挣 50 万!

公众号关注 “GitHubDaily” 设为 “星标”,每天带你逛 GitHub! 随着 ChatGPT 的爆火,互联网上也衍生出不少令人直呼脑洞大开的 AI 应用。 最近,国外一位名为 Caryn Marjorie 的小姐姐搞了个骚操作,基于 GPT-4 调教出来…

Spring Cloud LoadBalancer是什么?

什么是Spring Cloud LoadBalancer Spring Cloud LoadBalancer是Spring Cloud官方自己提供的客户端负载均衡器, 用来替代 Ribbon。 Spring官方提供了两种负载均衡的客户端: RestTemplate RestTemplate是Spring提供的用于访问Rest服务的客户端,RestTempla…

30从零开始学Java之详解面向对象的7种创建方式

作者:孙玉昌,昵称【一一哥】,另外【壹壹哥】也是我哦 千锋教育高级教研员、CSDN博客专家、万粉博主、阿里云专家博主、掘金优质作者 前言 在上一篇文章中,壹哥给大家介绍了Java中的类及其特点、创建过程等内容,相信你…

【Nginx高级篇】Lua基础语法和OpenResty的安装

目录 一、前言 二、Lua基础语法 hello world 保留关键字 注释 变量 字符串 空值 布尔类型 作用域 控制语句 if-else for循环 函数 赋值 返回值 Table 数组 遍历 成员函数 三、openresty的安装 (一)预编译安装 (二&…

VMware中Ubuntu拓展磁盘容量的两种方式 图形化方式命令行磁盘分区方式(亲测有效简单且详细)linux磁盘分区

文章目录 前言1. 软件设置扩容2. 容量查看3. 容量拓展实现3.1 图形化容量拓展分配3.2 磁盘命令行方式拓展容量3.2.1 确定磁盘挂载目录3.2.2 系统磁盘扩容 4. 分盘扩容TIPS:总结: 前言 在用VMware虚拟机的情况下,一开始分配的容量在使用过程中…

PMP项目管理-[第十二章]采购管理

采购管理知识体系: 规划采购管理: 实施采购: 控制采购: 12.1 规划采购管理 定义:记录项目采购决策、明确采购方法、识别潜在卖方的过程 作用:确定是否从项目外部获取货物或服务.如果是,则还要确…

循环结构程序设计

一、循环结构语句 C语言提供了三种循环语句(for语句)、while语句和do-while语句。 for语句: for(表达式1 ; 表达式2 ; 表达式3) {   循环体语句; } for语句的执行过程: 首先计算表达式1。判断…

【LED子系统】五、核心层详解(二)

个人主页:董哥聊技术 我是董哥,高级嵌入式软件开发工程师,从事嵌入式Linux驱动开发和系统开发,曾就职于世界500强公司! 创作理念:专注分享高质量嵌入式文章,让大家读有所得! 文章目录…

基于B/S架构、可替代付费商业软件的一站式量化交易平台

产品简介 这是一个面向程序员的量化交易软件,用于期货、股票、外汇、炒币等多种交易场景,实现自动交易。已对接了CTP接口(国内期货)、老虎证券接口(美股港股)。 功能特性: 一站式平台&#x…

Protell99SE祭文

Protell99SE祭文 大概是在21年前的今天,我和你结合在一起,陪伴走过无数的设计。 我的感觉,大概是在2021年吧,你逐渐离我远去。啊,Protel99SE时代一去不复返了。 我用了你21年,虽着AD软件的到来&#xff…

【C++】19.C++11

1.C11 auto 范围for 新容器 线程库列表初始化右值引用和移动语义 lambda表达式容器支持花括号列表初始化 本质是增加一个initializer_list的构造函数initializer_list支持花括号 2.列表初始化 #define _CRT_SECURE_NO_WARNINGS 1 #include <iostream> #include <ve…

​数字化转型升级之工业元宇宙与AIGC

月説小飞象交流会 生活就是&#xff0c;面对复杂&#xff0c;保持欢喜。心烦时&#xff0c;记住三句话&#xff1a;1、算了吧。2、没关系。3、会过去的。 内部交流│24期 数字化转型升级 工业元宇宙与AIGC data analysis ●●●● 分享人&#xff1a;李铁军 ‍ 现如今数字化不再…

定风波、渡重山、至未来:2023中国数字能源生态大会开启的新旅程

全球碳中和的时代背景下&#xff0c;面向3060发展目标&#xff0c;新使命、新技术、新应用的到来&#xff0c;都给能源产业带来了持续变革的必要性与可能性。 2023年5月11日&#xff0c;在2023中国数字能源生态大会上&#xff0c;华为数字能源技术有限公司总裁侯金龙发表了“融…

【微电网】含风、光、储联合发电的微电网优化调度研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

2023 年 IntelliJ IDEA 下载安装教程,超详细图文教程,亲测可用

. IDEA 下载 1、打开浏览器输入https://www.jetbrains.com/&#xff0c;进入 Jetbrains官网&#xff0c;点击 Developer Tools&#xff0c;再点击 Intellij IDEA 2、点击中间的 Download&#xff0c;进入IDEA下载界面 3、选择左边的 Ultimate 版本进行下载安装。Ultimate 版…

心法利器[84] | 最近面试小结

心法利器 本栏目主要和大家一起讨论近期自己学习的心得和体会&#xff0c;与大家一起成长。具体介绍&#xff1a;仓颉专项&#xff1a;飞机大炮我都会&#xff0c;利器心法我还有。 2022年新一版的文章合集已经发布&#xff0c;累计已经60w字了&#xff0c;获取方式看这里&…