Android Gradle 插件 8.1.0 (2023 年 7 月)

Android Gradle 插件 8.1.0 是一个主要版本,其中包含各种新功能和改进。

兼容性

最低版本 默认版本 备注
Gradle 8.0 8.0 要了解更多信息,请参阅 更新 Gradle
SDK 构建工具 33.0.1 33.0.1 安装配置 SDK 构建工具。
NDK N/A 25.1.8937393 安装配置 不同版本的 NDK。
JDK 17 17 要了解更多信息,请参阅 设置 JDK 版本

Kotlin DSL 是构建配置的默认值

新项目现在默认使用 Kotlin DSL (build.gradle.kts) 进行构建配置。与 Groovy DSL (build.gradle) 相比,它提供了更好的编辑体验,包括语法高亮显示、代码补全和声明导航。请注意,如果您使用的是 AGP 8.1 和 Kotlin DSL 进行构建配置,则应使用 Gradle 8.1 以获得最佳体验。要了解更多信息,请参阅 Kotlin DSL 迁移指南

自动的每个应用语言支持

从 Android Studio Giraffe Canary 7 和 AGP 8.1.0-alpha07 开始,您可以自动配置您的应用以支持 每个应用的语言偏好设置。根据您的项目资源,Android Gradle 插件会生成 LocaleConfig 文件并在最终清单文件中添加对它的引用,因此您不再需要手动执行此操作。AGP 使用应用模块和任何库模块依赖项的 res 文件夹中的资源来确定要包含在 LocaleConfig 文件中的语言环境。

请注意,自动的每个应用语言功能支持运行 Android 13(API 级别 33)或更高版本的应用。要使用此功能,您必须将 compileSdkVersion 设置为 33 或更高版本。要为早期版本的 Android 配置每个应用的语言偏好设置,您仍然需要 使用 API 和应用内语言选择器

要启用自动的每个应用语言支持,请指定默认语言环境

  1. 在应用模块的 res 文件夹中,创建一个名为 resources.properties 的新文件。
  2. resources.properties 文件中,使用 unqualifiedResLocale 标签设置默认语言环境。要形成语言环境名称,请将语言代码与可选的脚本和区域代码组合,并使用短划线分隔每个代码

    例如,如果您的默认语言环境是美式英语

        unqualifiedResLocale=en-US
        

AGP 会添加此默认语言环境以及您使用 values-* 目录在 res 文件夹中指定的任何 备用语言环境,到自动生成的 LocaleConfig 文件中。

默认情况下,自动每应用语言支持处于关闭状态。要启用此功能,请在模块级build.gradle.kts文件(如果使用Groovy,则为build.gradle文件)的androidResources {}块中使用generateLocaleConfig设置。

Kotlin

android {
  androidResources {
    generateLocaleConfig = true
  }
}

Groovy

android {
  androidResources {
    generateLocaleConfig true
  }
}

Android Lint 包含针对 JVM 17 的字节码

从 AGP 8.1.0-alpha04 开始,Android Lint 包含针对 JVM 17 的字节码。如果编写自定义 lint 检查,则需要使用 JDK 17 或更高版本进行编译,并在 Kotlin 编译器选项中指定jvmTarget = '17'

要了解有关 lint 工具的更多信息,请参阅使用 lint 检查改进代码

原生库压缩设置已移至 DSL

从 AGP 8.1.0-alpha10 开始,如果使用 DSL 而不是清单配置原生库压缩,则会收到警告。以下指南说明如何更新配置以使用 DSL。要获取有关进行这些更新的帮助,请使用 AGP 升级助手(工具 > AGP 升级助手)。

要使用未压缩的原生库,请从清单中删除android::extractNativeLibs属性,并将以下代码添加到模块级build.gradle.kts文件(如果使用 Groovy,则为build.gradle文件)

Kotlin

android {
  packagingOptions {
    jniLibs {
      useLegacyPackaging = false
    }
  }
}

Groovy

