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 不适用 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 补丁 2 和 AGP 8.3.2(2024 年 4 月)

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

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

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

支持 Gradle 版本目录

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

代码补全和导航

当您修改 TOML 文件格式的版本目录或将版本目录中的依赖项添加到 build 文件时,Android Studio 会提供代码补全功能。如需使用代码补全功能,请按 Ctrl+Space(在 macOS 上,按 Command+Space)。此外,您还可以按 Ctrl+b(在 macOS 上,按 Command+b)快速从应用的 build.gradle 文件中的依赖项引用跳转到版本目录中声明该依赖项的位置。

添加依赖项时的代码补全

与“Project Structure”对话框集成

如果您的项目使用的是采用 TOML 文件格式定义的版本目录,您可以通过 Android Studio 中的 Project Structure 对话框 Variables 视图(依次点击 File > Project Structure > Variables)修改您在其中定义的变量。每个版本目录都有一个下拉列表,其中列出了该目录中的变量。如需修改变量,请点击其值并覆盖该值。保存这些更改后,TOML 文件会相应地更新。

“Project Structure”对话框中版本目录中的变量

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

“Project Structure”对话框中版本目录中的依赖项

已知问题和限制

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

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

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

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

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

  • 不支持“查找用例”功能:无论 build 文件是 KTS 还是 Groovy 格式,都尚不支持在其他 build 文件中查找版本目录变量的用例。也就是说,在版本目录中对变量定义使用 Ctrl+点击(在 macOS 上,则使用 Command+点击)不会跳转到使用该变量的 build 文件。

  • Android Studio 中的“Project Structure”对话框会显示位于根 gradle 文件夹中的多个目录文件,但不显示复合 build 的目录。例如,如果您有两个目录文件(一个用于应用,另一个用于复合 build),“Project Structure”对话框将仅显示应用目录文件。您可以使用复合 build,但必须直接修改其 TOML 文件。

其他 SDK 数据分析:政策问题

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

Android Studio compileSdk 版本支持

如果您的项目使用了当前版本的 Android Studio 不支持的 compileSdk,Android Studio 会显示警告。它还会建议您改用支持项目所用 compileSdk 的 Android Studio 版本(如果有)。请注意,升级 Android Studio 可能还需要升级 AGP。如果当前版本的 AGP 不支持项目使用的 compileSdk,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 插件
PackageForUnitTest 任务的构建缓存是多余的
[AGP 8.1.0] 如果 splits.abi.isEnable 和 testOptions.unitTests.isIncludeAndroidResources 均为 True,./gradlew 测试会失败,并且显示“Unable to find manifest output”
使用嵌套 Gradle 复合 build 时,AGP 模型构建失败
资源缩减器会破坏资源 ID,从而导致运行时崩溃
最低 Gradle 版本检查不会在第二次构建及之后运行
将 AGP 从 8.0.2 更新到 8.1.0 后,任务“:app:mergeReleaseClasses”执行失败
[Gradle 8.4][升级] 由于使用 kotlin gradle 插件中已废弃的功能,升级后集成测试失败
在配置阶段不检查清单叠加层文件是否存在
出现 MergeJavaResWorkAction 错误时,指向 Gradle 文档的链接损坏
Gradle 8.1 会因 .gradle/.android/analytics.settings 而破坏配置缓存
如果缺少 ProjectComponentIdentifier.build,AGP 不应使用 ProjectComponentIdentifier.projectPath
请减少/移除 AGP“Analytics other plugin to proto: …”的信息级日志记录
[Gradle 8.4][升级] 在 ProcessJavaResTask 配置期间执行文件操作会破坏配置缓存
使用 Variant API 获取符号表 (R.txt)
lint 独立插件无法正确处理 handle gradleApi() 依赖项
关于 AGP 类/属性的 kDoc 有待改进。“VariantOutput.enable”建议应将其替换为“VariantOutput.enable”
AGP 8.3.0-alpha02 无法在 Windows 主机上安装版本配置文件
强制执行“android.enableDexingArtifactTransform=true”
[Gradle 8.4][升级] 由于配置阶段中的文件处理问题,升级后集成测试失败
AGP 8.3.0-alpha-02 - “Error: Failed to deserialize cached resource repository.”(错误:无法将缓存的资源仓库反序列化。)
[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 的响应式 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 回归:“Run”按钮会延迟几秒钟(正在制定规范)
AGP 8.3.0-alpha11 会生成发布 APK,该 APK 会在启动时崩溃,并报出 android.content.res.Resources$NotFoundException
将“android.lint.printStackTrace”AGP 属性升级为稳定版
功能请求:将 com.android.build.api.extension.impl.CURRENT_AGP_VERSION 提升为公共 API
SDK 管理器应停止将垃圾日志信息发送到 stdout
使用仅包含资源的库模块时,DexArchiveBuilderTaskDelegate 会失败
所有抛出重复条目的 AGP7.4 自定义插件变体 toTransform:META-INF/MANIFEST.MF 异常
支持新的清单标记
Studio 设置中的“分离项目”链接会转到错误的位置。
请提供选项,以便在 Javadoc 和 SourceJar 上包含生成的源代码
需要快速修复 compileSdk 和依赖项与 minCompileSdkVersion 之间的差异
[Gradle] tools:overrideLibrary 应支持星号 (*)
修改清单时界面冻结
无法在 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 库上失败,并提示属性“variantInputs.name”没有配置值。
TranslucentViewDetector 报告清单中有错误的行
使用项目依赖项时,lintDebug 误报 UseTomlInte 警告
Android Lint 标记的另一个项目中出现意外问题
lint 会勾选绑定和点击监听器内的“未使用的资源”假正例检测
无法加载自定义 lint 检查 jar 文件:节点无法投射为 TreeNode
在变量声明中使用带注解的类时,不会调用 lint visitAnnotationUsage
lint 31.0.2 失败并显示 java.util.NoSuchElementException: Array is empty。
lint 不会对 kotlin.text.MatchNamedGroupCollection#get(String) 要求 API 26 的问题发出警告
lint:TypographyQuotes 假负例:忽略多个转义撇号
AGP 8.0.2 lint InvalidId 检测器假正例
LintError 问题已添加到 lint 基准
Quickfix Lint 无法运行,会导致 IDE 错误
部分分析导致测试失败不一致
误报警告的突出显示无效
在变量声明中使用带注解的类时,不会调用 lint visitAnnotationUsage
未使用的资源处理器可能会删除 Gradle build 文件
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() 返回空
在 kotlin_dev 聊天机器人上,测试 SimpleKotlinEnumUnboxingTest 失败

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 依赖项进行解析