Android Gradle 插件 4.2.0(2021 年 3 月)

兼容性

最低版本 默认版本 说明
Gradle 6.7.1 N/A 要了解更多信息,请参阅 更新 Gradle
SDK 构建工具 30.0.2 30.0.2 安装配置 SDK 构建工具。
NDK N/A 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.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 的原生构建的消息,默认情况下仅显示 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。在以前的版本中,JDK 8 与 Studio 捆绑在一起。然而,在 4.2 中,现在捆绑了 JDK 11。当使用新的捆绑 JDK 运行 Gradle 时,这可能会导致一些不兼容性或影响 JVM 性能,因为垃圾回收器发生了更改。这些问题在下面进行了描述。

注意:虽然我们建议使用 JDK 11 运行 Gradle,但可以在 项目结构 对话框中更改用于运行 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 构建。在 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。有关更多背景信息,请参阅发行说明 默认情况下以未压缩形式打包的原生库