android {
  packagingOptions {
    jniLibs {
      useLegacyPackaging false
    }
  }
}

实验性构建标志

这些是 AGP 8.1 中可用的用于配置构建的实验性标志。

标志 添加于 默认值 备注
android.experimental.useDefaultDebugSigningConfigForProfileableBuildtypes AGP 8.0 false 启用此标志且未指定签名配置时,AGP 会在运行可分析或可调试构建时使用默认调试签名配置。默认情况下禁用此标志,以鼓励构建作者声明具体的分析签名配置。
android.experimental.library.desugarAndroidTest AGP 8.0 false 此标志允许库构建者为测试 APK 启用核心库反糖,而不会影响生成的 AAR,例如通过 lint 检查。我们计划最终在 Variant API 中支持此行为。
android.experimental.testOptions.managedDevices.customDevice AGP 8.0 false 如果启用,Gradle 托管设备允许用户定义的自定义设备类型,该类型可以由插件提供。如果要使用 Firebase Test Lab 插件,则必须启用此标志。
android.lint.printStackTrace AGP 8.0 false 如果启用,Android lint 会在崩溃时打印堆栈跟踪。此标志具有与LINT_PRINT_STACKTRACE环境变量相同的功能。
android.experimental.testOptions.managedDevices.maxConcurrentDevices AGP 8.0 指定任何时候处于活动状态的并发 Gradle 托管设备 (AVD) 的最大数量。如果值为 0 或负数,则没有设备最大数量。
android.experimental.testOptions.installApkTimeout AGP 8.0 安装 APK 的超时时长(秒)。如果值为 0 或负数,则 UTP 将将其设置为默认值。

已修复的问题

Android Gradle 插件 8.1.0

