Android Gradle 插件 8.0.0 (2023 年 4 月)

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

兼容性

最低版本 默认版本 备注
Gradle 8.0 8.0 要了解详情,请参阅更新 Gradle
SDK 构建工具 30.0.3 30.0.3 安装配置 SDK 构建工具。
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 修复

已修复的问题
错误:将 AGP 7.2.2 升级到 7.4.0 后出现“No VersionRequirement with the given id in the table”
AGP 7.4.1 中 R8 的 markTypeAsLive 处出现 NullPointerException
[R8 4.0.53] 在 Android 11 上出现硬类验证失败

破坏性变更:模块级构建脚本中需要 namespace

您必须在模块级 build.gradle.kts 文件中设置 namespace,而不是在 manifest 文件中。从 AGP 7.3 开始,您可以使用 namespace DSL 属性。要了解详情,请参阅设置 namespace

迁移到 namespace DSL 时,请注意以下问题

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

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

破坏性变更:构建选项默认值

从 AGP 8.0 开始,这些标志的默认值已更改,以提高构建性能。如需获取帮助调整代码以支持其中的某些更改,请使用 AGP Upgrade Assistant(Tools > AGP Upgrade Assistant)。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 类包含非 final 字段。
android.nonTransitiveRClass true false AGP 8.0 仅为当前模块中定义的资源生成 R 类。
android.enableR8.fullMode true false 默认情况下,AGP 8.0 启用 R8 full mode。如需了解详情,请参阅 R8 full mode

破坏性变更:强制执行的构建选项值

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

标志 强制执行的值 备注
android.dependencyResolutionAtConfigurationTime.warn true AGP 8.0 会在配置阶段检测到配置解析时发出警告,因为它会对 Gradle 配置时间产生负面影响。
android.r8.failOnMissingClasses true 如果缺少类,AGP 8.0 会使使用 R8 的构建失败,以确保更好地优化 DEX。要解决此问题,您需要添加缺少的库或 -dontwarn 保留规则。如需了解详情,请参阅 R8 压缩工具中的缺少类警告
android.testConfig.useRelativePath true 当启用在单元测试中使用 Android 资源、asset 和 manifest 的支持时,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 仅为配置为使用 publishing DSL 发布的变体创建 SoftwareComponents。

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

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

要预览实验性标志,请参阅预览版发布说明

不支持 Kotlin 惰性属性赋值

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

Build Analyzer 任务类别

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

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 用户无需对其项目进行任何配置更改。

如果您需要在 Android Studio 中手动设置 AGP 使用的 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 已弃用
新 transform API 的文件位置错误且不一致
Android Gradle 插件不应使用已弃用的 GUtil.toWords(string) 函数
Android Gradle 插件不应使用已弃用的 ConfigureUtil.configure(closure, target) 函数
更新 AGP 测试以使用 KGP 1.7.20-Beta
Gradle 7.4 失败 (could not create instance of AnalyticsService)
在 AGP 7.4.0-alpha09 上,javac 出现了新的“unknown enum constant”
即使启用了配置缓存,MergeGeneratedProguardFilesCreationAction 配置也很慢
[AGP] 将生成的源目录添加到 IDE 模型 (Variant 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 artifact 被打包到 AAR 中
从 destination 属性迁移到 outputLocation 属性,以解决弃用警告并为 Gradle 9.0 做准备
设置 JavaCompile 任务时考虑 `--release` 标志
[AGP-7.3.0-beta03] ShrinkResourcesNewShrinkerTask 在 xml 声明后存在空行时失败
lintVital 目标在调试变体中默认运行
在 proguard 文件不存在时发出警告
AGP 尝试在任务执行阶段添加 kotlinOptions.freeCompilerArgs
Gradle 同步失败:同步失败:原因未知
DependencyReportTask 与配置缓存不兼容
在 build.gradle 中使用 resValue 覆盖资源导致错误:重复资源
'debug' build 类型具有默认签名密钥,其他类型没有
使用动态功能和资源压缩会导致运行时崩溃
'debug' build 类型具有默认签名密钥,其他类型没有
生成的源目录在 lint 模型的 main source provider 中被列为 Java 目录
Gradle 8.0-milestone-2 在 AGP 中导致异常
优化应用和库的 manifest 合并
将 gradle-settings-api 添加到 javadoc 生成中
在 AGP 7.4.0-alpha09 上,javac 出现了新的“unknown enum constant”
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
同步失败并出现隐晦错误“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 因测试变体中的 manifest 占位符而失败
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 的误报
Lint 对 openInputStream 的 Recycle 误报
[构建工具/Lint] ChecksSdkIntAtLeast 构造函数属性
Lint:PartialResults 合并工作不正确
Android Studio 错误地将指定的版本标记为已过时。
AndroidDeprecationInspection.DeprecationFilter EP 未在 android-plugin.xml 文件中注册
AccessibilityDetector lint 检查说明已过时
Lint SDK_INT 检查应理解临时局部变量
当 TestMode.TYPE_ALIAS 将 Function 类型替换为 typealias 时出错
Bug:当 ObjectAnimator 在当前代码块外部创建时,会出现未启动的误报警告 #38
Lint:在 mergeOnly 模式下查询 Application 实例导致的 NPE
NonConstantResourceId lint 规则无法检测到将常量值分配给资源 id
未显示 view id 上的错误
无法反序列化 lint 资源缓存导致 lint 错误(但应为警告)
AGP Flamingo Alpha 8 Lint NewApi Desugar 回归
TypedArray#close (API 31) 未去糖,但 AS 在 try-with-resources 中使用时未显示警告
Lint 不检查调用接收器的有效类型转换
Lint 仅检查直接实现的接口的安全类型转换,不检查继承的接口
Lint 集成
基准文件目前是 Lint 任务的输入和输出
压缩工具 (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 - 尝试在非可推送入队工作列表的入队器中入队操作
压缩 Renderscript 代码:将 AGP 从 7.3.1 升级到 7.4.0 时性能急剧下降

Android Gradle 插件 8.0.1

已修复的问题
压缩工具 (R8)
错误:将 AGP 7.2.2 升级到 7.4.0 后出现“No VersionRequirement with the given id in the table”
AGP 7.4.1 中 R8 的 markTypeAsLive 处出现 NullPointerException
[R8 4.0.53] 在 Android 11 上出现硬类验证失败

Android Gradle 插件 8.0.2

已修复的问题
压缩工具 (R8)
R8 在 Compose 构建过程中因 ArrayIndexOutOfBoundsException 失败
使用 Kotlin 1.8.20 和 R8 时出现 VerifyError: Verifier rejected class
AGP 8 上的 R8 破坏了 Google Fit 服务
包含与输入名称重叠的 residual 名称的源文件信息未正确表示