Android Gradle 插件 4.2.0(2021 年 3 月)

兼容性

最低版本 默认版本 备注
Gradle 6.7.1 不适用 如需了解详情,请参阅更新 Gradle
SDK Build Tools 30.0.2 30.0.2 安装配置 SDK Build Tools。
NDK 不适用 21.4.7075529 安装配置其他版本的 NDK。

新功能

此版本的 Android Gradle 插件包含以下新功能。

默认情况下使用 Java 语言版本 8

从版本 4.2 开始,AGP 将默认使用 Java 8 语言级别。 Java 8 提供对许多更新语言功能(包括 lambda)的访问权限 表达式、方法引用和静态接口方法。如需查看完整列表 请参阅 Java 8 文档

如需保留旧行为,请在模块级 build.gradle.ktsbuild.gradle 文件中显式指定 Java 7:

// build.gradle
android {
  ...
  compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_7
    targetCompatibility JavaVersion.VERSION_1_7
  }
  // For Kotlin projects, compile to Java 6 instead of 7
  kotlinOptions {
    jvmTarget = "1.6"
  }
}
// build.gradle.kts
android {
  ...
  compileOptions {
    sourceCompatibility = JavaVersion.VERSION_1_7
    targetCompatibility = JavaVersion.VERSION_1_7
  }
  // For Kotlin projects, compile to Java 6 instead of 7
  kotlinOptions {
    jvmTarget = "1.6"
  }
}

新增的 JVM 资源编译器

Android Gradle 插件 4.2 工具中新的 JVM 资源编译器替换了部分 AAPT2 资源编译器的基础, 提升构建性能,尤其是在 Windows 计算机上。新的 JVM 资源编译器默认处于启用状态。

现在支持 v3 和 v4 签名

Android Gradle 插件 4.2 现在支持 APK v3APK v4 签名格式。 如需在 build 中启用这两种格式之一或同时启用这两种格式,请将以下属性添加到模块级 build.gradlebuild.gradle.kts 文件中:

// build.gradle
android {
  ...
  signingConfigs {
    config {
        ...
        enableV3Signing true
        enableV4Signing true
    }
  }
}
// build.gradle.kts
android {
  ...
  signingConfigs {
      config {
          ...
          enableV3Signing = true
          enableV4Signing = true
      }
  }
}

借助 APK v4 签名,您可以使用 ADB 快速部署大型 APK 增量 APK 安装 Android 11。此新标志负责部署过程中的 APK 签名步骤。

按变体配置应用签名

现在可以在 Android Gradle 中启用或停用应用签名 每个变体。

以下示例展示了如何在 Kotlin 或 Groovy 中使用 onVariants() 方法按变体设置应用签名:

androidComponents {
    onVariants(selector().withName("fooDebug"), {
        signingConfig.enableV1Signing.set(false)
        signingConfig.enableV2Signing.set(true)
    })

新增的 Gradle 属性:android.native.buildOutput

为了减少构建输出中的杂乱现象,AGP 4.2 会过滤来自使用 CMakendk-build 的原生 build 的消息,从而在默认情况下仅显示 C/C++ 编译器输出。之前,系统会 生成的每个文件都会生成大量的 信息性消息。

如果您想看到完整的原生输出,请将新的 Gradle 属性 android.native.buildOutputverbose

您可以在 gradle.properties 文件中或通过 命令行。

gradle.properties
android.native.buildOutput=verbose

命令行
-Pandroid.native.buildOutput=verbose

此属性的默认值为 quiet

gradle.properties 文件的行为变更

从 AGP 4.2 开始,无法再替换 Gradle 属性 子项目中。也就是说,如果您在子项目(而不是根项目)上的 gradle.properties 文件中声明某个属性,该属性将被忽略。

例如,在之前的版本中,AGP 会从 <var>projectDir</var>/gradle.properties, <var>projectDir</var>/app/gradle.properties, <var>projectDir</var>/library/gradle.properties, 等等。对于应用模块,如果两个模块中存在相同的 Gradle 属性, <var>projectDir</var>/gradle.properties<var>projectDir</var>/app/gradle.properties, 从 <var>projectDir</var>/app/gradle.properties 优先级。

在 AGP 4.2 中已更改此行为,AGP 不会从子项目内的 gradle.properties 中加载值(例如,子项目为<var>projectDir</var>/app/gradle.properties)。此更改反映了新的 Gradle 行为并支持配置缓存

如需详细了解如何在 gradle.properties 文件中设置值,请参阅 Gradle 文档

Gradle 兼容性和配置变更

在 Android Studio 中运行时,Gradle 构建工具会使用 Studio 所捆绑的 JDK。 在之前的版本中,与 Studio 捆绑的是 JDK 8。但在 4.2 中,现在捆绑的版本为 JDK 11。在使用所捆绑的新 JDK 运行 Gradle 时,由于垃圾回收器的变更,这可能会导致某些不兼容问题或影响 JVM 性能。这些问题的说明如下。

注意:虽然我们建议使用 JDK 11 运行 Gradle,但您也可以在 Project Structure 对话框中更改用于运行 Gradle 的 JDK。更改此设置只会更改用于运行 Gradle 的 JDK,而不会改变用于运行 Studio 自身的 JDK。

Studio 与 Android 的兼容性 Gradle 插件 (AGP)

Android Studio 4.2 可以打开使用 AGP 3.1 及更高版本的项目,前提是 AGP 运行的是 Gradle 4.8.1 及更高版本。如需详细了解 Gradle 兼容性,请参阅更新 Gradle

针对 JDK 11 优化 Gradle 构建

对 JDK 11 的这一更新会影响 JVM 垃圾回收的默认配置 收集器,因为 JDK 8 使用并行垃圾回收器,而 JDK 11 使用 G1 垃圾回收器

为提高构建性能,我们建议您使用并行垃圾回收器测试 Gradle build。在 gradle.properties 中设置以下内容:

org.gradle.jvmargs=-XX:+UseParallelGC

如果此字段中已设置了其他选项,请添加一个新选项:

org.gradle.jvmargs=-Xmx1536m -XX:+UseParallelGC

如需衡量采用不同配置时的构建速度,请参阅对构建进行性能分析

minSdk 为 28 或更高级别时,系统会在 APK 中解压缩 DEX 文件

minSdk = 28 或 。这会导致 APK 大小增加 在设备上的安装大小,并且下载大小大致相同。

如需强制 AGP 改为打包压缩后的 DEX 文件,您可以添加 添加到 build.gradle 文件中:

android {
    packagingOptions {
        dex {
            useLegacyPackaging true
        }
    }
}

使用 DSL 打包压缩后的原生库

我们建议以未压缩的形式打包原生库 从而缩减应用安装大小、缩减应用下载大小和提升应用运行速度 为用户节省了宝贵的时间不过,如果您希望 Android Gradle 插件在构建应用时打包压缩后的原生库,请在应用的 build.gradle 文件中将 useLegacyPackaging 设置为 true

android {
    packagingOptions {
        jniLibs {
            useLegacyPackaging true
        }
    }
}

useLegacyPackaging 标志会替换清单属性 extractNativeLibs。如需了解更多背景信息,请参阅版本说明默认情况下,原生库以未压缩的形式打包