Android Gradle 插件 8.3.0 (2024年2月)

Android Gradle 插件 8.3.0 是一个主要版本,其中包含各种新功能和改进。

兼容性

Android Gradle 插件 8.3 支持的最大 API 级别是 API 级别 34。以下是其他兼容性信息

最低版本 默认版本 备注
Gradle 8.4 8.4 要了解更多信息,请参阅 更新 Gradle
SDK Build Tools 34.0.0 34.0.0 安装配置 SDK Build Tools。
NDK N/A 25.1.8937393 安装配置 不同版本的 NDK。
JDK 17 17 要了解更多信息,请参阅 设置 JDK 版本

以下是 Android Gradle 插件 8.3 中的新功能。

补丁版本

以下是 Android Studio Iguana 和 Android Gradle 插件 8.3 中补丁版本的列表。

Android Studio Iguana | 2023.2.1 Patch 2 和 AGP 8.3.2 (2024年4月)

此小更新包括 这些错误修复

Android Studio Iguana | 2023.2.1 Patch 1 和 AGP 8.3.1 (2024年3月)

此小更新包括 这些错误修复

支持 Gradle 版本目录

Android Studio 支持基于 TOML 的 Gradle 版本目录,此功能允许您在一个中心位置管理依赖项,并在模块或项目之间共享依赖项。Android Studio 现在可以通过编辑器建议和与**项目结构**对话框的集成,更轻松地配置版本目录。了解如何 设置和配置 Gradle 版本目录 或如何 将您的构建迁移到版本目录

代码补全和导航

当您编辑 TOML 文件格式中的版本目录或将依赖项从版本目录添加到构建文件时,Android Studio 提供代码补全功能。要使用代码补全功能,请按 Ctrl+Space(macOS 上为 Command+Space)。此外,您可以通过按 Ctrl+b(macOS 上为 Command+b)快速从应用的 build.gradle 文件中的依赖项引用导航到其在版本目录中的声明位置。

Code completion when adding a dependency

与项目结构对话框集成

如果您的项目使用在 TOML 文件格式中定义的版本目录,则可以通过 Android Studio 中的**项目结构**对话框**变量**视图(**文件 > 项目结构 > 变量**)编辑您在那里定义的变量。对于每个版本目录,都有一个下拉列表,其中列出了该目录中的变量。要编辑变量,请单击其值并将其覆盖。保存这些更改时,TOML 文件会相应更新。

Variables from a version catalog in the Project Structure dialog

您也可以在**项目结构**对话框的**依赖项**视图中更新依赖项(**文件 > 项目结构 > 依赖项**)。要使用**项目结构**对话框更新版本,请导航到要编辑的模块和依赖项,然后更新**请求的版本**字段。保存这些更改后,TOML 文件将相应更新。请注意,如果依赖项版本是使用变量定义的,则以这种方式直接更新版本会将变量替换为硬编码值。还要注意,无论您是否使用**项目结构**对话框,从构建文件中删除依赖项都不会从版本目录中删除该依赖项。

Dependencies from a version catalog in the Project Structure dialog

已知问题和局限性

以下是 Android Studio 中 Gradle 版本目录支持的已知问题或局限性。

  • Kotlin 脚本文件中插件别名声明的错误高亮显示:当您添加 alias(libs.plugins.example) 形式的插件声明时,编辑器会在 libs 部分下方添加红色下划线。这是 Gradle 8.0 及以下版本中的已知问题,将在 Gradle 的未来版本中解决。

  • 仅支持 TOML 格式的版本目录的 Android Studio 支持:目前,Android Studio 代码补全、导航和项目结构对话框支持仅适用于在 TOML 文件格式中定义的版本目录。但是,您仍然可以直接在 settings.gradle 文件中添加版本目录并在项目中使用其依赖项。

  • 不支持 KTS 构建文件的导航:使用 Control+单击(macOS 上为 Command+单击)导航到版本目录中的依赖项定义,目前尚不支持使用 Kotlin 脚本编写的构建文件。

  • Firebase 助手直接在构建脚本中添加依赖项:Firebase 助手 将依赖项直接添加到您的构建脚本中,而不是通过版本目录。

  • 不支持“查找用法”功能:目前尚不支持查找其他构建文件中版本目录变量的用法,无论构建文件是 KTS 还是 Groovy。也就是说,在版本目录中对变量定义使用 Control+单击(macOS 上为 Command+单击)不会指向使用该变量的构建文件。

  • 如果 Android Studio 中的项目结构对话框位于根 gradle 文件夹中,则会显示多个目录文件,但不会显示 复合构建 的目录。例如,如果您有两个目录文件——一个用于您的应用,另一个用于复合构建——项目结构对话框只会显示应用目录文件。您可以使用复合构建,但是必须直接编辑其 TOML 文件。

