Android Gradle 插件 8.1.0 是一个主要版本,包含各种新功能和改进。
兼容性
|
最低版本 |
默认版本 |
备注 |
Gradle |
8.0 |
8.0 |
如需了解详情,请参阅更新 Gradle。 |
SDK Build Tools |
33.0.1 |
33.0.1 |
安装或配置 SDK Build Tools。 |
NDK |
不适用 |
25.1.8937393 |
安装或配置其他版本的 NDK。 |
JDK |
17 |
17 |
如需了解详情,请参阅设置 JDK 版本。 |
Kotlin DSL 是 build 配置的默认语言
新项目现在默认使用 Kotlin DSL (build.gradle.kts
) 进行 build 配置。与 Groovy DSL (build.gradle
) 相比,这提供了更好的编辑体验,包括语法突出显示、代码补全和导航到声明。请注意,如果您使用 AGP 8.1 和 Kotlin DSL 进行构建配置,则应使用 Gradle 8.1 以获得最佳体验。如需了解详情,请参阅 Kotlin DSL 迁移指南。
各应用自动设定语言支持
从 Android Studio Giraffe Canary 7 和 AGP 8.1.0-alpha07 开始,您可以将应用配置为自动支持各应用语言偏好设定。Android Gradle 插件会根据您的项目资源生成 LocaleConfig
文件,并在最终清单文件中添加对该文件的引用,这样您就不再需要手动操作。AGP 使用应用模块的 res
文件夹中的资源以及任何库模块依赖项来确定要在 LocaleConfig
文件中添加的语言区域。
请注意,各应用自动语言功能支持搭载 Android 13(API 级别 33)或更高版本的应用。如需使用此功能,您必须将 compileSdkVersion
设为 33 或更高版本。如需为之前版本的 Android 配置各应用语言偏好设定,您仍然需要使用 API 和应用内语言选择器。
如需启用各应用自动设定语言支持,请指定默认语言区域:
- 在应用模块的
res
文件夹中,创建一个名为 resources.properties
的新文件。
在 resources.properties
文件中,使用 unqualifiedResLocale
标签设置默认语言区域。将语言代码与可选的脚本代码和区域代码(使用短划线将各部分隔开)组合在一起即可构成语言区域名称:
例如,如果您的默认语言区域是美式英语:
unqualifiedResLocale=en-US
AGP 会将此默认语言区域和您指定的所有其他语言区域(使用 res
文件夹中的 values-*
目录)添加到自动生成的 LocaleConfig
文件中。
各应用自动设定语言支持功能默认处于关闭状态。如需启用此功能,请使用模块级 build.gradle.kts
文件(如果您使用的是 Groovy,则为 build.gradle
文件)的 androidResources {}
块中的 generateLocaleConfig
设置:
Kotlin
android {
androidResources {
generateLocaleConfig = true
}
}
Groovy
android {
androidResources {
generateLocaleConfig true
}
}
Android lint 包含以 JVM 17 为目标平台的字节码
从 AGP 8.1.0-alpha04 开始,Android Lint 包含以 JVM 17 为目标平台的字节码。如果您编写自定义 lint 检查,则需要使用 JDK 17 或更高版本进行编译,并在 Kotlin 编译器选项中指定 jvmTarget = '17'
。
如需详细了解 lint 工具,请参阅使用 lint 检查改进您的代码。
原生库压缩设置已移至 DSL
从 AGP 8.1.0-alpha10 开始,如果您未使用 DSL(而非清单)配置原生库压缩,则会收到警告。以下指南介绍了如何更新配置以使用 DSL。如需获取进行这些更新方面的帮助,请使用 AGP 升级助理 (Tools > AGP Upgrade Assistant)。
如需使用未压缩的原生库,请从清单中移除 android::extractNativeLibs
属性,并将以下代码添加到模块级 build.gradle.kts
文件(如果您使用的是 Groovy,则为 build.gradle
文件):
Kotlin
android {
packagingOptions {
jniLibs {
useLegacyPackaging = false
}
}
}
Groovy
android {
packagingOptions {
jniLibs {
useLegacyPackaging false
}
}
}
实验性 build 标志
这些是用于配置 AGP 8.1 中提供的 build 的实验性标志。
标志 |
添加时间 |
默认值 |
备注 |
android.experimental.useDefaultDebugSigningConfigForProfileableBuildtypes |
AGP 8.0 |
false |
如果启用此功能但未指定签名配置,则 AGP 会在运行可分析或可调试的 build 时使用默认的调试签名配置。此标志默认处于停用状态,以鼓励 build 作者声明特定的性能分析签名配置。 |
android.experimental.library.desugarAndroidTest |
AGP 8.0 |
false |
借助此标志,库构建器可以为测试 APK 启用核心库脱糖,而不会影响生成的 AAR(例如通过 lint 检查)。我们计划最终在 Variant API 中支持此行为。
|
android.experimental.testOptions.managedDevices.customDevice |
AGP 8.0 |
false |
启用后,Gradle 管理的设备允许使用插件提供的用户定义的自定义设备类型。如果您想使用 Firebase Test Lab 插件,则必须启用此标志。 |
android.lint.printStackTrace |
AGP 8.0 |
false |
如果启用,Android lint 会在崩溃时输出堆栈轨迹。此标志的功能与 LINT_PRINT_STACKTRACE 环境变量相同。 |
android.experimental.testOptions.managedDevices.maxConcurrentDevices |
AGP 8.0 |
无 |
指定任意时间点处于活动状态的 Gradle 受管设备 (AVD) 的并发数量上限。如果值为 0 或负数,则没有设备数量上限。 |
android.experimental.testOptions.installApkTimeout |
AGP 8.0 |
无 |
安装 APK 的超时时长(以秒为单位)。如果该值为 0 或负数,UTP 会将其设置为默认值。 |
修复的问题
Android Gradle 插件 8.1.0
已修复的问题 |
Android Gradle 插件 |
配置缓存的“com.android.build.gradle.tasks.ShaderCompile”问题
|
使用 AGP API 添加到 Java 资源会破坏配置缓存
|
[Android Studio:Flamingo | 2022.2.1 Canary 8] liblog.so 打包在 APK 内
|
KGP 在配置期间读取清单,在清单发生更改时使配置缓存失效
|
合并后的清单中存在问题时,构建警告消息不明确
|
升级到 AGP 7.4 会导致 StackOverflowError
|
直接依赖于 Kotlin 库子项目的动态功能中的 ClassNotFoundException
|
测试变体中的清单占位符导致 processDebugUnitTestManifest 失败
|
测试变体中的清单占位符导致 processDebugUnitTestManifest 失败
|
命名空间属性可能属于 HasAndroidResources
|
无法停用“Gradle files have changed since last project sync”消息
|
没有更高版本的插件时显示“We recommend using a newer Android Gradle plugin”
|
测试变体中的清单占位符导致 processDebugUnitTestManifest 失败
|
用于在 CheckAarMetadataTask 中停用编译 SDK 检查的布尔标志
|
构建错误涉及不存在的 API 级别 34
|
设置 JVM 工具链不会影响 JavaCompile targetCompatibility 值
|
包含通配符网域的导航深层链接条目在合并后的清单中没有“android:host”属性
|
自 Android Gradle 插件 8.1 开始,processDebugMainManifest 任务会失败
|
我们能否移除 AnalyticsRecordingTask?
|
output-metadata.json 的内容不一致
|
我们能否移除 AnalyticsRecordingTask?
|
output-metadata.json 的内容不一致
|
设置 JVM 工具链不会影响 JavaCompile targetCompatibility 值
|
包含通配符网域的导航深层链接条目在合并后的清单中没有“android:host”属性
|
自 Android Gradle 插件 8.1 开始,processDebugMainManifest 任务会失败
|
Android Studio 不遵循 STUDIO_GRADLE_JDK 环境变量
|
自定义源代码类型应创建多变种源代码集
|
DependenciesInfoBuilder 需要 API 更新 + 文档
|
由于缺少嵌套成员,带 Java 11 目标的 DexingNoClasspathTransform (minSdk >= 24) 执行失败
|
DslExtension.Builder.extendProjectWith() 在 Groovy 中无法像所描述的那样运行
|
添加不使用 kotlin.Pair 的 VariantSelector.withFlavor API
|
AndroidLintAnalysisTask ( :lintAnalyzeExternalRelease) 缓存未命中,原因是“proguard.txt”已发生更改
|
应用合并后的清单包含依赖项中的 extractNativeLibs 属性和 useEmbeddedDex 属性
|
AGP:将 AIDL 工具和框架 AIDL 文件的路径显示为公共 API
|
请求:让 IDE 修复“PermittedSubclasses requires ASM9”
|
bug:按照“启用 KSP 并改为针对此依赖项使用 KSP 处理器”后,只会前往某个网站
|
Gradle 8.1 会因 .gradle/.android/analytics.settings 而破坏配置缓存
|
agp 8.1.0 中的 generateLocaleConfig 使用非确定性排序,破坏了可重现的 build
|
|
Dexer (D8) |
核心库在近期更新后使崩溃应用脱糖。
|
agp 8.1.0 在与 API 21 结合使用时发生回归 - F/dex2oat ( 4176): art/compiler/driver/compiler_driver.cc:1181] Check failed: !method->IsAbstract()
|
|
lint |
lint 仅会针对直接实现的接口(而非继承的接口)检查安全类型转换
|
lint 不会检查调用接收器的有效类型转换
|
TypedArray#close (API 31) 未进行脱糖,但在 try-with-resources 中使用时,AS 不显示警告
|
bug:“‘BC’提供程序已废弃,自 Android P 起…”误报警告
|
在升级到 Kotlin 1.8.0 后,关于 remember 的 lint 检查出现误报
|
在包含枚举参数的方法内执行的 SDK_INT 检查出现误报 lint 警告
|
TypographyQuotes lint 检查对转义引号不起作用
|
TrustAllX509TrustManager lint 检查会错误地标记扩展 X509TrustManager 的接口
|
仅重新设置替换修复程序的插入代码的格式
|
lint:意图预览会针对 replaceStringQuickFix 抛出异常
|
|
缩减器 (R8) |
VerifyError:将 R8 与 Kotlin 1.8.20 结合使用时,验证程序会拒绝类
|
AGP 8 上的 R8 会破坏 Google 健身服务
|
如果包含的源文件信息存在与输入名称重叠的残留名称,则无法正确显示
|
R8 在 Compose 构建期间失败并抛出 ArrayIndexOutOfBoundsException
|
简单的 StringBuilder 相关代码在 release 或 debuggable=false 模式中缺少对 append 的尾调用
|
VirtualDispatchMethodArgumentPropagator.shouldActivateMethodStateGuardedByBounds() 方法中存在极端情况
|
dex-startup-optimization 导致 java.lang.VerifyError:拒绝类
|
Android 12 及更高版本上发生崩溃并出现验证错误
|
|
Android Gradle 插件 8.1.1
已修复的问题 |
Dexer (D8) |
Java 16 记录:equals(null) 会抛出 NullPointerException
|
|
缩减器 (R8) |
java.lang.VerifyError: Verifier rejected class
|
使用 Apache POI 库时,Build 会在 :minifyReleaseWithR8 上卡住
|
启用 r8 优化时拒绝调用
|
java.lang.reflect.Executable 的 NoClassDefFoundError
|
|
Android Gradle 插件 8.1.2
已修复的问题 |
Android Gradle 插件 |
Android 库模块中不提供 androidResources
|
[AGP 8.1.0] 如果 splits.abi.isEnable 和 testOptions.unitTests.isIncludeAndroidResources 均为 True,则 ./gradlew 测试会失败,并且会显示消息“Unable to find manifest output”
|
|
缩减器 (R8) |
如果去除 null 检查,Kotlin 1.9 会导致 R8 销毁 Kotlin lambda
|
针对 play-services-measurement-21.3.0-runtime.jar,R8 失败并显示“编译期间遇到未定义值”
|
|
Android Gradle 插件 8.1.3
已修复的问题 |
Android Gradle 插件 |
[AGP 8.1.0] 如果 splits.abi.isEnable 和 testOptions.unitTests.isIncludeAndroidResources 均为 True,则 ./gradlew 测试会失败,并且会显示消息“Unable to find manifest output”
|
更新到 AGP 8.1 后 build 失败
|
|
Android Gradle 插件 8.1.4
已修复的问题 |
Android Gradle 插件 |
如果子项目的类已通过工件转换进行 dex 处理,不对这些类运行 dexing 任务
|
|