Android Gradle 插件 7.0.0(2021 年 7 月)

Android Gradle 插件 7.0.0 是一个主要版本,包含各种新的 功能和改进。

7.0.1(2021 年 8 月)

本次要更新包含多项 bug 修复。要查看重要问题修复列表,请阅读 <ph type="x-smartling-placeholder"></ph> 版本更新博客

兼容性

最低版本 默认版本
Gradle 7.0.2 7.0.2
SDK Build Tools 30.0.2 30.0.2
NDK 不适用 21.4.7075529
JDK 11 11

需要 JDK 11 才能运行 AGP 7.0

使用 Android Gradle 插件 7.0 构建应用时,JDK 11 现在是 来运行 Gradle。Android Studio Arctic Fox 捆绑了 JDK 11 和 将 Gradle 配置为默认使用它,这意味着大多数 Android Studio 用户无需对其项目进行任何配置更改。

如果您需要手动设置 JDK 版本时,您需要使用 JDK 11 或更高版本。

使用独立于 Android Studio 的 AGP 时,请通过以下命令升级 JDK 版本 设置 JAVA_HOME 环境变量-Dorg.gradle.java.home 命令行选项 复制到您的 JDK 11 安装目录。

请注意,已弃用的 SDK 工具软件包中的 SDK 管理器和 AVD 管理器 不适用于 JDK 11。如需继续使用 SDK 管理器和 AVD 管理器,请执行以下操作: 需要使用 AGP 7.0 及更高版本,您需要将这些工具 当前 Android SDK 命令行工具 软件包

Variant API 已稳定

新的 Variant API 现已稳定。要了解新界面 com.android.build.api.variant 软件包和 gradle-recipes GitHub 项目。作为新版 Variant API),我们还提供了许多中间文件,称为 通过 制品 界面。这些工件(例如合并后的清单)可以安全地获取 以及使用第三方插件和代码进行自定义

我们将继续通过增加新功能来扩展 Variant API 并增加我们提供给 自定义。

lint 的行为变更

本部分介绍了 Android Gradle 中的多项 lint 行为变更 插件 7.0.0。

针对库依赖项提高了 lint 性能

现在,使用 checkDependencies = true 运行 lint 的速度更快 对于包含库应用的 Android 项目 依赖项,建议将 checkDependencies 设置为 true(如下所示),通过以下命令运行 lint: ./gradlew :app:lint,用于分析所有依赖项 并生成一份报告,其中包含 应用及其所有依赖项

Groovy

// build.gradle
android {
  ...
  lintOptions {
    checkDependencies true
  }
}

Kotlin

// build.gradle.kts
android {
  ...
  lint {
    isCheckDependencies = true
  }
}

lint 任务现在可以显示为“UP-TO-DATE”

如果模块的源代码和资源未更改,lint 分析 模块无需再次运行。出现这种情况时, 该任务的执行状态会显示为“UP-TO-DATE”(在 Gradle 中) 输出。进行此更改后,在设置了 checkDependencies = true 的应用模块上运行 lint 时,只有已更改的模块才会 需要运行分析。因此,lint 的运行速度更快。

如果 lint 报告任务的输入尚未运行,也不需要运行 已更改。一个相关的已知问题是未 lint 任务的状态为“UP-TO-DATE”时输出到 stdout 的文本输出 (问题 191897708)。

在动态功能模块上运行 lint

AGP 不再支持从动态功能模块运行 lint。 从相应的应用模块运行 lint 将会运行 lint, 其动态功能模块,并在应用的 lint 中包含所有问题 报告。一个相关的已知问题是运行 lint 时 使用应用模块中的 checkDependencies = true, 系统不会检查动态功能库依赖项,除非它们同时也是应用 依赖项(问题 #191977888)。

仅对默认变体运行 lint

运行 ./gradlew :app:lint 现在只会针对 默认变体。在以前的 AGP 版本中,它会对所有 变体。

R8 缩减器中的“缺少类”警告

R8,更精确地 始终如一地处理缺失的类和 -dontwarn 选项。 因此,您应开始评估发出的“缺少类”警告 。

当 R8 遇到未在应用中定义的类引用时,或 其依赖项之一时,它会发出一条警告,该警告会显示在您的 build 中 输出。例如:

R8: Missing class: java.lang.instrument.ClassFileTransformer

此警告意味着,类定义 找不到 java.lang.instrument.ClassFileTransformer 在分析应用代码时遵循的原则虽然这通常意味着出现错误, 您可以忽略此警告。两个常见原因 忽略该警告:

  1. 针对 JVM 和缺少的类以 JVM 为目标平台的库属于 JVM 库类型(如上例所示)。

  2. 您的其中一个依赖项使用了仅限编译时使用的 API。

您可以通过添加 -dontwarn 来忽略“缺少类”警告 规则添加到 proguard-rules.pro 文件中。例如:

-dontwarn java.lang.instrument.ClassFileTransformer

为方便起见,AGP 将生成一个文件,其中包含所有可能 缺少规则,将其写入文件路径,如下所示: app/build/outputs/mapping/release/missing_rules.txt。将 proguard-rules.pro 文件中的规则来忽略警告。

在 AGP 7.0 中,“缺少类”消息将显示为警告,并且您可以 将它们变成错误 android.r8.failOnMissingClasses = true 英寸 gradle.properties。在 AGP 8.0 中,这些警告将变为 会破坏您构建的错误可以通过以下方式使 AGP 7.0 行为 将-ignorewarnings选项添加到您的 proguard-rules.pro 文件,但不建议这样做。

移除了 Android Gradle 插件构建缓存

AGP 构建缓存已在 AGP 4.1 中移除。之前在 AGP 中引入 2.3 以补充 Gradle 构建缓存,已取代 AGP 构建缓存 在 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 资源文件夹会被忽略。而应使用适用于 原生库 android.sourceSets.main.jniLibs.srcDirs。对于 请参阅 如何配置 源代码集

已知问题

本部分介绍了 Android Gradle 插件中存在的已知问题 7.0.0。

与 1.4.x Kotlin 多平台插件不兼容

Android Gradle 插件 7.0.0 兼容 Kotlin Multiplatform 插件 1.5.0 及更高版本。使用 Kotlin 的项目 多平台支持需要更新到 Kotlin 1.5.0 才能使用 Android Gradle 插件 7.0.0.为了解决此问题,您可以将 Android Gradle 插件降级 升级到 4.2.x,但我们不建议这样做。

如需了解详情,请参阅 KT-43944

缺少 lint 输出

执行 lint 任务时没有输出到 stdout 的 lint 文本输出 最新 (问题 191897708)。 如需了解更多背景信息,请参阅 lint 的行为变更。此问题 将在 Android Gradle 插件 7.1 中修复。

系统不会对所有动态功能库依赖项进行 lint 检查

使用 checkDependencies = true 从 应用模块,除非 它们也是应用依赖项 (问题 191977888)。 解决方法之一是,您可以在这些库上运行 lint 任务。如需了解更多背景信息, 请参阅 lint 的行为变更