Android Gradle Plugin 4.2.0 (2021 年 3 月)

兼容性

最低版本 默认版本 备注
Gradle 6.7.1 不适用 要了解详情,请参阅更新 Gradle
SDK 构建工具 30.0.2 30.0.2 通过 安装配置 SDK 构建工具。
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 Plugin 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 签名步骤。

按 variant 配置应用签名

现在可以按 variant 在 Android Gradle 插件中启用或停用应用签名

此示例演示如何使用 Kotlin 或 Groovy 中的 onVariants() 方法按 variant 设置应用签名

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 等文件中的值。对于应用模块,如果 <var>projectDir</var>/gradle.properties<var>projectDir</var>/app/gradle.properties 中都存在相同的 Gradle 属性,则以 <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 构建。在 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。如需更多背景信息,请参阅版本说明 默认以未压缩形式打包的原生库