本页面包含 Android Gradle 插件 (AGP) 预览版的版本说明。
Android Gradle 插件 9.0
Android Gradle 插件 9.0 是 AGP 的一个全新主要版本,带来了 API 和行为变更。
如需更新到 Android Gradle 插件 9.0.0-alpha11,请使用 Android Studio Otter 2 Feature Drop | 2025.2.2 中的 Android Gradle 插件升级助理。
AGP 升级助理有助于在升级项目时尽可能保留现有行为,即使您尚未准备好采用 AGP 9.0 中的所有新默认设置,也可以升级项目以使用 AGP 9.0。
兼容性
Android Gradle 插件 9.0.0-alpha11 支持的最高 Android API 级别为 API 级别 36。
Android Gradle 插件 9.0.0-alpha11 需要 Gradle 9.0.0。
| 最低版本 | 默认版本 | 备注 | |
|---|---|---|---|
| Gradle | 9.0.0 | 9.0.0 | 如需了解详情,请参阅更新 Gradle。 |
| SDK Build Tools | 36.0.0 | 36.0.0 | 安装或配置 SDK Build Tools。 |
| NDK | 不适用 | 28.2.13676358 | 安装或配置其他版本的 NDK。 |
| JDK | 17 | 17 | 如需了解详情,请参阅设置 JDK 版本。 |
android DSL 类现在仅实现新的公共接口
在过去几年中,我们为 DSL 和 API 引入了新接口,以便更好地控制哪些 API 是公开的。AGP 版本 7.x 和 8.x 仍使用旧的 DSL 类型(例如 BaseExtension),这些类型也实现了新的公共接口,以便在接口开发过程中保持兼容性。
AGP 9.0 专门使用新的 DSL 接口,并且实现已更改为完全隐藏的新类型。此更改还会移除对已废弃的旧版变体 API 的访问权限。
如需更新到 AGP 9.0,您可能需要执行以下操作:
- 确保您的项目与内置 Kotlin 兼容:
org.jetbrains.kotlin.android插件与新的 DSL 不兼容。 将 KMP 项目切换到 Android Gradle Library Plugin for KMP:在与
com.android.library和com.android.application插件相同的 Gradle 子项目中同时使用org.jetbrains.kotlin.multiplatform插件与新的 DSL 不兼容。更新 build 文件:虽然接口的更改旨在尽可能保持 DSL 的相似性,但可能存在一些细微的更改。
更新自定义 build 逻辑以引用新的 DSL 和 API: 将对内部 DSL 的所有引用替换为公共 DSL 接口。 在大多数情况下,这会是一对一的替换。 将所有使用
applicationVariants和类似 API 的情况替换为新的androidComponentsAPI。这可能更复杂,因为androidComponentsAPI 的设计旨在提高稳定性,以便插件能够更长时间保持兼容。如需查看示例,请参阅我们的 Gradle 诀窍。更新第三方插件:某些第三方插件可能仍依赖于不再公开的接口或 API。迁移到与 AGP 9.0 兼容的插件版本。
切换到新的 DSL 接口可防止插件和 Gradle build 脚本使用各种已弃用的 API,包括:
android 块中的已弃用 API |
功能 | 替换 |
|---|---|---|
applicationVariants、libraryVariants、testVariants 和unitTestVariants
|
插件的扩展点,用于向 AGP 添加新功能。 |
将其替换为 androidComponents.onVariants API,例如:
androidComponents { onVariants() { variant -> variant.signingConfig .enableV1Signing.set(false) } } |
variantFilter
|
允许停用所选变体。 |
请将此替换为 androidComponents.beforeVariants API,例如:
androidComponents { beforeVariants( selector() .withBuildType("debug") .withFlavor("color", "blue") ) { variantBuilder -> variantBuilder.enable = false } } |
deviceProvider 和testServer
|
注册自定义测试环境,以便针对 Android 设备和模拟器运行测试。 | 切换到 Gradle 管理的设备。 |
sdkDirectory、ndkDirectory、bootClasspath、adbExecutable和adbExe
|
使用 Android SDK 的各种组件执行自定义任务。 |
切换到 androidComponents.sdkComponents。
|
registerArtifactType、registerBuildTypeSourceProvider、registerProductFlavorSourceProvider、registerJavaArtifact、registerMultiFlavorSourceProvider和wrapJavaSourceSet |
过时的功能主要与 Android Studio 中生成的源代码的处理有关,这些功能在 AGP 7.2.0 中已停止运行。 | 这些 API 没有直接替代方案。 |
如果您更新到 AGP 9.0 后看到以下错误消息,则表示您的项目仍在引用一些旧类型:
java.lang.ClassCastException: class com.android.build.gradle.internal.dsl.ApplicationExtensionImpl$AgpDecorated_Decorated
cannot be cast to class com.android.build.gradle.BaseExtension
如果您因不兼容的第三方插件而受阻,可以选择停用并恢复 DSL 的旧实现以及旧的变体 API。在此过程中,新接口也可用,您仍然可以将自己的 build 逻辑更新为新 API。如要选择停用,请在 gradle.properties 文件中添加以下行:
android.newDsl=false
您也可以先升级到新 API,然后再升级到 AGP 9.0。新接口已存在于多个 AGP 版本中,因此您可以同时使用新接口和旧接口。AGP API 参考文档显示了每个 AGP 版本的 API 表面,以及每个类、方法和字段的添加时间。
在 9.0 Alpha 阶段,我们会与插件作者联系,帮助他们调整并发布与新模式完全兼容的插件,并增强 Android Studio 中的 AGP 升级助理,以指导您完成迁移。
如果您发现新的 DSL 或 Variant API 缺少某些功能,请尽快提交问题。
内置 Kotlin
Android Gradle 插件 9.0 引入了内置 Kotlin 支持,并默认启用该支持。这意味着,您无需再在 build 文件中应用 org.jetbrains.kotlin.android(或 kotlin-android)插件来编译 Kotlin 源文件。这简化了 Kotlin 与 AGP 的集成,避免了使用已弃用的 API,并在某些情况下提高了性能。
因此,当您将项目升级到 AGP 9.0 时,还需要迁移到内置 Kotlin 或选择停用。
对 Kotlin Gradle 插件 2.2.10 的运行时依赖项
Android Gradle 插件 9.0 在运行时依赖于 Kotlin Gradle 插件 (KGP) 2.2.10,这是内置 Kotlin 支持所需的最低版本。
这意味着,如果您选择停用内置 Kotlin 并使用低于 2.2.10 的 KGP 版本,Gradle 会自动将 KGP 版本升级到 2.2.10。
同样,如果您使用的 KSP 版本低于 2.2.10-2.0.2,AGP 会将 KSP 版本升级到 2.2.10-2.0.2,以与 KGP 版本保持一致。
因此,如果您选择停用内置 Kotlin,并想使用旧版 KGP 或 KSP,则需要在顶级 build 文件中添加以下内容:
buildscript {
dependencies {
classpath("org.jetbrains.kotlin:kotlin-gradle-plugin") {
version { strictly("KGP_VERSION") }
}
classpath("com.google.devtoolsksp:symbol-processing-gradle-plugin") {
version { strictly("KSP_VERSION") }
}
}
}
IDE 对测试固件的支持
AGP 9.0 为测试装置带来了全面的 Android Studio IDE 支持。如需获得此支持,请使用 AGP 9.0.0-alpha07 或更高版本。
行为变更
Android Gradle 插件 9.0 具有以下新行为:
| 行为 | 建议 |
|---|---|
Android Gradle 插件 9.0 默认使用 NDK 版本 r28c。
|
请考虑明确指定要使用的 NDK 版本。 |
| Android Gradle 插件 9.0 默认要求库的消费者使用相同或更高的编译 SDK 版本。 |
使用库时,请使用相同或更高的编译 SDK。
如果无法实现,或者您想为所发布库的消费者提供更多时间来切换,请明确设置 AarMetadata.minCompileSdk。
|
AGP 9.0 包含对以下 Gradle 属性默认值的更新。 这样一来,您就可以选择在升级时保留 AGP 8.13 的行为:
| 属性 | 功能 | 从 AGP 8.13 更改为 AGP 9.0 | 建议 |
|---|---|---|---|
android.newDsl |
使用新的 DSL 接口,而不公开 android 代码块的旧版实现。这也意味着,旧版变体 API(例如 android.applicationVariants)将无法再访问。
|
false → true |
您可以通过设置 android.newDsl=false 来选择停用。当项目使用的所有插件和 build 逻辑都兼容时,移除选择停用。 |
android.builtInKotlin |
启用内置 Kotlin | false → true |
迁移到内置 Kotlin(如果可以)或选择停用。 |
android.uniquePackageNames |
强制要求每个库都有不同的软件包名称。 | false → true |
为项目中的所有库指定唯一的软件包名称。 如果无法实现,您可以在迁移时停用此标志。 |
android.dependency.useConstraints |
控制配置之间依赖项约束的使用。 AGP 9.0 中的默认值为 false,该值仅在应用设备测试 (AndroidTest) 中使用限制。
将此值设置为 true 将恢复为 8.13 版的行为。
|
true → false |
除非需要,否则不要在所有地方都使用依赖项限制。 接受此标志的新默认值还可以在项目导入过程中启用优化,从而缩短包含多个 Android 库子项目的 build 的导入时间。 |
aandroid.enableAppCompileTimeRClass |
针对非最终 R 类编译应用中的代码,使应用编译与库编译保持一致。 这有助于提高增量性,并为将来对资源处理流程进行性能优化奠定基础。 |
false → true |
许多项目只需采用新行为,无需更改源代码。 如果 R 类字段用于需要常量的位置(例如 switch 语句),请重构为使用链式 if 语句。 |
android.sdk.defaultTargetSdkToCompileSdkIfUnset |
使用编译 SDK 版本作为应用和测试中目标 SDK 版本的默认值。 在此变更之前,目标 SDK 版本会默认设置为最低 SDK 版本。 |
false → true |
为应用和测试显式指定目标 SDK 版本。 |
android.onlyEnableUnitTestForTheTestedBuildType |
仅为测试的 build 类型创建单元测试组件。 在默认项目中,这会生成一个用于调试的单元测试,而之前的行为是运行用于调试或发布的单元测试。 |
false → true |
如果您的项目不需要同时针对调试和发布运行测试,则无需进行任何更改。 |
android.proguard.failOnMissingFiles |
如果 AGP DSL 中指定的任何 keep 文件在磁盘上不存在,则构建会因错误而失败。在此变更之前,文件名中的拼写错误会导致文件被静默忽略。 | false → true |
移除所有无效的 ProGuard 文件声明 |
android.r8.optimizedResourceShrinking |
允许 R8 通过将类和 Android 资源一起考虑来保留更少的 Android 资源。 | false → true |
如果项目的保留规则已完善,则无需进行任何更改。 |
android.r8.strictFullModeForKeepRules |
允许 R8 通过在保留类时不会隐式保留默认构造函数来减少保留的内容。
也就是说,-keep class A 不再意味着 -keep class A { <init>(); } |
false → true |
如果项目的保留规则已完善,则无需进行任何更改。
在项目的保留规则中,将 -keep class A 替换为 -keep class A { <init>(); },以保留默认构造函数。
|
android.defaults.buildfeatures.resvalues |
在所有子项目中启用 resValues
|
true → false |
仅在需要 resValues 的子项目中启用该功能,方法是在这些项目的 Gradle build 文件中设置以下内容:
android {
buildFeatures {
resValues = true
}
} |
android.defaults.buildfeatures.shaders |
在所有子项目中启用着色器编译 | true → false |
仅在包含要编译的着色器的子项目中启用着色器编译,方法是在这些项目的 Gradle build 文件中设置以下内容:
android {
buildFeatures {
shaders = true
}
} |
android.r8.proguardAndroidTxt.disallowed |
在 AGP 9.0 中,getDefaultProguardFile() 将仅支持 proguard-android-optimize.txt,而不再支持 proguard-android.txt。这是为了防止意外使用 proguard-android.txt 中包含的 dontoptimize 标志。
|
false → true |
如果您想避免优化,除了使用 proguard-android-optimize.txt 之外,还可以在自定义 proguardFile 中明确指定 dontoptimize。请务必尽可能从此文件中移除 dontoptimize 标志,因为该标志会降低 R8 优化效果。如果不想参与,请通过设置 android.r8.globalOptionsInConsumerRules.disallowed=false 选择不参与。
|
android.r8.globalOptionsInConsumerRules.disallowed |
从 AGP 9.0 开始,如果消费者保留文件包含有问题的 Proguard 配置,Android 库和功能模块发布将会失败。包含 dontoptimize 或 dontobfuscate 等全局选项的消费者 keep 文件应仅在应用模块中使用,并且可能会降低库用户的优化效果。如果全局选项嵌入在预编译的依赖项(JAR 或 AAR)中,Android 应用模块编译会默默忽略所有此类全局选项。您可以通过检查 configuration.txt(通常位于 <app_module>/build/outputs/mapping/<build_variant>/configuration.txt 等路径中)中是否有如下注释来了解这种情况何时发生:# REMOVED CONSUMER RULE: dontoptimize
|
false → true |
已发布的库应移除所有不兼容的规则。内部库应将任何不兼容但必需的规则移至应用模块中的 proguardFile。设置 android.r8.globalOptionsInConsumerRules.disallowed=false 即可选择退出。当所有消费者保留文件都兼容后,移除选择退出。
|
已移除的功能
Android Gradle 插件 9.0 移除了以下功能:
- 嵌入式 Wear OS 应用支持
AGP 9.0 移除了对嵌入式 Wear OS 应用的支持,Play 中不再支持该功能。这包括移除wearApp配置和AndroidSourceSet.wearAppConfigurationNameDSL。如需了解如何将应用发布到 Wear OS,请参阅分发到 Wear OS 平台。 androidDependencies和sourceSets报告任务
更改了 DSL
Android Gradle 插件 9.0 包含以下重大 DSL 变更:
移除了
CommonExtension的形参化。就其本身而言,这只是一个源代码级重大变更,旨在帮助避免未来出现源代码级重大变更,但这也意味着,块方法需要从
CommonExtension移至ApplicationExtension、LibraryExension、DynamicFeatureExtension和TestExtension。将项目升级到 AGP 9.0 时,请重构使用这些参数或块方法的 Gradle 插件代码。例如,以下插件已更新,可移除类型形参,并且不再依赖于已移除的块方法:
AGP 8.13
val commonExtension: CommonExtension<*, *, *, *, *, *> = extensions.getByType(CommonExtension::class) commonExtension.apply { defaultConfig { minSdk { version = release(28) } } }AGP 9.0
val commonExtension: CommonExtension = extensions.getByType(CommonExtension::class) commonExtension.apply { defaultConfig.apply { minSdk { version = release(28) } } }对于以一系列 AGP 版本为目标的插件,直接使用 getter 在二进制方面与低于 9.0 的 AGP 版本兼容。
移除了 DSL
Android Gradle 插件 9.0 移除了以下内容:
AndroidSourceSet.jni,因为该功能无法正常运行。AndroidSourceSet.wearAppConfigurationName,因为这与已移除的嵌入式 Wear OS 应用支持有关。BuildType.isRenderscriptDebuggable,因为该功能无法正常运行。DependencyVariantSelection。它已替换为DependencySelection,后者以kotlin.android.localDependencySelection的形式公开Installation.installOptions(String)。它已被Installation.installOptions的可变属性取代。实验性但从未稳定过的
PostProcessing块。ProductFlavor.setDimension,已由dimension属性取代LanguageSplitOptions,该属性仅对已弃用的 Google Play 免安装体验有用。
已移除的 API
Android Gradle 插件 9.0 移除了以下内容:
Component.transformClassesWith。它已被Instrumentation.transformClassesWith取代Component.setAsmFramesComputationMode。它已被Instrumentation.setAsmFramesComputationMode取代DependenciesInfoBuilder.includedInBundle。已替换为includeInBundleVariant.unitTest,因为它不适用于com.android.test插件。unitTest可用于扩展HasUnitTest的VariantBuilder子类型。VariantBuilder.targetSdk和targetSdkPreview,因为它们在库中没有意义。请改用GeneratesApkBuilder.targetSdk或GeneratesApkBuilder.targetSdkPreview。VariantBuilder.enableUnitTest,因为它不适用于com.android.test插件。enableUnitTest可用于扩展HasUnitTestBuilder的VariantBuilder子类型。移除了
VariantBuilder.unitTestEnabled,取而代之的是在扩展HasUnitTestBuilder的VariantBuilder子类型上更一致命名的enableUnitTest。已弃用并停用的
FeaturePlugin和FeatureExtension。已废弃并停用的
BaseExtension.registerTransformAPI,这些 API 仅用于在以 AGP 4.2 或更低版本为目标平台的同时,允许针对最新 AGP 版本进行编译。
已移除的 Gradle 属性
以下 Gradle 属性最初添加的目的是为了全局停用默认启用的功能。
自 AGP 8.0 或更低版本以来,这些功能已默认停用。仅在使用这些功能的子项目中启用这些功能,以提高构建效率。
| 属性 | 功能 | 替换 |
|---|---|---|
android.defaults.buildfeatures.aidl |
在所有子项目中启用 AIDL 编译 |
仅在包含 AIDL 源文件的子项目中启用 AIDL 编译,方法是在这些项目的 Gradle build 文件中设置以下属性:
android {
buildFeatures {
aidl = true
}
} |
android.defaults.buildfeatures.renderscript |
在所有子项目中启用 RenderScript 编译 |
仅在包含 renderscript 源的子项目中启用 renderscript 编译,方法是在这些项目的 Gradle build 文件中设置以下属性:
android {
buildFeatures {
renderScript = true
}
} |
强制执行的 Gradle 属性
如果您设置了以下 Gradle 属性,AGP 9.0 会抛出错误。
Android Gradle 插件升级助理不会将使用这些属性的项目升级到 AGP 9.0。
| 属性 | 功能 |
|---|---|
android.r8.integratedResourceShrinking |
资源缩减现在始终作为 R8 的一部分运行,之前的实现已被移除。 |
修复的问题
Android Gradle 插件 9.0.0-alpha10
| 已修复的问题 | ||||
|---|---|---|---|---|
| Android Gradle 插件 |
|
|||
| lint |
|
|||
Android Gradle 插件 9.0.0-alpha09
| 已修复的问题 | ||||
|---|---|---|---|---|
| Android Gradle 插件 |
|
|||
Android Gradle 插件 9.0.0-alpha08
| 已修复的问题 | |
|---|---|
| AGP 9.0.0-alpha08 中未将任何公开问题标记为已修复 |
Android Gradle 插件 9.0.0-alpha07
| 已修复的问题 | |||||||||
|---|---|---|---|---|---|---|---|---|---|
| Android Gradle 插件 |
|
||||||||
Android Gradle 插件 9.0.0-alpha06
| 已修复的问题 | |||||
|---|---|---|---|---|---|
| Android Gradle 插件 |
|
||||
| lint |
|
||||
Android Gradle 插件 9.0.0-alpha05
| 已修复的问题 | |||||
|---|---|---|---|---|---|
| Android Gradle 插件 |
|
||||
| lint |
|
||||
Android Gradle 插件 9.0.0-alpha04
| 已修复的问题 | ||||
|---|---|---|---|---|
| Android Gradle 插件 |
|
|||
| lint |
|
|||
Android Gradle 插件 9.0.0-alpha03
| 已修复的问题 | ||||
|---|---|---|---|---|
| Android Gradle 插件 |
|
|||
| lint |
|
|||
Android Gradle 插件 9.0.0-alpha02
| 已修复的问题 | ||||
|---|---|---|---|---|
| Android Gradle 插件 |
|
|||
Android Gradle 插件 9.0.0-alpha01
| 已修复的问题 | |||||||
|---|---|---|---|---|---|---|---|
| Android Gradle 插件 |
|
||||||