Android Gradle 插件 4.2.0(2021 年 3 月)

兼容性

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

新功能

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

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

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

要保留旧行为,请在模块级中明确指定 Java 7 build.gradle.ktsbuild.gradle 文件:

// 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 中启用或停用应用签名 每个变体。

此示例演示了如何使用 onVariants() 方法:

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

新的 Gradle 属性: android.native.buildOutput

为减少 build 输出中的杂乱程度,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, 可以在 项目结构 对话框。更改此设置只会更改用于运行 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 垃圾回收器

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

org.gradle.jvmargs=-XX:+UseParallelGC

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

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

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

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

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

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

android {
    packagingOptions {
        dex {
            useLegacyPackaging true
        }
    }
}

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

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

android {
    packagingOptions {
        jniLibs {
            useLegacyPackaging true
        }
    }
}

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