Android Gradle Plugin 8.1.0(2023 年 7 月)

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

兼容性

最低版本 默认版本 备注
Gradle 8.0 8.0 如需了解详情,请参阅更新 Gradle
SDK Build Tools 33.0.1 33.0.1 安装配置 SDK Build Tools。
NDK 不适用 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 plugin 会根据您的项目资源生成 LocaleConfig 文件,并在最终清单文件中添加对该文件的引用,因此您不再需要手动操作。AGP 会使用应用模块和任何库模块依赖项的 res 文件夹中的资源来确定要包含在 LocaleConfig 文件中的区域设置。

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

要启用自动按应用语言支持,请指定一个默认区域设置

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

    例如,如果您的默认区域设置为美式英语

        unqualifiedResLocale=en-US
        

AGP 会将此默认区域设置以及您使用 res 文件夹中的 values-* 目录指定的任何替代区域设置添加到自动生成的 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 升级助手(Tools > AGP Upgrade Assistant)。

要使用未压缩的原生库,请从清单中移除 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 启用核心库 desugaring,而不会影响生成的 AAR,例如通过 lint。我们计划最终在 Variant API 中支持此行为。
android.experimental.testOptions.managedDevices.customDevice AGP 8.0 false 如果启用此标志,Gradle Managed Devices 将允许使用插件提供的用户自定义设备类型。如果要使用 Firebase Test Lab 插件,必须启用此标志。
android.lint.printStackTrace AGP 8.0 false 如果启用此标志,Android lint 在崩溃时会打印堆栈跟踪。此标志与 LINT_PRINT_STACKTRACE 环境变量具有相同的功能。
android.experimental.testOptions.managedDevices.maxConcurrentDevices AGP 8.0 指定任何时间点最多可同时处于活动状态的 Gradle Managed Devices (AVD) 的数量。如果值为 0 或负数,则设备数量没有上限。
android.experimental.testOptions.installApkTimeout AGP 8.0 安装 APK 的超时时长(以秒为单位)。如果值为 0 或负数,UTP 会将其设置为默认值。

已解决的问题

Android Gradle plugin 8.1.0

已解决的问题
Android Gradle Plugin
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 level 34
设置 JVM toolchain 不影响 JavaCompile targetCompatibility 的值
带有通配符域的 Navigation deepLink 条目在合并清单中没有 android:host 属性
自 Android Gradle Plugin 8.1 起,processDebugMainManifest 任务失败
我们可以移除 AnalyticsRecordingTask 吗?
output-metadata.json 的内容不一致
我们可以移除 AnalyticsRecordingTask 吗?
output-metadata.json 的内容不一致
设置 JVM toolchain 不影响 JavaCompile targetCompatibility 的值
带有通配符域的 Navigation deepLink 条目在合并清单中没有 android:host 属性
自 Android Gradle Plugin 8.1 起,processDebugMainManifest 任务失败
Android Studio 不遵循 STUDIO_GRADLE_JDK 环境变量
自定义源类型应创建多变体 sourcesets
DependenciesInfoBuilder 需要 API 更新 + 文档
使用 Java 11 目标进行 DexingNoClasspathTransform (minSdk >= 24) 因缺少嵌套成员而失败
DslExtension.Builder.extendProjectWith() 在 Groovy 中无法按描述工作
添加不使用 kotlin.Pair 的 VariantSelector.withFlavor API
AndroidLintAnalysisTask (:lintAnalyzeExternalRelease) 由于 proguard.txt 已更改导致缓存未命中
应用合并清单包含来自依赖项的 extractNativeLibs 和 useEmbeddedDex 属性
AGP:将 AIDL 工具路径和框架 AIDL 文件作为公共 API 暴露
请求:让 IDE 为“PermittedSubclasses requires ASM9”提供修复方案
错误:“启用 KSP 并改用此依赖项的 KSP 处理器”仅跳转到网站
由于 .gradle/.android/analytics.settings,Gradle 8.1 破坏了配置缓存
agp 8.1.0 中的 generateLocaleConfig 使用非确定性排序,破坏了可重现构建
Dexer (D8)
最近更新后核心库 desugaring 导致应用崩溃。
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) 未 desugar,但在 try-with-resources 中使用时 AS 不显示警告
错误:关于“'BC' provider 已废弃,并且自 Android P 起...”的误报警告
将 Kotlin 升级到 1.8.0 后,Lint 对 remember 产生误报
对带有枚举参数的方法中执行的 SDK_INT 检查产生 Lint 误报警告
TypographyQuotes lint 检查对转义引号不起作用
TrustAllX509TrustManager lint 检查错误地将扩展 X509TrustManager 的接口标记为问题
仅格式化替换修复中插入的代码
Lint: intention preview 对 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 plugin 8.1.1

已解决的问题
Dexer (D8)
Java 16 Records:equals(null) 抛出 NullPointerException
Shrinker (R8)
java.lang.VerifyError: Verifier rejected class
使用 Apache POI 库时,构建卡在 :minifyReleaseWithR8 任务
启用 r8 优化时拒绝调用
java.lang.reflect.Executable 的 NoClassDefFoundError

Android Gradle plugin 8.1.2

已解决的问题
Android Gradle Plugin
androidResources 在 Android 库模块中不可用
[AGP 8.1.0] 如果 splits.abi.isEnable 和 testOptions.unitTests.isIncludeAndroidResources 都为 true,则 ./gradlew test 会失败并提示“Unable to find manifest output”
Shrinker (R8)
如果移除了空检查,Kotlin 1.9 会导致 Kotlin lambda 被 R8 破坏
R8 在编译 play-services-measurement-21.3.0-runtime.jar 时失败,并提示“Undefined value encountered during compilation”

Android Gradle plugin 8.1.3

已解决的问题
Android Gradle Plugin
[AGP 8.1.0] 如果 splits.abi.isEnable 和 testOptions.unitTests.isIncludeAndroidResources 都为 true,则 ./gradlew test 会失败并提示“Unable to find manifest output”
更新到 AGP 8.1 后构建失败

Android Gradle plugin 8.1.4

已解决的问题
Android Gradle Plugin
当子项目的类已通过 artifact transform 进行 dexing 时,不要在其上运行 dexing 任务