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 不适用 25.1.8937393 安装配置其他版本的 NDK。
JDK 17 17 如需了解详情,请参阅设置 JDK 版本

补丁版本

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

Android Gradle 插件 8.0.2(2023 年 5 月)

如需查看 AGP 8.0.2 中修复的 bug 列表,请参阅 Android Studio 2022.2.1 已解决的问题

Android Gradle 插件 8.0.1(2023 年 5 月)

本次要更新包含以下 bug 修复:

修复的问题
Error:"No VersionRequirement with the given id in the table" after upgrading AGP 7.2.2 -> 7.4.0
markTypeAsLive AGP 7.4.1 发生 R8 NullPointerException
[R8 4.0.53] Android 11 发生类验证失败的严重问题

破坏性更改:模块级 build 脚本中需要命名空间

您必须在模块级 build.gradle.kts 文件(而非清单文件)中设置命名空间。从 AGP 7.3 开始,您可以开始使用 namespace DSL 属性。如需了解详情,请参阅设置命名空间

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

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

如需了解详情,请参阅问题 191813691 评论 19

破坏性更改:build 选项默认值

从 AGP 8.0 开始,为提高构建性能,这些标志的默认值已更改。如需获取调整代码以支持其中一些更改方面的帮助,请使用 AGP 升级助理 (Tools > AGP Upgrade Assistant)。升级助理会引导您更新代码以适应新行为,或设置标志以保留旧行为。

标志 新默认值 之前的默认值 备注
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 默认会生成包含非最终字段的 R 类。
android.nonTransitiveRClass true false AGP 8.0 仅为当前模块中定义的资源生成 R 类。
android.enableR8.fullMode true false AGP 8.0 默认启用 R8 完整模式。如需了解详情,请参阅 R8 完整模式

破坏性更改:强制执行的 build 选项值

从 AGP 8.0 开始,您将无法再更改这些标志的值。如果您在 gradle.properties 文件中指定这些值,系统会忽略该值,并且 AGP 会输出警告。

标志 强制执行的值 备注
android.dependencyResolutionAtConfigurationTime.warn true 如果 AGP 8.0 在配置阶段检测到配置解析,则会发出警告,因为这会对 Gradle 配置时间产生负面影响。
android.r8.failOnMissingClasses true AGP 8.0 会在使用 R8 的 build 中缺少类时失败,以确保更好地优化 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 管理中心的依赖项信息
android.enableArtProfiles true 现在,系统始终会生成基准配置文件。如需了解详情,请参阅基准配置文件
android.enableNewResourceShrinker true 默认使用新的资源缩减器实现。新的资源缩减器支持动态功能。
android.enableSourceSetPathsMap true 用于计算相对资源路径映射,以便 Gradle build 更频繁地更新。
android.cacheCompileLibResources true 现在,编译后的库资源默认可以缓存,因为 Gradle 会跟踪相对于项目位置的资源文件。需要启用 android.enableSourceSetPathsMap
android.disableAutomaticComponentCreation true AGP 8.0 默认不会创建任何 SoftwareComponent。而是仅为配置为使用发布 DSL 发布的变体创建 SoftwareComponent。

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

AGP 包含新的标志 android.settings.executionProfile。使用此标志可替换 SettingsExtension 中的默认执行配置文件。如需了解详情,请参阅“设置”插件文档

如需预览实验性标志,请参阅预览版版本说明

不支持 Kotlin 延迟属性赋值

如果您在 build 脚本中使用 Gradle 的 Kotlin DSL,请注意,Android Studio 和 AGP 8.0 不支持使用 = 运算符进行实验性属性赋值。如需详细了解此功能,请参阅版本说明文档

Build Analyzer 任务类别

从 Android Studio Flamingo 开始,Build Analyzer 针对影响构建时长的任务提供了新的默认视图。如果您的项目使用 AGP 8.0 或更高版本,Build Analyzer 会按类别对任务进行分组,而不是单独显示任务。例如,特定于 Android 资源、Kotlin 或 Dex 的任务会归为一组,然后按构建时长进行排序。这样,您就可以轻松了解哪个类别对构建时间的影响最大。展开每个类别后,系统会显示相应任务的列表。如需单独显示任务(不分组),请使用下拉菜单。

Build Analyzer 任务类别。

新设置插件

AGP 8.0.0-alpha09 引入了新的设置插件。借助设置插件,您可以在一个位置集中管理全局配置(适用于所有模块的配置),这样就不必在多个模块中复制和粘贴配置。此外,您还可以使用设置插件创建工具执行配置文件或有关如何运行工具的不同说明,并在这些配置文件之间切换。

如需使用设置插件,请在 settings.gradle 文件中应用该插件:

apply plugin 'com.android.settings'

集中管理全局配置

如需配置全局配置,请在 settings.gradle 文件中使用新的 android 块。示例如下:

android {
  compileSdk 31
  minSdk 28
  ...
}

工具执行配置文件

借助设置插件,您还可以为某些工具创建执行配置文件。执行配置文件决定了工具的运行方式;您可以根据环境选择不同的执行配置文件。在执行配置文件中,您可以为工具设置 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

需要 JDK 17 才能运行 AGP 8.0

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

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

