Android Gradle Plugin 8.3.0(2024 年 2 月)

Android Gradle 插件 8.3.0 是一个主要版本,包含各种新特性和改进。

兼容性

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

最低版本 默认版本 备注
Gradle 8.4 8.4 要详细了解,请参阅更新 Gradle
SDK 构建工具 34.0.0 34.0.0 安装配置 SDK 构建工具。
NDK 不适用 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 月)

此次次要更新包含这些 bug 修复

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

此次次要更新包含这些 bug 修复

支持 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 中项目结构对话框的变量视图(File > Project Structure > Variables)编辑您在该目录中定义的变量。对于每个版本目录,都有一个下拉菜单,其中列出了该目录中的变量。要编辑变量,请点击其值并进行覆盖。保存这些更改后,TOML 文件会相应更新。

Variables from a version catalog in the Project Structure dialog

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

Dependencies from a version catalog in the Project Structure dialog

已知问题和限制

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

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

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

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

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

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

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

其他 SDK 分析:政策问题

对于在 Google Play SDK 索引中存在 Play 政策违规行为的公共 SDK,Android Studio 会在 build.gradle.ktsbuild.gradle 文件以及项目结构对话框中显示 lint 警告。您应更新任何违反 Play 政策的依赖项,因为这些违规行为可能会导致您将来无法发布到 Google Play 管理中心。政策违规警告补充了 Android Studio 显示的过时版本警告

Android Studio compileSdk 版本支持

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

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 Plugin
PackageForUnitTest 任务的构建缓存冗余
[AGP 8.1.0] 如果 splits.abi.isEnable 和 testOptions.unitTests.isIncludeAndroidResources 都为 true,则 ./gradlew test 会失败,并出现“Unable to find manifest output”错误
AGP 模型构建在嵌套的 gradle 复合构建中失败
资源缩减器损坏资源 ID,导致运行时崩溃
最低 Gradle 版本检查在第二次构建及之后不会运行
从 AGP 8.0.2 更新到 8.1.0 后,任务 ':app:mergeReleaseClasses' 执行失败
[Gradle 8.4][升级] 由于 kotlin gradle 插件中使用了已弃用的功能,升级后集成测试失败
在配置阶段不要检查 manifest overlay 文件的存在
指向关于 MergeJavaResWorkAction 错误的 Gradle 文档的链接已损坏
Gradle 8.1 由于 .gradle/.android/analytics.settings 导致配置缓存失效
AGP 不应在没有 ProjectComponentIdentifier.build 的情况下使用 ProjectComponentIdentifier.projectPath
请减少/移除 AGP“Analytics other plugin to proto: ...”的信息级别日志记录
[Gradle 8.4][升级] ProcessJavaResTask 在配置阶段的文件操作破坏了配置缓存
用于获取符号表 (R.txt) 的 Variant API
lint 独立插件无法正确处理 gradleApi() 依赖项
AGP 类/属性上的 kDocs 写得不好。`VariantOutput.enable` 建议应将其替换为 `VariantOutput.enable`
AGP 8.3.0-alpha02 无法在 Windows 主机上安装 release profile
强制执行 `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 时资源编译失败
使用 artifacts API 的响应式 get()
将“android.lint.printStackTrace”AGP 属性提升为稳定版
AGP 8.1.0: 动态功能:exportReleaseConsumerProguardFiles 和 extractProguardFiles 之间的隐式依赖关系导致编译错误
`variant.unitTest.jniLibs.addGeneratedSourceDirectory` 似乎不起作用
更新 AGP 中用于兼容 Gradle 8.4 的 XML 解析器
AGP 8.0.1 release 包 jacoco 插桩不起作用
HEDGEHOG 回归:运行按钮延迟几秒(正在创建规范)
AGP 8.3.0-alpha11 生成的 release APK 在启动时崩溃,并出现 android.content.res.Resources$NotFoundException 错误
将“android.lint.printStackTrace”AGP 属性提升为稳定版
功能请求:将 com.android.build.api.extension.impl.CURRENT_AGP_VERSION 提升为公共 API
SDK Manager 应停止向 stdout 输出垃圾日志信息
DexArchiveBuilderTaskDelegate 因仅含资源的库模块而失败
AGP7.4 自定义插件 variant toTransform for all 抛出重复条目:META-INF/MANIFEST.MF 异常
支持新的 Manifest 标签,
studio 设置中“解耦项目”的链接指向错误的位置。
请提供在 Javadoc 和 SourceJar 中包含生成源码的选项
需要快速修复 compileSdk 与 minCompileSdkVersion 依赖项之间的差异
[Gradle] tools:overrideLibrary 应支持星号 (*)
编辑 manifest 时 UI 冻结
无法在 AGP 8.2.0 中设置 JaCoCo 版本
在使用动态功能的项目中,Android Gradle 插件 8.2.0 安装任务失败
在使用动态功能的项目中,Android Gradle 插件 8.2.0 安装任务失败
Dexer (D8)
[脱糖库] 脱糖库版本 2.1 与之前版本的 R8 不兼容
即使只使用 D8 也会运行优化?
Lint
[Lint] TranslucentViewDetector 在 filterIncident 函数中崩溃并导致 lint 生成错误结果
TranslucentViewDetector 应接受“behind”值
Android Lint 在 KMP 库上失败,并出现 `property 'variantInputs.name' doesn't have a configured value.` 错误
TranslucentViewDetector 在 manifest 中报告错误的行
lintDebug 在使用项目依赖项时错误地报告 UseTomlInstead 警告
Android Lint 标记了来自另一个项目的意外问题
LINT 检查 Unused Resource 在绑定和点击监听器内部误报
无法加载自定义 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 基线
Quickfix Lint 不起作用并导致 IDE 错误
由于部分分析导致测试失败不一致
误报警告的无效高亮显示
Lint visitAnnotationUsage 不在变量声明中调用带注解类的用法
未使用的资源处理器可能会删除 Gradle 构建文件
NewApi lint 检查不理解“isAtleastU() && otherCondition()”最终字段
`LintClient.getSdkHome` 导致的 StackOverflow
Android Studio / Lint 不会告知您“平台”依赖项何时已过时
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 中过度优化
R8 Flurry SDK 在 AGP 8.2.0 下崩溃
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 bot 上失败

Android Gradle 插件 8.3.1

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

Android Gradle 插件 8.3.2

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