Android Gradle 插件预览版版本说明

本页面包含 Android Gradle 插件 (AGP) 预览版的版本说明。

Android Gradle 插件 9.0

Android Gradle 插件 9.0 是 AGP 的一个全新主要版本,带来了 API 和行为变更。

如需更新到 Android Gradle 插件 9.0.0-alpha05,请在 Android Studio Narwhal 4 Feature Drop | 2025.1.4 中使用 Android Gradle 插件升级助理

AGP 升级助理有助于在升级项目时尽可能保留现有行为,即使您尚未准备好采用 AGP 9.0 中的所有新默认设置,也可以将项目升级为使用 AGP 9.0。

兼容性

Android Gradle 插件 9.0.0-alpha05 支持的最高 Android API 级别为 API 级别 36。

Android Gradle 插件 9.0.0-alpha05 需要 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,您可能需要执行以下操作:

  • 切换到内置 Kotlinorg.jetbrains.kotlin.android 插件与新的 DSL 不兼容。
  • 将 KMP 项目切换到 Android Gradle Library Plugin for KMP:在与 com.android.librarycom.android.application 插件相同的 Gradle 子项目中同时使用 org.jetbrains.kotlin.multiplatform 插件与新的 DSL 不兼容。

  • 更新 build 文件:虽然接口的更改旨在尽可能保持 DSL 的相似性,但可能存在一些细微的更改

  • 更新自定义 build 逻辑以引用新的 DSL 和 API: 将对内部 DSL 的所有引用替换为公共 DSL 接口。 在大多数情况下,这会是一对一的替换。 将所有使用 applicationVariants 和类似 API 的情况替换为新的 androidComponents API。这可能更复杂,因为 androidComponents API 的设计旨在提高稳定性,以使插件能够更长时间地保持兼容。如需查看示例,请参阅我们的 Gradle 诀窍

  • 更新第三方插件:某些第三方插件可能仍依赖于不再公开的接口或 API。迁移到与 AGP 9.0 兼容的插件版本。

如果您更新到 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 的内置支持,可取代单独应用的 Kotlin 插件。这简化了与 AGP 的集成,避免使用已废弃的 API,并在某些情况下提高了性能。

Android Gradle 插件 9.0 在运行时依赖于 Kotlin Gradle 插件 2.2.10,这是内置 Kotlin 支持所需的最低版本。

您可以通过设置 android.builtInKotlin=false 来选择停用内置 Kotlin。

如果您已选择停用内置 Kotlin,并且还需要使用旧版 Kotlin Gradle 插件,则可以强制降级:

buildscript {
    dependencies {
        classpath("org.jetbrains.kotlin:kotlin-gradle-plugin") {
            version { strictly("2.0.0") } // or another version that you want to use
        }
    }
}

行为变更

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)将无法再访问。
falsetrue 您可以通过设置 android.newDsl=false 来选择停用。
当项目使用的所有插件和 build 逻辑都兼容时,移除选择停用。
android.builtInKotlin 在 Android Gradle 插件中直接编译 Kotlin 代码,无需使用 org.jetbrains.kotlin.android 插件。 falsetrue 如果可以,请移除 org.jetbrains.kotlin.android 插件的使用,采用内置 Kotlin。 如果不想参与,请通过设置 android.builtInKotlin=false 选择退出
android.uniquePackageNames 强制要求每个库都有不同的软件包名称。 falsetrue 为项目中的所有库指定唯一的软件包名称。 如果无法实现,您可以在迁移时停用此标志。
android.dependency.useConstraints 控制配置之间依赖项约束的使用。
AGP 9.0 中的默认值为 false,该值仅在应用设备测试 (AndroidTest) 中使用限制。 将此值设置为 true 将恢复为 8.13 版的行为。
truefalse 除非需要,否则不要在所有地方都使用依赖项限制。 接受此标志的新默认值还可以在项目导入过程中启用优化,从而缩短包含多个 Android 库子项目的 build 的导入时间。
aandroid.enableAppCompileTimeRClass 针对非最终 R 类编译应用中的代码,使应用编译与库编译保持一致。
这有助于提高增量性,并为将来对资源处理流程进行性能优化奠定基础。
falsetrue 许多项目只需采用新行为,无需更改源代码。 如果 R 类字段用于需要常量的位置(例如 switch 语句),请重构为使用链式 if 语句。
android.sdk.defaultTargetSdkToCompileSdkIfUnset 使用编译 SDK 版本作为应用和测试中目标 SDK 版本的默认值。
在此变更之前,目标 SDK 版本会默认设置为最低 SDK 版本。
falsetrue 为应用和测试显式指定目标 SDK 版本。
android.onlyEnableUnitTestForTheTestedBuildType 仅为测试的 build 类型创建单元测试组件。
在默认项目中,这会生成一个用于调试的单元测试,而之前的行为是运行用于调试或发布的单元测试。
falsetrue 如果您的项目不需要同时针对调试和发布运行测试,则无需进行任何更改。
android.proguard.failOnMissingFiles 如果 AGP DSL 中指定的任何 keep 文件在磁盘上不存在,则构建会因错误而失败。在此变更之前,文件名中的拼写错误会导致文件被静默忽略。 falsetrue 移除所有无效的 ProGuard 文件声明
android.r8.optimizedResourceShrinking 通过同时考虑类和 Android 资源,允许 R8 保留较少的 Android 资源。 falsetrue 如果项目的保留规则已完整设置,则无需进行任何更改。
android.r8.strictFullModeForKeepRules 允许 R8 通过在保留类时不会隐式保留默认构造函数来减少保留的内容。 也就是说,-keep class A 不再意味着 -keep class A { <init>(); }
falsetrue 如果项目的保留规则已完整设置,则无需进行任何更改。

