Android Gradle 插件 8.0.0 (2023年4月)

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

兼容性

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

补丁版本

以下是 Android Gradle 插件 8.0 的补丁版本列表。

Android Gradle 插件 8.0.2 (2023年5月)

要查看 AGP 8.0.2 中修复的错误列表,请参阅 Android Studio 2022.2.1 已关闭的问题

Android Gradle 插件 8.0.1 (2023年5月)

此小更新包含以下错误修复

已修复的问题
升级 AGP 7.2.2 -> 7.4.0 后出现错误:“表中没有具有给定 ID 的 VersionRequirement”
AGP 7.4.1 中 R8 NullPointerException 出现在 markTypeAsLive
[R8 4.0.53] Android 11 上的硬类验证失败

重大更改:模块级构建脚本中需要命名空间

您必须在模块级 build.gradle.kts 文件中设置命名空间,而不是清单文件。从 AGP 7.3 开始,您可以开始使用 namespace DSL 属性。要了解更多信息,请参阅 设置命名空间

迁移到命名空间 DSL 时,请注意以下问题

  • 在某些情况下,以前版本的 AGP 会错误地从主命名空间或应用 ID 推断测试命名空间。如果发现您的项目的命名空间和测试命名空间相同,AGP 升级助手将阻止升级。如果升级被阻止,则需要手动更改 testNamespace 并相应地修改您的源代码。
  • 更改测试命名空间后,您的代码可能能够编译,但运行时检测测试可能会失败。如果您的检测测试源代码引用了在您的androidTest和应用程序源代码中都定义的资源,则可能会发生这种情况。

更多信息,请参见问题 #191813691 评论 #19

重大变更:构建选项默认值

从 AGP 8.0 开始,这些标志的默认值已更改,以提高构建性能。要获取有关调整代码以支持其中一些更改的帮助,请使用 AGP 升级助手(**工具 > AGP 升级助手**)。升级助手将指导您更新代码以适应新行为或设置标志以保留以前的行为。

标志 新的默认值 之前的默认值 备注
android.defaults.buildfeatures.buildconfig false true AGP 8.0 默认情况下不生成BuildConfig。您需要在需要它的项目中使用 DSL 指定此选项。
android.defaults.buildfeatures.aidl false true AGP 8.0 默认情况下不启用 AIDL 支持。您需要在需要它的项目中使用 DSL 指定此选项。计划在 AGP 9.0 中移除此标志。
android.defaults.buildfeatures.renderscript false true AGP 8.0 默认情况下不启用 RenderScript 支持。您需要在需要它的项目中使用 DSL 指定此选项。计划在 AGP 9.0 中移除此标志。
android.nonFinalResIds true false AGP 8.0 默认情况下使用非 final 字段生成R 类。
android.nonTransitiveRClass true false AGP 8.0 只为当前模块中定义的资源生成R 类。
android.enableR8.fullMode true false AGP 8.0 默认情况下启用 R8 全模式。更多详情,请参见R8 全模式

重大变更:强制执行的构建选项值

从 AGP 8.0 开始,您将无法再更改这些标志的值。如果您在gradle.properties文件中指定它们,则该值将被忽略,并且 AGP 将打印警告。

标志 强制值 备注
android.dependencyResolutionAtConfigurationTime.warn true 如果 AGP 检测到在配置阶段进行配置解析,因为它会对 Gradle 配置时间产生负面影响,则会发出警告。
android.r8.failOnMissingClasses true 如果使用 R8 的构建缺少类,AGP 8.0 将使构建失败,以确保更好的 DEX 优化。要解决此问题,您需要添加缺少的库或-dontwarn 保留规则。更多详情,请参见R8 压缩器中的缺少类警告
android.testConfig.useRelativePath true 启用在单元测试中使用 Android 资源、资产和清单的支持后,AGP 8.0 将生成一个test_config.properties文件,其中仅包含相对路径。这确保 Android 单元测试始终可以使用 Gradle 构建缓存。
android.useNewJarCreator true AGP 在创建 JAR 文件时使用 Zipflinger 库来提高构建性能。
android.bundletool.includeRepositoriesInDependencyReport true 启用在 AAB 和 APK 中添加 SDK 依赖项信息后,AGP 8.0 还将项目存储库列表添加到此信息中。要了解更多信息,请参见Play Console 的依赖项信息
android.enableArtProfiles true 现在始终生成基线配置文件。详情请参见基线配置文件
android.enableNewResourceShrinker true 默认情况下使用新的资源压缩器实现。新的资源压缩器包括对动态功能的支持。
android.enableSourceSetPathsMap true 用于计算相对资源路径映射,以便 Gradle 构建更频繁地保持最新状态。
android.cacheCompileLibResources true 现在可以默认缓存已编译的库资源,因为 Gradle 会跟踪相对于项目位置的资源文件。需要启用android.enableSourceSetPathsMap
android.disableAutomaticComponentCreation true AGP 8.0 默认情况下不创建 SoftwareComponent。相反,AGP 只为使用发布 DSL 配置为发布的变体创建 SoftwareComponents。

