Android Gradle 插件 7.0.0(2021 年 7 月)
Android Gradle 插件 7.0.0 是一个主要版本,包含各种新功能和改进。
7.0.1(2021 年 8 月)
此次小更新包含各种错误修复。要查看显著错误修复的列表,请阅读 版本更新博客 上的相关帖子。
兼容性
最低版本 | 默认版本 | 备注 | |
---|---|---|---|
Gradle | 7.0.2 | 7.0.2 | 要了解更多信息,请参阅 更新 Gradle。 |
SDK Build Tools | 30.0.2 | 30.0.2 | 安装 或 配置 SDK Build Tools。 |
NDK | N/A | 21.4.7075529 | 安装 或 配置 不同版本的 NDK。 |
JDK | 11 | 11 | 要了解更多信息,请参阅 设置 JDK 版本。 |
运行 AGP 7.0 需使用 JDK 11
使用 Android Gradle 插件 7.0 构建应用时,现在需要使用 JDK 11 才能运行 Gradle。Android Studio Arctic Fox 捆绑了 JDK 11 并默认配置 Gradle 使用它,这意味着大多数 Android Studio 用户无需对其项目进行任何配置更改。
如果需要手动 设置 AGP 内部使用的 JDK 版本,则需要使用 JDK 11 或更高版本。
在独立于 Android Studio 的情况下使用 AGP 时,请通过设置 JAVA_HOME 环境变量 或 -Dorg.gradle.java.home
命令行选项 将其设置为 JDK 11 的安装目录。
请注意,已弃用的 SDK Tools 软件包中的 SDK Manager 和 AVD Manager 不适用于 JDK 11。要继续在 AGP 7.0 及更高版本中使用 SDK Manager 和 AVD Manager,您需要切换到当前 Android SDK 命令行工具软件包 中的新版本工具。
Variant API 稳定版
新的 Variant API 现已稳定。请参阅 com.android.build.api.variant 软件包中的新接口,以及 gradle-recipes GitHub 项目中的示例。作为新的 Variant API 的一部分,我们已通过 Artifacts 接口提供了许多中间文件(称为工件)。这些工件(如合并的清单)可以通过使用第三方插件和代码安全地获取和自定义。
我们将继续扩展 Variant API,添加新功能并增加可用于自定义的中间工件的数量。
Lint 的行为变更
本节描述了 Android Gradle 插件 7.0.0 中的多个 Lint 行为更改。
改进库依赖项的 Lint
使用 checkDependencies = true
运行 Lint 现在比以前更快。对于由应用程序及其库依赖项组成的 Android 项目,建议将 checkDependencies
设置为 true
(如下所示),并通过 ./gradlew :app:lint
运行 Lint,这将并行分析所有依赖项模块并生成单个报告,其中包含应用程序及其所有依赖项中的问题。
Groovy
// build.gradle
android {
...
lintOptions {
checkDependencies true
}
}
Kotlin
// build.gradle.kts
android {
...
lint {
isCheckDependencies = true
}
}
Lint 任务现在可以是最新状态 (UP-TO-DATE)
如果模块的源代码和资源未更改,则无需再次运行该模块的 Lint 分析任务。发生这种情况时,任务的执行在 Gradle 输出中显示为“最新状态 (UP-TO-DATE)”。通过此更改,在使用 checkDependencies = true
对应用程序模块运行 Lint 时,只需要运行已更改的模块的分析。因此,Lint 可以运行得更快。
如果 Lint 报告任务的输入没有更改,则该任务也不需要运行。一个相关的已知问题是,当 Lint 任务处于最新状态 (UP-TO-DATE) 时,不会将 Lint 文本输出打印到标准输出 (问题 #191897708)。
在动态特性模块上运行 Lint
AGP 不再支持从动态特性模块运行 Lint。从相应的应用程序模块运行 Lint 将在它的动态特性模块上运行 Lint,并将所有问题包含在应用程序的 Lint 报告中。一个相关的已知问题是,当从应用程序模块使用 checkDependencies = true
运行 Lint 时,除非动态特性库依赖项也是应用程序依赖项,否则不会对其进行检查 (问题 #191977888)。
仅在默认变体上运行 Lint
运行 ./gradlew :app:lint
现在仅对默认变体运行 Lint。在早期版本的 AGP 中,它会对所有变体运行 Lint。
R8 压缩器中的缺少类警告
R8 更精确且一致地处理缺少的类和 -dontwarn
选项。因此,您应该开始评估 R8 发出的缺少类警告。
当 R8 遇到在您的应用程序或其任何依赖项中未定义的类引用时,它将发出一个警告,该警告会显示在您的构建输出中。例如
R8: Missing class: java.lang.instrument.ClassFileTransformer
此警告表示在分析应用程序代码时找不到类定义 java.lang.instrument.ClassFileTransformer
。虽然这通常表示存在错误,但您可能希望忽略此警告。忽略警告的两个常见原因是
-
面向 JVM 的库,并且缺少的类属于 JVM 库类型(如上例所示)。
-
您的其中一个依赖项使用了仅编译时 API。
您可以通过向 proguard-rules.pro
文件添加 -dontwarn
规则来忽略缺少的类警告。例如
-dontwarn java.lang.instrument.ClassFileTransformer
为了方便起见,AGP 将生成一个包含所有潜在缺少规则的文件,并将它们写入以下文件路径:app/build/outputs/mapping/release/missing_rules.txt
。将这些规则添加到您的 proguard-rules.pro
文件中以忽略警告。
在 AGP 7.0 中,缺少类消息将显示为警告,您可以通过在 gradle.properties
中设置 android.r8.failOnMissingClasses = true
将其转换为错误。在 AGP 8.0 中,这些警告将变为导致构建失败的错误。可以通过向 proguard-rules.pro
文件添加 -ignorewarnings
选项来保留 AGP 7.0 的行为,但不建议这样做。
已移除 Android Gradle 插件构建缓存
AGP 构建缓存已在 AGP 4.1 中移除。AGP 构建缓存最初在 AGP 2.3 中引入,用于补充 Gradle 构建缓存,但在 AGP 4.1 中完全被 Gradle 构建缓存取代。此更改不会影响构建时间。
在 AGP 7.0 中,已移除 android.enableBuildCache
属性、android.buildCacheDir
属性以及 cleanBuildCache
任务。
在您的项目中使用 Java 11 源代码
您现在可以在应用程序的项目中编译最多 Java 11 的源代码,从而可以使用更新的语言功能,例如私有接口方法、匿名类的菱形运算符以及 Lambda 参数的局部变量语法。
要启用此功能,请将 compileOptions
设置为所需的 Java 版本,并将 compileSdkVersion
设置为 30 或更高版本
// build.gradle
android {
compileSdkVersion 30
compileOptions {
sourceCompatibility JavaVersion.VERSION_11
targetCompatibility JavaVersion.VERSION_11
}
// For Kotlin projects
kotlinOptions {
jvmTarget = "11"
}
}
// build.gradle.kts
android {
compileSdkVersion(30)
compileOptions {
sourceCompatibility(JavaVersion.VERSION_11)
targetCompatibility(JavaVersion.VERSION_11)
}
kotlinOptions {
jvmTarget = "11"
}
}
已移除依赖项配置
在 AGP 7.0 中,已移除以下配置(或依赖项范围)
-
compile
根据用例,已将其替换为api
或implementation
。
也适用于 *Compile 变体,例如:debugCompile
。 -
provided
已将其替换为compileOnly
。
也适用于 *Provided 变体,例如:releaseProvided
。 -
apk
已将其替换为runtimeOnly
。 -
publish
已将其替换为runtimeOnly
。
在大多数情况下,AGP 升级助手 将自动将您的项目迁移到新的配置。
编译针对 Android Gradle 插件时的类路径更改
如果您正在编译针对 Android Gradle 插件,则您的编译类路径可能会发生更改。由于 AGP 现在在内部使用 api/implementation
配置,因此某些工件可能会从您的编译类路径中移除。如果您在编译时依赖于 AGP 依赖项,请确保将其添加为显式依赖项。
不支持在 Java 资源文件夹中添加原生库
以前,您可以将原生库添加到 Java 资源文件夹中,并使用 android.sourceSets.main.resources.srcDirs
注册该文件夹,以便提取原生库并将其添加到最终的 APK 中。从 AGP 7.0 开始,不再支持此操作,并且将忽略 Java 资源文件夹中的原生库。请改用为原生库设计的 DSL 方法 android.sourceSets.main.jniLibs.srcDirs
。有关更多信息,请参阅如何配置源集。
已知问题
本节描述了 Android Gradle 插件 7.0.0 中存在的已知问题。
与 1.4.x Kotlin 多平台插件不兼容
Android Gradle 插件 7.0.0 与 Kotlin 多平台插件 1.5.0 及更高版本兼容。使用 Kotlin 多平台支持的项目需要更新到 Kotlin 1.5.0 才能使用 Android Gradle 插件 7.0.0。作为解决方法,您可以将 Android Gradle 插件降级到 4.2.x,但这不建议这样做。
有关更多信息,请参阅 KT-43944。
缺少 Lint 输出
当 Lint 任务处于最新状态 (up-to-date) 时,不会将 Lint 文本输出打印到标准输出 (问题 #191897708)。有关更多上下文,请参阅 Lint 行为更改。此问题将在 Android Gradle 插件 7.1 中修复。
并非所有动态特性库依赖项都经过 Lint 检查
当从应用程序模块使用 checkDependencies = true
运行 Lint 时,除非动态特性库依赖项也是应用程序依赖项,否则不会对其进行检查 (问题 #191977888)。作为解决方法,可以在这些库上运行 Lint 任务。有关更多上下文,请参阅 Lint 行为更改。