在项目的保留规则中,将 -keep class A 替换为 -keep class A { <init>(); },以保留默认构造函数。
android.defaults.buildfeatures.resvalues 在所有子项目中启用 resValues truefalse 仅在需要 resValues 的子项目中启用该功能,方法是在这些项目的 Gradle build 文件中设置以下内容:
android {
  buildFeatures {
    resValues = true
  }
}
android.defaults.buildfeatures.shaders 在所有子项目中启用着色器编译 truefalse 仅在包含要编译的着色器的子项目中启用着色器编译,方法是在这些项目的 Gradle build 文件中设置以下内容:
android {
  buildFeatures {
    shaders = true
  }
}

已移除的功能

Android Gradle 插件 9.0 移除了以下功能:

更改了 DSL

Android Gradle 插件 9.0 包含以下重大 DSL 变更:

  • 移除了 CommonExtension 的形参化。

    就其本身而言,这只是一个源代码级重大变更,旨在帮助避免未来出现源代码级重大变更,但这也意味着,块方法需要从 CommonExtension 移至 ApplicationExtensionLibraryExensionDynamicFeatureExtensionTestExtension

    将项目升级到 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 移除了以下内容:

已移除的 Gradle 属性

以下 Gradle 属性最初添加的目的是为了全局停用默认启用的功能。

自 AGP 8.0 或更低版本以来,这些功能已默认停用。仅在使用这些功能的子项目中启用它们,以提高构建效率。

属性 功能 替换
android.defaults.buildfeatures.aidl 在所有子项目中启用 AIDL 编译 仅在包含 AIDL 源文件的子项目中启用 AIDL 编译,方法是在这些项目的 Gradle build 文件中设置以下属性:
android {
  buildFeatures {
    aidl = true
  }
}
在包含 AIDL 源的每个子项目的 Gradle build 文件中
android.defaults.buildfeatures.renderscript 在所有子项目中启用 RenderScript 编译 仅在包含 renderscript 源的子项目中启用 renderscript 编译,方法是在这些项目的 Gradle build 文件中设置以下属性:
android {
  buildFeatures {
    renderScript = true
  }
}

已移除的 API

Android Gradle 插件 9.0 移除了以下内容:

  • 已废弃并停用的 BaseExtension.registerTransform API,这些 API 仅用于在以 AGP 4.2 或更低版本为目标平台的同时,允许针对最新 AGP 版本进行编译。

  • 已弃用并停用的 FeaturePluginFeatureExtension

强制执行的 Gradle 属性

如果您设置了以下 Gradle 属性,AGP 9.0 会抛出错误。

Android Gradle 插件升级助理不会将使用这些属性的项目升级到 AGP 9.0。

属性 功能
android.r8.integratedResourceShrinking 资源缩减现在始终作为 R8 的一部分运行,之前的实现已被移除。