用于执行配置文件的新稳定标志

AGP 包含新的标志android.settings.executionProfile。使用此标志可以覆盖SettingsExtension中的默认执行配置文件。要了解更多信息,请参见settings 插件文档

要预览实验性标志,请参见预览版发行说明

不支持 Kotlin 延迟属性赋值

如果您正在为构建脚本使用 Gradle 的 Kotlin DSL,请注意 Android Studio 和 AGP 8.0 不支持使用=运算符进行实验性属性赋值。有关此功能的更多信息,请参见发行说明文档

构建分析器任务类别

从 Android Studio Flamingo 开始,构建分析器对影响构建持续时间的任务具有新的默认视图。如果您的项目使用 AGP 8.0 或更高版本,构建分析器会按类别对任务进行分组,而不是单独显示任务。例如,特定于 Android 资源、Kotlin 或 Dexing 的任务将分组在一起,然后按构建持续时间排序。这使得很容易知道哪个类别对构建时间的影响最大。展开每个类别将显示相应任务的列表。要单独显示任务(不分组),请使用**按分组**下拉菜单。

Build Analyzer task categories.

新的 settings 插件

AGP 8.0.0-alpha09 引入了新的 settings 插件。settings 插件允许您在一个位置集中管理全局配置(应用于所有模块的配置),因此您无需在多个模块中复制和粘贴配置。此外,您可以使用 settings 插件创建工具*执行配置文件*,或运行工具的不同指令,并在它们之间切换。

要使用 settings 插件,请在settings.gradle文件中应用该插件

apply plugin 'com.android.settings'

集中管理全局配置

要配置全局配置,请在settings.gradle文件中使用新的android块。这是一个示例

android {
  compileSdk 31
  minSdk 28
  ...
}

工具执行配置文件

settings 插件还允许您为某些工具创建执行配置文件。执行配置文件决定如何运行工具;您可以根据环境选择不同的执行配置文件。在执行配置文件中,您可以为工具设置 JVM 参数并将其配置为在单独的进程中运行。目前,仅支持R8 工具

settings.gradle文件中创建执行配置文件并设置默认执行配置文件,如下例所示

android {
  execution {
    profiles {
      high {
        r8 {
          jvmOptions += ["-Xms2048m", "-Xmx8192m", "-XX:+HeapDumpOnOutOfMemoryError"]
          runInSeparateProcess true
        }
      }
      low {
        r8 {
          jvmOptions += ["-Xms256m", "-Xmx2048m", "-XX:+HeapDumpOnOutOfMemoryError"]
          runInSeparateProcess true
        }
      }
      ci {
        r8.runInSeparateProcess false
      }
    }
    defaultProfile "low"
  }
}

要覆盖默认配置文件,请使用gradle.properties文件中的android.experimental.settings.executionProfile属性选择不同的配置文件

android.experimental.settings.executionProfile=high

您也可以使用命令行设置此属性,这允许您设置不同的工作流程。例如,如果您有持续集成工作流程,您可以使用命令行更改执行配置文件,而无需更改settings.gradle文件

./gradlew assembleRelease \
  -Pandroid.experimental.settings.executionProfile=ci

运行 AGP 8.0 需要 JDK 17

使用 Android Gradle 插件 8.0 构建应用程序时,现在需要 JDK 17 来运行 Gradle。Android Studio Flamingo 捆绑了 JDK 17 并默认配置 Gradle 使用它,这意味着大多数 Android Studio 用户无需对其项目进行任何配置更改。