其他 SDK 洞察:策略问题

对于在 Google Play SDK 索引 中存在 Play 策略违规的公共 SDK,Android Studio 会在 build.gradle.ktsbuild.gradle 文件以及**项目结构对话框**中显示 Lint 警告。您应该更新任何违反 Play 策略的依赖项,因为这些违规可能会阻止您将来发布到 Google Play Console。策略违规警告补充了 Android Studio 显示的 过时版本警告

Android Studio compileSdk 版本支持

如果您的项目使用的 compileSdk 不受当前版本的 Android Studio 支持,Android Studio 会显示警告。如果可用,它还会建议迁移到支持项目使用的 compileSdk 的 Android Studio 版本。请记住,升级 Android Studio 也可能需要您升级 AGP。如果项目使用的 compileSdk 不受当前版本的 AGP 支持,AGP 也会在**构建**工具窗口中显示警告。

Lint 行为更改

从 Android Gradle 插件 8.3.0-alpha02 开始,在模块上运行 Lint 时,将为模块的主组件和测试组件分别运行 Lint 分析任务。此更改的原因是为了提高性能。要恢复到之前的行为,请在 gradle.properties 文件中设置 android.experimental.lint.analysisPerComponent=false

默认情况下启用精确资源缩减

精确资源缩减会从 resources.arsc 文件中删除未使用的条目,并消除未使用的资源文件,默认情况下处于启用状态。启用此缩减后,您的资源表将减小,并且 APK 中仅包含引用的 res 文件夹条目。

要关闭精确资源缩减,请在项目的 gradle.properties 文件中将 android.enableNewResourceShrinker.preciseShrinking 设置为 false

已修复的问题

Android Gradle 插件 8.3.0