如果使用的是独立于 Android Studio 的 AGP,请将 JAVA_HOME 环境变量-Dorg.gradle.java.home 命令行选项设置为您的 JDK 17 安装目录,以此升级 JDK 版本。

修复的问题

Android Gradle 插件 8.0.0

已修复的问题
Android Gradle 插件
MergeResources 任务中出现不稳定的构建失败
废弃了 JavaPluginConvention 和 HasConvention
新 Transform 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 的“unknown enum constant”这一新问题
即使开启了配置缓存,MergeGeneratedProguardFilesCreationAction 配置速度也很慢
[AGP] 将生成的源目录添加到 IDE 模型 (Variant API)
废弃了 JavaPluginConvention 和 HasConvention
默认情况下,不向 R8 添加 ignorewarnings
ProGuard 文件不存在时发出警告
AGP 7.3.0 会破坏 Gradle 平台项目的 Gradle 同步
apksig 库:ApkVerifier$Result.getV4SchemeSigners() 被标记为不公开
如果 coverage 未启用,则停止创建 androidJacocoAnt 配置
在库组件中使用 @IntDef 时,系统不会在 aar 中生成 annotations.zip
找不到 的通用超类型
添加 Gradle 属性版本 LINT_PRINT_STACKTRACE=true
将过时的 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 替换资源会导致系统显示“Error: Duplicate resources”消息
“debug”build 类型具有默认签名密钥,其他类型则没有
使用动态功能和资源缩减会导致运行时崩溃
“debug”build 类型具有默认签名密钥,其他类型则没有
在 lint 模型的主源代码提供程序中,将生成的源目录列为 Java 目录
Gradle 8.0-milestone-2 导致 AGP 中发生异常
针对应用和库优化清单合并
向 javadoc 生成添加了 gradle-settings-api
AGP 7.4.0-alpha09 上出现来自 javac 的“unknown enum constant”这一新问题
AGP 7.4.0-alpha09 会生成不会上传到 Firebase App Distribution 的 build
不对模块中的 lint.xml 进行 lint 任务的 UP-TO-DATE 检查
Android Gradle 插件 7.0 及更高版本和 Android 测试问题 - 找不到资源:ID
configureCMakeDebug 不稳定,并因 null 指针异常而崩溃
将项目升级到 AS2022.2.1.5,FireBasePerfPlugin 时出现 IllegalAccessError
同步失败,并显示“Collection contains no element matching the predicate”这一含义模糊的错误。
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 会破坏 Variant API,并显示“Querying the mapped value of map(provider(java.util.Set)) before task '...' has completed is not supported”
配置缓存的“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
对于 Kotlin 源代码,ResourceType lint 检查不起作用
VersionChecks 不处理 Kotlin 范围检查
封装后 InlinedApi 出现误报
有关 openInputStream 的 lint 假正例循环
[BuildTool/Lint] ChecksSdkIntAtLeast 构造函数属性
lint:PartialResults 合并无法正常运行
Android Studio 错误地将指定版本标记为过时。
AndroidDeprecationInspection.DeprecationFilter EP 从未在 android-plugin.xml 文件中注册
AccessibilityDetector lint 检查说明已过时
lint SDK_INT 检查应该了解临时性局部变量
TestMode.TYPE_ALIAS 将函数类型替换为类型别名时出错
bug:在当前代码块之外创建 ObjectAnimator 时,出现表示无法启动的错误警告 38
lint:在 mergeOnly 模式下查询应用实例会导致 NPE
NonConstantResourceId lint 规则无法顺利检测,因此无法从资源 ID 分配常量值
未显示有关视图 ID 的错误
无法对 lint 资源缓存进行反序列化处理,因此导致 lint 错误(但应为警告)
AGP Flamingo Alpha 8 Lint NewApi 脱糖回归
TypedArray#close (API 31) 未进行脱糖,但当在 try-with-resources 中使用时,AS 不显示警告
lint 不会检查调用接收器的有效类型转换
lint 仅会针对直接实现的接口(而非继承的接口)检查安全类型转换
lint 集成
基准文件目前是 lint 任务的输入和输出
缩减器 (R8)
CF 帧验证程序中的 NPE/断言错误
移除字段查询缓存后出现回归问题
在 AGP 7.4.0-beta02 中,“:app:minifyVariantWithR8”会抛出 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 - 尝试将操作加入不可推送的排队器工作列表的队列
缩减 Renderscript 代码:将 AGP 从 7.3.1 升级到 7.4.0 时会导致性能大幅下降

Android Gradle 插件 8.0.1

已修复的问题
缩减器 (R8)
Error:"No VersionRequirement with the given id in the table" after upgrading AGP 7.2.2 -> 7.4.0
markTypeAsLive AGP 7.4.1 发生 R8 NullPointerException
[R8 4.0.53] Android 11 发生类验证失败的严重问题

Android Gradle 插件 8.0.2

已修复的问题
缩减器 (R8)
R8 在 Compose 构建期间失败并抛出 ArrayIndexOutOfBoundsException
VerifyError:将 R8 与 Kotlin 1.8.20 结合使用时,验证程序会拒绝类
AGP 8 上的 R8 会破坏 Google 健身服务
如果包含的源文件信息存在与输入名称重叠的残留名称,则无法正确显示