如果您需要手动设置 AGP 在 Android Studio 中使用的 JDK 版本,则需要使用 JDK 17 或更高版本。

在独立于 Android Studio 使用 AGP 时,请通过设置JAVA_HOME环境变量-Dorg.gradle.java.home命令行选项将其设置为 JDK 17 的安装目录来升级 JDK 版本。

已修复的问题

Android Gradle 插件 8.0.0

已修复的问题
Android Gradle 插件
MergeResources 任务中不稳定的构建失败
JavaPluginConvention 和 HasConvention 已弃用
新的转换 API 的文件位置错误且不一致
Android Gradle 插件不应使用已弃用的 GUtil.toWords(string) 函数
Android Gradle 插件不应使用已弃用的 ConfigureUtil.configure(closure, target) 函数
更新 AGP 测试以使用 KGP 1.7.20-Beta
Gradle 7.4 失败(无法创建 AnalyticsService 的实例)
AGP 7.4.0-alpha09 上 javac 的新“未知枚举常量”
即使启用配置缓存,MergeGeneratedProguardFilesCreationAction 配置也很慢
[AGP] 将生成的源目录添加到 IDE 模型(变体 API)
JavaPluginConvention 和 HasConvention 已弃用
默认情况下不要将 ignorewarnings 添加到 R8
Proguard 文件不存在时发出警告
AGP 7.3.0 中断 Gradle 平台项目的 Gradle 同步
apksig 库:ApkVerifier$Result.getV4SchemeSigners() 被标记为私有
如果未启用代码覆盖率,则停止创建 androidJacocoAnt 配置
在库组件中使用 @IntDef 不会在 aar 中生成 annotations.zip
无法找到的公共超类型
添加 LINT_PRINT_STACKTRACE=true 的 Gradle 属性版本
过时的 prefab 工件被打包到 AAR 中
从 destination 属性迁移到 outputLocation 属性以解决弃用警告并为 Gradle 9.0 做准备
在设置 JavaCompile 任务时考虑 `--release` 标志
[AGP-7.3.0-beta03] 当 xml 声明后有一行空行时,ShrinkResourcesNewShrinkerTask 失败
默认情况下在调试变体中运行 lintVital 目标
Proguard 文件不存在时发出警告
AGP 尝试在任务执行阶段添加 kotlinOptions.freeCompilerArgs
Gradle 同步失败:同步失败:原因未知
DependencyReportTask 与配置缓存不兼容
在 build.gradle 中使用 resValue 覆盖资源会导致错误:重复资源
“debug”构建类型具有默认签名密钥,其他构建类型没有
使用动态功能和资源压缩会导致运行时崩溃
“debug”构建类型具有默认签名密钥,其他构建类型没有
生成的源目录在 lint 模型的主源提供程序中列为 Java 目录
Gradle 8.0-milestone-2 导致 AGP 中出现异常
优化应用程序和库的清单合并
将 gradle-settings-api 添加到 javadoc 生成中
AGP 7.4.0-alpha09 上 javac 的新“未知枚举常量”
AGP 7.4.0-alpha09 生成的构建无法上传到 Firebase App Distribution
模块中的 lint.xml 未被考虑用于 lint 任务的 UP-TO-DATE 检查
Android Gradle Plugin 7.0+ 和 Android 测试问题:找不到资源:id
configureCMakeDebug 偶尔因空指针异常而崩溃
将项目升级到 AS2022.2.1.5 时出现 IllegalAccessError,FireBasePerfPlugin
同步失败,并出现神秘错误“集合不包含与谓词匹配的元素”。
Instrumentation API 不会转换本地文件依赖项
更新到 7.4 Beta 1 时出现 `AnnotationProcessorOptions.arguments are queried` 错误
将 Gradle 公共插件移动到 gradle-api 并删除 BasePlugin.getExtension
r8.jvmArgs 未被使用
AGP 要求 JDK17 作为最低版本
AGP 8.0.0 A8 破坏了基线配置文件
在 AGP 8.0 中将 CheckAarMetadataTask 消息中的 'compileSdkVersion' 更改为 'compileSdk'
AGP 7.4.0-rc01 使用“在任务 '...' 完成之前查询 map(provider(java.util.Set)) 的映射值不受支持”破坏了 Variant API
`com.android.build.gradle.tasks.ShaderCompile` 与配置缓存存在问题
使用 AGP API 添加到 Java 资源会破坏配置缓存
Lint 插件不是 gradle-api 的一部分
DexingFileDependenciesTask.outputKeepRules 是一个目录,但被标记为 OutputFile
升级到 AGP 7.4 会导致 StackOverflowError
processDebugUnitTestManifest 对于测试变体使用清单占位符时失败
Lint 在没有依赖项的情况下访问源集信息
构建错误引用了 API 级别 34,该级别不存在
当没有更新的插件时,“我们建议使用更新的 Android Gradle 插件”
android.injected.testOnly=false 不起作用
Dexer (D8)
将 AS Canary 6 升级到 7 后,与全局合成相关的 Dex 合并错误
将 Kotlin 元数据库更新到 0.6.0 版本
在 API 级别 28-30 上似乎需要 JDK-8272564 的解决方法
Lint
ResourceType lint 检查对 Kotlin 源不起作用
VersionChecks 无法处理 Kotlin 范围检查
包装时出现 InlinedApi 的误报
关于 openInputStream 的 Lint 误报 Recycle
[BuildTool/Lint] 检查 ChecksSdkIntAtLeast 构造函数属性
Lint:PartialResults 合并工作不正确
Android Studio 错误地将指定版本标记为过期。
AndroidDeprecationInspection.DeprecationFilter EP 从未在 android-plugin.xml 文件中注册
AccessibilityDetector lint 检查说明已过期
Lint SDK_INT 检查应该理解临时局部变量
TestMode.TYPE_ALIAS 将 Function 类型替换为 typealias 时出错
错误:当 ObjectAnimator 在当前代码块之外创建时,会出现关于未启动它的误报警告 #38
Lint:由于在 mergeOnly 模式下查询 Application 实例导致 NPE
NonConstantResourceId lint 规则无法检测到从资源 ID 分配常量值
不显示视图 ID 的错误
无法反序列化 lint 资源缓存会导致 lint 错误(但应该是警告)
AGP Flamingo Alpha 8 Lint NewApi Desugar 回归
TypedArray#close (API 31) 未反糖化,但在 try-with-resources 中使用时,AS 不会显示警告
Lint 不检查调用接收者的有效强制转换
Lint 只检查直接实现的接口的安全强制转换,而不是继承的接口
Lint 集成
基线文件当前是 Lint 任务的输入和输出
Shrinker (R8)
CF 框架验证器中的 NPE/断言错误
删除字段查找缓存后的回归
`:app:minifyVariantWithR8` 在 AGP 7.4.0-beta02 中抛出 NullPointerException
R8:使用 -allowaccessmodification 时出现 ClassNotFoundException
添加对元数据中上下文接收者的支持
java.lang.VerifyError: Verifier rejected class androidx.compose.ui.graphics.colorspace.o: void androidx.compose.ui.graphics.colorspace.o.(java.lang.Object) failed to verify: void androidx.compose.ui.graphics.colorspace.o.(java.lang.Object): [0x0] cannot access instance field java.lang.Object androidx.compose.ui.graphics.colorspace.n.a from object of type Precise Reference: androidx.compose.ui.graphics.colorspace.o
AGP 7.4.0/7.3.1 - 尝试在非可推送 enqueuer 工作列表中排队操作
缩小 Renderscript 代码:将 AGP 从 7.3.1 升级到 7.4.0 时性能大幅下降

Android Gradle 插件 8.0.1

已修复的问题
Shrinker (R8)
升级 AGP 7.2.2 -> 7.4.0 后出现错误:“表中没有具有给定 ID 的 VersionRequirement”
AGP 7.4.1 中 R8 NullPointerException 出现在 markTypeAsLive
[R8 4.0.53] Android 11 上的硬类验证失败

Android Gradle 插件 8.0.2

已修复的问题
Shrinker (R8)
R8 在 Compose 构建期间使用 ArrayIndexOutOfBoundsException 失败
VerifyError: 使用 R8 和 Kotlin 1.8.20 时,类验证器拒绝类
AGP 8 上的 R8 破坏了 Google Fit 服务
包含具有重叠输入名称的残余名称的源文件信息表示不正确