Android Gradle Plugin 8.1.0(2023 年 7 月)
使用合集保持井井有条 根据您的偏好保存和分类内容。
Android Gradle plugin 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 现在是默认的构建配置方式
新项目现在默认使用 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 plugin 会根据您的项目资源生成 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
}
}
}
实验性构建标志
这些是 AGP 8.1 中可用于配置构建的实验性标志。
标志 |
添加版本 |
默认值 |
备注 |
android.experimental.useDefaultDebugSigningConfigForProfileableBuildtypes |
AGP 8.0 |
false |
如果在未指定签名配置的情况下启用此项,AGP 会在运行可分析或可调试的构建时使用默认调试签名配置。此标志默认处于停用状态,以鼓励构建作者声明特定的分析签名配置。 |
android.experimental.library.desugarAndroidTest |
AGP 8.0 |
false |
此标志允许库构建器为测试 APK 启用核心库 desugaring,而不会影响生成的 AAR,例如通过 lint。我们计划最终在 Variant API 中支持此行为。 |
android.experimental.testOptions.managedDevices.customDevice |
AGP 8.0 |
false |
如果启用此标志,Gradle Managed Devices 将允许使用插件提供的用户自定义设备类型。如果要使用 Firebase Test Lab 插件,必须启用此标志。 |
android.lint.printStackTrace |
AGP 8.0 |
false |
如果启用此标志,Android lint 在崩溃时会打印堆栈跟踪。此标志与 LINT_PRINT_STACKTRACE 环境变量具有相同的功能。 |
android.experimental.testOptions.managedDevices.maxConcurrentDevices |
AGP 8.0 |
无 |
指定任何时间点最多可同时处于活动状态的 Gradle Managed Devices (AVD) 的数量。如果值为 0 或负数,则设备数量没有上限。 |
android.experimental.testOptions.installApkTimeout |
AGP 8.0 |
无 |
安装 APK 的超时时长(以秒为单位)。如果值为 0 或负数,UTP 会将其设置为默认值。 |
已解决的问题
Android Gradle plugin 8.1.0
已解决的问题 |
Android Gradle Plugin |
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 level 34
|
设置 JVM toolchain 不影响 JavaCompile targetCompatibility 的值
|
带有通配符域的 Navigation deepLink 条目在合并清单中没有 android:host 属性
|
自 Android Gradle Plugin 8.1 起,processDebugMainManifest 任务失败
|
我们可以移除 AnalyticsRecordingTask 吗?
|
output-metadata.json 的内容不一致
|
我们可以移除 AnalyticsRecordingTask 吗?
|
output-metadata.json 的内容不一致
|
设置 JVM toolchain 不影响 JavaCompile targetCompatibility 的值
|
带有通配符域的 Navigation deepLink 条目在合并清单中没有 android:host 属性
|
自 Android Gradle Plugin 8.1 起,processDebugMainManifest 任务失败
|
Android Studio 不遵循 STUDIO_GRADLE_JDK 环境变量
|
自定义源类型应创建多变体 sourcesets
|
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”提供修复方案
|
错误:“启用 KSP 并改用此依赖项的 KSP 处理器”仅跳转到网站
|
由于 .gradle/.android/analytics.settings,Gradle 8.1 破坏了配置缓存
|
agp 8.1.0 中的 generateLocaleConfig 使用非确定性排序,破坏了可重现构建
|
|
Dexer (D8) |
最近更新后核心库 desugaring 导致应用崩溃。
|
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) 未 desugar,但在 try-with-resources 中使用时 AS 不显示警告
|
错误:关于“'BC' provider 已废弃,并且自 Android P 起...”的误报警告
|
将 Kotlin 升级到 1.8.0 后,Lint 对 remember 产生误报
|
对带有枚举参数的方法中执行的 SDK_INT 检查产生 Lint 误报警告
|
TypographyQuotes lint 检查对转义引号不起作用
|
TrustAllX509TrustManager lint 检查错误地将扩展 X509TrustManager 的接口标记为问题
|
仅格式化替换修复中插入的代码
|
Lint: intention preview 对 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 plugin 8.1.1
已解决的问题 |
Dexer (D8) |
Java 16 Records:equals(null) 抛出 NullPointerException
|
|
Shrinker (R8) |
java.lang.VerifyError: Verifier rejected class
|
使用 Apache POI 库时,构建卡在 :minifyReleaseWithR8 任务
|
启用 r8 优化时拒绝调用
|
java.lang.reflect.Executable 的 NoClassDefFoundError
|
|
Android Gradle plugin 8.1.2
已解决的问题 |
Android Gradle Plugin |
androidResources 在 Android 库模块中不可用
|
[AGP 8.1.0] 如果 splits.abi.isEnable 和 testOptions.unitTests.isIncludeAndroidResources 都为 true,则 ./gradlew test 会失败并提示“Unable to find manifest output”
|
|
Shrinker (R8) |
如果移除了空检查,Kotlin 1.9 会导致 Kotlin lambda 被 R8 破坏
|
R8 在编译 play-services-measurement-21.3.0-runtime.jar 时失败,并提示“Undefined value encountered during compilation”
|
|
Android Gradle plugin 8.1.3
已解决的问题 |
Android Gradle Plugin |
[AGP 8.1.0] 如果 splits.abi.isEnable 和 testOptions.unitTests.isIncludeAndroidResources 都为 true,则 ./gradlew test 会失败并提示“Unable to find manifest output”
|
更新到 AGP 8.1 后构建失败
|
|
Android Gradle plugin 8.1.4
已解决的问题 |
Android Gradle Plugin |
当子项目的类已通过 artifact transform 进行 dexing 时,不要在其上运行 dexing 任务
|
|
本页面上的内容和代码示例遵循内容许可中描述的许可。Java 和 OpenJDK 是 Oracle 和/或其关联公司的商标或注册商标。
最后更新时间:世界协调时间 (UTC) 2025-06-13。
[[["易于理解","easyToUnderstand","thumb-up"],["解决了我的问题","solvedMyProblem","thumb-up"],["其他","otherUp","thumb-up"]],[["缺少所需信息","missingTheInformationINeed","thumb-down"],["太复杂 / 步骤太多","tooComplicatedTooManySteps","thumb-down"],["已过时","outOfDate","thumb-down"],["示例 / 代码问题","samplesCodeIssue","thumb-down"],["其他","otherDown","thumb-down"]],["最后更新时间:世界协调时间 (UTC) 2025-06-13。"],[],[]]