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.kts 或 build.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 v3
和 APK v4 签名格式。
如需在 build 中启用这两种格式之一或同时启用这两种格式,请将以下属性添加到模块级 build.gradle 或 build.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 安装 在 Android 11 中快速部署大型 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 会过滤来自使用 CMake 和 ndk-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,但您也可以在项目结构对话框中更改用于运行 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 清单属性。如需了解更多背景信息,请参阅版本说明
默认情况下,原生库以未压缩的形式打包。