已修复的问题
Android Gradle 插件
构建缓存对于 PackageForUnitTest 任务是冗余的
[AGP 8.1.0] 如果 splits.abi.isEnable 和 testOptions.unitTests.isIncludeAndroidResources 都为 true,则 ./gradlew test 失败并显示“无法找到清单输出”
使用嵌套 Gradle 复合构建时,AGP 模型构建失败
资源缩减器会破坏资源 ID,导致运行时崩溃
最小 Gradle 版本检查不会在第二次构建及之后运行
将 AGP 从 8.0.2 更新到 8.1.0 后,任务 ':app:mergeReleaseClasses' 执行失败
[Gradle 8.4][升级] 由于在 Kotlin Gradle 插件中使用了已弃用的功能,升级后集成测试失败
不要在配置阶段检查清单覆盖文件是否存在
指向 Gradle 文档中关于 MergeJavaResWorkAction 错误的链接已损坏
Gradle 8.1 由于 .gradle/.android/analytics.settings 而破坏了配置缓存
AGP 不应在没有 ProjectComponentIdentifier.build 的情况下使用 ProjectComponentIdentifier.projectPath
请减少/删除 AGP“分析其他插件到 proto:...”的信息级日志记录
[Gradle 8.4][升级] ProcessJavaResTask 中的配置阶段文件操作会破坏配置缓存
用于获取符号表 (R.txt) 的 Variant API
lint 独立插件无法正确处理 gradleApi() 依赖项
AGP 类/属性的 kDocs 不佳。`VariantOutput.enable` 建议将其替换为 `VariantOutput.enable`
AGP 8.3.0-alpha02 无法在 Windows 主机上安装发布配置文件
强制执行 `android.enableDexingArtifactTransform=true`
[Gradle 8.4][升级] 升级后集成测试失败,原因是配置阶段的文件处理
AGP 8.3.0-alpha-02 - `错误:无法反序列化缓存的资源存储库。`
[Gradle 8.4][升级] TestLabBuildService 配置阶段的文件处理导致升级后集成测试失败
AGP 8.1.0 在运行检测测试后卸载应用程序 - 7.4.2 不会
转换 APK 会导致 ListingFileRedirectTask 出错
转换 ASSETS 工件会提供错误的输入/输出位置
将 android.experimental.r8.dex-startup-optimization=true 提升为默认值
迁移到新的 Gradle 配置对齐 API
当 Kotlin 编译器尝试更新到 IDEA 21.3 时,资源编译失败
使用工件 API 的 Reactive get()
将“android.lint.printStackTrace”AGP 属性提升到稳定版
AGP 8.1.0:动态功能:exportReleaseConsumerProguardFiles 和 extractProguardFiles 之间的隐式依赖会导致编译错误
`variant.unitTest.jniLibs.addGeneratedSourceDirectory` 似乎没有任何作用
更新 AGP 中使用的 XML 解析器以实现 Gradle 8.4 兼容性
AGP 8.0.1 发布包 JaCoCo 检测无效
HEDGEHOG 回归:运行按钮延迟几秒钟(创建规范)
AGP 8.3.0-alpha11 生成在启动时使用 android.content.res.Resources$NotFoundException 崩溃的发布 APK
将“android.lint.printStackTrace”AGP 属性提升到稳定版
功能请求:将 com.android.build.api.extension.impl.CURRENT_AGP_VERSION 提升为公共 API
SDK 管理器应停止向标准输出发送大量日志信息
DexArchiveBuilderTaskDelegate 使用仅资源库模块失败
AGP7.4 自定义插件变体对所有抛出重复条目:META-INF/MANIFEST.MF 异常进行转换
支持新的清单标签
studio 设置中“解耦项目”的链接指向错误的位置。
请提供选项以在 Javadoc 和 SourceJar 中包含生成的源代码
需要快速修复 compileSdk 和具有 minCompileSdkVersion 的依赖项之间的差异
[Gradle] tools:overrideLibrary 应支持星号 (*)
编辑清单时 UI 冻结
无法在 AGP 8.2.0 中设置 JaCoCo 版本
使用动态功能的项目中 Android Gradle 插件 8.2.0 install 任务失败
使用动态功能的项目中 Android Gradle 插件 8.2.0 install 任务失败
Dexer (D8)
[反糖化库] 反糖化库版本 2.1 与早期版本的 R8 不兼容
即使仅使用 D8 也运行优化?
Lint
[Lint] TranslucentViewDetector 在 filterIncident 函数中崩溃并导致 Lint 生成错误的结果
TranslucentViewDetector 应接受“behind”值
Android Lint 在具有 `属性 'variantInputs.name' 没有配置的值。` 的 KMP 库上失败。
TranslucentViewDetector 在清单中报告错误的行
使用项目依赖项时,lintDebug 错误地报告 UseTomlInstead 警告
Android Lint 标记的另一个项目的意外问题
LINT 检查未使用的资源在绑定和点击监听器内部的误报检测
无法加载自定义lint检查jar文件:Node无法转换为TreeNode
对于变量声明中带注释的类的用法,Lint visitAnnotationUsage未被调用
Lint 31.0.2 失败,提示 java.util.NoSuchElementException: Array is empty。
没有关于kotlin.text.MatchNamedGroupCollection#get(String)需要API 26的Lint警告
lint:TypographyQuotes 误报:多个转义的撇号被忽略
AGP 8.0.2 lint InvalidId 检测器误报
LintError问题已添加到lint基线
快速修复Lint不起作用,并导致IDE错误
由于部分分析导致测试失败不一致
错误地高亮显示了误报警告
对于变量声明中带注释的类的用法,Lint visitAnnotationUsage未被调用
未使用的资源处理器可能会删除Gradle构建文件
NewApi lint检查不理解“isAtleastU() && otherCondition()”最终字段
来自`LintClient.getSdkHome`的StackOverflow
Android Studio/Lint不会告知您“platform”依赖项何时过期
Bug:没有建议更新 Firebase-bom 依赖项
项目结构(和Gradle?)无法发现需要升级到较新版本的Firebase BOM依赖项。
Lint集成
来自testImplementation依赖项的DuplicatePlatformClasses lint错误
代码缩减器 (R8)
从AGP 8.0.2升级到8.1.0后,R8无法工作
isShrinkResources在8.3.0-alpha11到alpha14中过度优化
使用AGP 8.2.0时,R8 Flurry SDK崩溃
Android - R8导致LinearLayoutManager的子类崩溃
R8 v8.2.33,升级后出现“java.lang.VerifyError: Bad type on operand stack”运行时崩溃
[R8 8.3.21] R8 8.3.21 比 R8 8.1.56 大 1.57MB
[R8 8.3.21] R8 8.3.21 比 R8 8.1.56 大 1.57MB
class.getInterfaces() 返回空
Test SimpleKotlinEnumUnboxingTest 在 kotlin_dev 机器人上失败

Android Gradle 插件 8.3.1

已修复的问题
Android Gradle 插件
MergeJavaResourcesTask 增量输入处理问题
Lint集成
Lint无法在AGP 8.3.0-rc02中解析同级源集的类型

Android Gradle 插件 8.3.2

已修复的问题
Android Gradle 插件
启用反糖化功能的AGP 8.3可能会发生死锁
AGP 8.3破坏了zipApksFor任务
Lint集成
Lint无法消除KMP依赖项的歧义