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 签名,您可以使用 Android 11 中的 ADB 增量 APK 安装快速部署大型 APK。此新标志负责部署过程中的 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.buildOutput 设置为 verbose

您可以在 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 或更高级别时,AGP 默认在 APK 中打包未压缩的 DEX 文件。这会导致 APK 大小增大,但会使设备上的安装大小变小,并且下载大小大致相同。

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

android {
    packagingOptions {
        dex {
            useLegacyPackaging true
        }
    }
}

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

我们建议以未压缩的形式打包原生库,因为这样可以减小应用安装大小、减小应用下载大小,并缩短用户的应用加载时间。不过,如果您希望 Android Gradle 插件在构建应用时打包压缩后的原生库,请在应用的 build.gradle 文件中将 useLegacyPackaging 设置为 true

android {
    packagingOptions {
        jniLibs {
            useLegacyPackaging true
        }
    }
}

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