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 签名,您可以使用 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 会过滤来自使用 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
等读取值。对于应用模块,如果 <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 build。在 gradle.properties
中设置以下内容:
org.gradle.jvmargs=-XX:+UseParallelGC
如果此字段中已设置了其他选项,请添加一个新选项:
org.gradle.jvmargs=-Xmx1536m -XX:+UseParallelGC
如需衡量采用不同配置时的构建速度,请参阅对构建进行性能分析。
当 minSdk
为 28 或更高级别时,系统会在 APK 中解压缩 DEX 文件
当 minSdk
= 28 或更高版本时,AGP 现在会默认将未压缩的 DEX 文件打包到 APK 中。这会导致 APK 大小增加,但会使设备上的安装大小更小,并且下载大小大致相同。
如需强制 AGP 改为打包压缩后的 DEX 文件,您可以将以下内容添加到 build.gradle
文件中:
android {
packagingOptions {
dex {
useLegacyPackaging true
}
}
}
使用 DSL 打包压缩后的原生库
我们建议以未压缩的形式打包原生库,因为这会减小应用安装大小,缩减应用下载大小,并缩短用户的应用加载时间。不过,如果您希望 Android Gradle 插件在构建应用时打包压缩后的原生库,请在应用的 build.gradle
文件中将 useLegacyPackaging
设置为 true
:
android {
packagingOptions {
jniLibs {
useLegacyPackaging true
}
}
}
useLegacyPackaging
标志会替换 extractNativeLibs
清单属性。如需了解更多背景信息,请参阅版本说明默认情况下,原生库以未压缩的形式打包。