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 文档

要保留旧行为,请在模块级中明确指定 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。如需了解更多背景信息,请参阅版本说明 默认情况下,原生库以未压缩的形式打包