Android Gradle 插件 8.1.0 是一个主要版本,其中包含各种新功能和改进。
兼容性
|
最低版本 |
默认版本 |
备注 |
Gradle |
8.0 |
8.0 |
要了解更多信息,请参阅 更新 Gradle。 |
SDK 构建工具 |
33.0.1 |
33.0.1 |
安装 或 配置 SDK 构建工具。 |
NDK |
N/A |
25.1.8937393 |
安装 或 配置 不同版本的 NDK。 |
JDK |
17 |
17 |
要了解更多信息,请参阅 设置 JDK 版本。 |
Kotlin DSL 是构建配置的默认值
新项目现在默认使用 Kotlin DSL (build.gradle.kts
) 进行构建配置。与 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 会添加此默认语言环境以及您使用 values-*
目录在 res
文件夹中指定的任何 备用语言环境,到自动生成的 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 升级助手(工具 > AGP 升级助手)。
要使用未压缩的原生库,请从清单中删除android::extractNativeLibs
属性,并将以下代码添加到模块级build.gradle.kts
文件(如果使用 Groovy,则为build.gradle
文件)
Kotlin
android {
packagingOptions {
jniLibs {
useLegacyPackaging = false
}
}
}
Groovy
android {
packagingOptions {
jniLibs {
useLegacyPackaging false
}
}
}
实验性构建标志
这些是 AGP 8.1 中可用的用于配置构建的实验性标志。
标志 |
添加于 |
默认值 |
备注 |
android.experimental.useDefaultDebugSigningConfigForProfileableBuildtypes |
AGP 8.0 |
false |
启用此标志且未指定签名配置时,AGP 会在运行可分析或可调试构建时使用默认调试签名配置。默认情况下禁用此标志,以鼓励构建作者声明具体的分析签名配置。 |
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 使用测试变体的清单占位符失败
|
namespace 属性可能属于 HasAndroidResources
|
无法禁用“自上次项目同步以来 Gradle 文件已更改”消息
|
不存在更新版本时显示“建议使用更新的 Android Gradle 插件”
|
processDebugUnitTestManifest 使用测试变体的清单占位符失败
|
用于在 CheckAarMetadataTask 中禁用编译 SDK 检查的布尔标志
|
构建错误引用了不存在的 API 级别 34
|
设置 JVM 工具链不会影响 JavaCompile targetCompatibility 值
|
具有通配符域的 Navigation deepLink 条目在合并的清单中没有 `android:host` 属性
|
自 Android Gradle 插件 8.1 以来,processDebugMainManifest 任务失败
|
可以删除 AnalyticsRecordingTask 吗?
|
output-metadata.json 的内容不一致
|
可以删除 AnalyticsRecordingTask 吗?
|
output-metadata.json 的内容不一致
|
设置 JVM 工具链不会影响 JavaCompile targetCompatibility 值
|
具有通配符域的 Navigation deepLink 条目在合并的清单中没有 `android:host` 属性
|
自 Android Gradle 插件 8.1 以来,processDebugMainManifest 任务失败
|
Android Studio 不尊重 STUDIO_GRADLE_JDK 环境变量
|
自定义源类型应创建多风味 sourceset
|
DependenciesInfoBuilder 需要 API 更新 + 文档
|
使用 Java 11 目标的 DexingNoClasspathTransform (minSdk >= 24) 由于缺少嵌套成员而失败
|
Groovy 中未按描述工作 DslExtension.Builder.extendProjectWith()
|
添加不使用 kotlin.Pair 的 VariantSelector.withFlavor API
|
AndroidLintAnalysisTask ( :lintAnalyzeExternalRelease) 由于 `proguard.txt` 已更改而出现缓存未命中
|
应用合并清单包含来自依赖项的 extractNativeLibs 和 useEmbeddedDex 属性
|
AGP:将 AIDL 工具和框架 AIDL 文件的路径公开为公共 API
|
请求:让 IDE 为“PermittedSubclasses 需要 ASM9”提供修复
|
错误:“启用 KSP 并为此依赖项使用 KSP 处理器”只会跳转到网站
|
Gradle 8.1 由于 .gradle/.android/analytics.settings 而破坏了配置缓存
|
agp 8.1.0 中 generateLocaleConfig 使用非确定性排序,破坏了可重复构建
|
|
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 不会显示警告
|
错误:关于“'BC' 提供程序已弃用,从 Android P 开始...”的误报警告
|
将 Kotlin 升级到 1.8.0 后,Lint 关于 remember 的误报
|
对在具有枚举参数的方法内执行的 SDK_INT 检查的 Lint 误报警告
|
TypographyQuotes lint 检查不适用于转义引号
|
TrustAllX509TrustManager lint 检查错误地标记扩展 X509TrustManager 的接口
|
仅重新格式化替换修复的插入代码
|
Lint:意图预览为 ReplaceStringQuickFix 抛出异常
|
|
Shrinker (R8) |
VerifyError:使用 R8 和 Kotlin 1.8.20 时,验证器拒绝类
|
AGP 8 上的 R8 破坏了 Google Fit 服务
|
包含与输入名称重叠的残余名称的源文件信息表示不正确
|
R8 在使用 Compose 构建时出现 ArrayIndexOutOfBoundsException 错误
|
简单的 StringBuilder 相关代码在发布或 debuggable=false 模式下错过了对 append 的尾调用
|
VirtualDispatchMethodArgumentPropagator.shouldActivateMethodStateGuardedByBounds() 方法中的极端情况
|
dex-startup-optimization 导致 java.lang.VerifyError: Rejecting class
|
在 Android 12+ 上出现验证错误导致崩溃
|
|
Android Gradle 插件 8.1.1
已修复的问题 |
Dexer (D8) |
Java 16 记录:equals(null) 抛出 NullPointerException
|
|
Shrinker (R8) |
java.lang.VerifyError: Verifier rejected class
|
使用 Apache POI 库时,构建停留在 :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 test 失败并显示“找不到清单输出”
|
|
Shrinker (R8) |
如果去除空检查,Kotlin 1.9 会导致 R8 销毁 Kotlin lambda 表达式
|
R8 针对 play-services-measurement-21.3.0-runtime.jar 失败并显示“编译期间遇到未定义值”
|
|
Android Gradle 插件 8.1.3
已修复的问题 |
Android Gradle 插件 |
[AGP 8.1.0] 如果 splits.abi.isEnable 和 testOptions.unitTests.isIncludeAndroidResources 都为 true,则 ./gradlew test 失败并显示“找不到清单输出”
|
更新到 AGP 8.1 后构建失败
|
|
Android Gradle 插件 8.1.4
已修复的问题 |
Android Gradle 插件 |
当子项目的类已通过工件转换进行 dex 处理时,不要在子项目的类上运行 dexing 任务
|
|