已修复的问题
Android Gradle 插件
`com.android.build.gradle.tasks.ShaderCompile` 与配置缓存的问题
使用 AGP API 添加到 Java 资源会破坏配置缓存
[Android Studio: Flamingo | 2022.2.1 Canary 8] liblog.so 打包在 APK 中
KGP 在配置期间读取清单,在清单更改时使配置缓存失效
合并清单中出现问题时,构建警告消息不清楚
升级到 AGP 7.4 会导致 StackOverflowError
直接依赖于 Kotlin 库子项目的动态功能中的 ClassNotFoundException
processDebugUnitTestManifest 使用测试变体的清单占位符失败
processDebugUnitTestManifest 使用测试变体的清单占位符失败
namespace 属性可能属于 HasAndroidResources
无法禁用“自上次项目同步以来 Gradle 文件已更改”消息
不存在更新版本时显示“建议使用更新的 Android Gradle 插件”
processDebugUnitTestManifest 使用测试变体的清单占位符失败
用于在 CheckAarMetadataTask 中禁用编译 SDK 检查的布尔标志
构建错误引用了不存在的 API 级别 34
设置 JVM 工具链不会影响 JavaCompile targetCompatibility 值
具有通配符域的 Navigation deepLink 条目在合并的清单中没有 `android:host` 属性
自 Android Gradle 插件 8.1 以来,processDebugMainManifest 任务失败
可以删除 AnalyticsRecordingTask 吗?
output-metadata.json 的内容不一致
可以删除 AnalyticsRecordingTask 吗?
output-metadata.json 的内容不一致
设置 JVM 工具链不会影响 JavaCompile targetCompatibility 值
具有通配符域的 Navigation deepLink 条目在合并的清单中没有 `android:host` 属性
自 Android Gradle 插件 8.1 以来,processDebugMainManifest 任务失败
Android Studio 不尊重 STUDIO_GRADLE_JDK 环境变量
自定义源类型应创建多风味 sourceset
DependenciesInfoBuilder 需要 API 更新 + 文档
使用 Java 11 目标的 DexingNoClasspathTransform (minSdk >= 24) 由于缺少嵌套成员而失败
Groovy 中未按描述工作 DslExtension.Builder.extendProjectWith()
添加不使用 kotlin.Pair 的 VariantSelector.withFlavor API
AndroidLintAnalysisTask (:lintAnalyzeExternalRelease) 由于 `proguard.txt` 已更改而出现缓存未命中
应用合并清单包含来自依赖项的 extractNativeLibs 和 useEmbeddedDex 属性
AGP:将 AIDL 工具和框架 AIDL 文件的路径公开为公共 API
请求:让 IDE 为“PermittedSubclasses 需要 ASM9”提供修复
错误:“启用 KSP 并为此依赖项使用 KSP 处理器”只会跳转到网站
Gradle 8.1 由于 .gradle/.android/analytics.settings 而破坏了配置缓存
agp 8.1.0 中 generateLocaleConfig 使用非确定性排序,破坏了可重复构建
Dexer (D8)
最近更新后,核心库反糖导致应用崩溃。
agp 8.1.0 与 API 21 的回归 - F/dex2oat (4176): art/compiler/driver/compiler_driver.cc:1181] Check failed: !method->IsAbstract()
Lint
Lint 仅检查直接实现的接口的安全强制转换,而不检查继承的接口。
Lint 不检查调用接收者的有效强制转换
TypedArray#close (API 31) 未反糖,但在使用 try-with-resources 时,AS 不会显示警告
错误:关于“'BC' 提供程序已弃用,从 Android P 开始...”的误报警告
将 Kotlin 升级到 1.8.0 后,Lint 关于 remember 的误报
对在具有枚举参数的方法内执行的 SDK_INT 检查的 Lint 误报警告
TypographyQuotes lint 检查不适用于转义引号
TrustAllX509TrustManager lint 检查错误地标记扩展 X509TrustManager 的接口
仅重新格式化替换修复的插入代码
Lint:意图预览为 ReplaceStringQuickFix 抛出异常
Shrinker (R8)
VerifyError:使用 R8 和 Kotlin 1.8.20 时,验证器拒绝类
AGP 8 上的 R8 破坏了 Google Fit 服务
包含与输入名称重叠的残余名称的源文件信息表示不正确
R8 在使用 Compose 构建时出现 ArrayIndexOutOfBoundsException 错误
简单的 StringBuilder 相关代码在发布或 debuggable=false 模式下错过了对 append 的尾调用
VirtualDispatchMethodArgumentPropagator.shouldActivateMethodStateGuardedByBounds() 方法中的极端情况
dex-startup-optimization 导致 java.lang.VerifyError: Rejecting class
在 Android 12+ 上出现验证错误导致崩溃

Android Gradle 插件 8.1.1

已修复的问题
Dexer (D8)
Java 16 记录:equals(null) 抛出 NullPointerException
Shrinker (R8)
java.lang.VerifyError: Verifier rejected class
使用 Apache POI 库时,构建停留在 :minifyReleaseWithR8 上
启用 r8 优化时拒绝调用
java.lang.reflect.Executable 的 NoClassDefFoundError

Android Gradle 插件 8.1.2

已修复的问题
Android Gradle 插件
Android 库模块中没有 androidResources
[AGP 8.1.0] 如果 splits.abi.isEnable 和 testOptions.unitTests.isIncludeAndroidResources 都为 true,则 ./gradlew test 失败并显示“找不到清单输出”
Shrinker (R8)
如果去除空检查,Kotlin 1.9 会导致 R8 销毁 Kotlin lambda 表达式
R8 针对 play-services-measurement-21.3.0-runtime.jar 失败并显示“编译期间遇到未定义值”

Android Gradle 插件 8.1.3

已修复的问题
Android Gradle 插件
[AGP 8.1.0] 如果 splits.abi.isEnable 和 testOptions.unitTests.isIncludeAndroidResources 都为 true,则 ./gradlew test 失败并显示“找不到清单输出”
更新到 AGP 8.1 后构建失败

Android Gradle 插件 8.1.4

已修复的问题
Android Gradle 插件
当子项目的类已通过工件转换进行 dex 处理时,不要在子项目的类上运行 dexing 任务