升级Android Gradle插件7.1后无法加载AndroidComponentsExtension类

145

我最近下载了Android Studio Bumblebee,它很贴心地询问我是否想升级到Android Gradle Plugin 7.1.0,这是与Android Studio Bumblebee一起发布的版本。

在升级后,我遇到了一个构建错误:

Unable to load class 'com.android.build.api.extension.AndroidComponentsExtension'.

This is an unexpected error. Please file a bug containing the idea.log file.

查看idea.log文件,我看到:

A problem occurred evaluating project ':main'.
    at org.gradle.initialization.exception.DefaultExceptionAnalyser.transform(DefaultExceptionAnalyser.java:103)
    ...
Caused by: org.gradle.api.GradleScriptException: A problem occurred evaluating project ':main'.
    at org.gradle.groovy.scripts.internal.DefaultScriptRunnerFactory$ScriptRunnerImpl.run(DefaultScriptRunnerFactory.java:93)
    ...
Caused by: java.lang.NoClassDefFoundError: com/android/build/api/extension/AndroidComponentsExtension
    at androidx.navigation.safeargs.gradle.SafeArgsPlugin.apply(SafeArgsPlugin.kt:73)
    at androidx.navigation.safeargs.gradle.SafeArgsPlugin.apply(SafeArgsPlugin.kt:42)
    ...
Caused by: java.lang.ClassNotFoundException: com.android.build.api.extension.AndroidComponentsExtension

这意味着我无法运行我的应用程序,我需要降级AGP 7.0才能让事情重新正常运作。我该如何解决这个问题并升级到Android Gradle Plugin 7.1.0?

10个回答

182

更新导航安全参数

以下是需要重点关注的几行代码:

Caused by: java.lang.NoClassDefFoundError: com/android/build/api/extension/AndroidComponentsExtension
    at androidx.navigation.safeargs.gradle.SafeArgsPlugin.apply(SafeArgsPlugin.kt:73)
    at androidx.navigation.safeargs.gradle.SafeArgsPlugin.apply(SafeArgsPlugin.kt:42)

这表明错误来自导航安全参数插件

根据Android Gradle插件7.1.0发布说明:

导航安全参数Gradle插件依赖的AGP API已被删除。 AGP 7.1不支持Navigation Safe Args版本2.4.0-rc1或2.4.0,但支持版本2.5.0-alpha01和2.4.1。同时,作为解决方法,您可以使用Navigation Safe Args的快照构建版本Navigation 2.5.0-SNAPSHOT与AGP 7.1一起使用。要使用快照构建,请按照快照说明中的构建ID#8054565进行操作。

现在Navigation 2.4.1可用,您可以升级到该版本的Navigation以获得修复:

Navigation 2.5.0-alpha01回溯:Safe Args现在依赖于Android Gradle插件版本7.0.4。这意味着Navigation Safe Args将不再与Android Studio 7.0之前的版本兼容,但现在与Android Gradle插件7.1.0及更高版本兼容。

dependencies {
    classpath 'com.android.tools.build:gradle:7.1.0'

    // Update this line to use 2.4.1
    classpath "androidx.navigation:navigation-safe-args-gradle-plugin:2.4.1"
}

请注意,您应始终使用与Safe Args插件相同版本的Navigation库(即,您的应用程序也应使用Navigation 2.4.1),不应尝试使用Navigation 2.4.1+ Safe Args插件与Navigation早期版本(如2.3.5)。

Firebase性能插件说明

请注意,在使用以下内容时可能会出现相同错误:

classpath "com.google.firebase:perf-plugin:1.4.0"

如果 idea.log 中记录了以下信息:

Caused by: java.lang.NoClassDefFoundError: com/android/build/api/extension/AndroidComponentsExtension
    at com.google.firebase.perf.plugin.FirebasePerfClassVisitorFactory.registerForProject(FirebasePerfClassVisitorFactory.java:54)
    at com.google.firebase.perf.plugin.FirebasePerfPlugin.perform(FirebasePerfPlugin.java:145)
    at com.google.firebase.perf.plugin.FirebasePerfPlugin.lambda$apply$0(FirebasePerfPlugin.java:107)

根据Firebase Perf Plugin 1.4.1 发布说明

已迁移禁用的 Android Gradle 插件 API。

因此,您应该升级到1.4.1版本:
classpath "com.google.firebase:perf-plugin:1.4.1"

4
是的,但 Firebase Perf 插件 1.4.* 与最新的 Moshi 不兼容。已知该 bug,修复将在 Chipmunk 中进行。1.3.5 在 Android Gradle Plugin 7.1.0 之前运行良好。因此,在最新的“稳定” AS 中无法使用 moshi 与 Firebase Perf 插件。这很棒吗?https://github.com/square/moshi/issues/1463 - Jakoss
@Jakoss - 顺便说一句,Firebase问题的这条评论似乎暗示Firebase Perf 1.3.2与Moshi和AGP 7.1都可以正常工作。值得一试。 - ianhanniballake
2
是的,它确实可以工作,这让我们有点松了口气,但仍然非常奇怪,我们必须等待花栗鼠与最新的firebase性能插件配对。对于维护较大应用程序的团队来说,使用不稳定的频道并不是一个选项。 - Jakoss
用2.5.0-alpha01替换2.4.0对我有用。谢谢。 - Hamid Javed
2
对于 Hilt 问题,请使用 hilt_version = '2.40.5'。 - Ashish Dwivedi
在我的情况下,升级 Hilt 和 Firebase Perf 插件版本解决了问题。 - Fakher

16

在我的情况下,问题出在版本上。我已经更新到了最新的2.40.5版本,现在它可以工作了。

如果你的项目中没有依赖项,找到一个在gradle同步期间抛出异常的库的最佳方法是检查文件。

android studio hint

然后像这样找到一些内容。

Caused by: java.lang.NoClassDefFoundError: com/android/build/api/extension/AndroidComponentsExtension
    at dagger.hilt.android.plugin.HiltGradlePlugin.configureBytecodeTransformASM(HiltGradlePlugin.kt:257)

祝你编码愉快 :)


在我的情况下,我不得不升级Hilt和Navigation组件的版本。 - Saeed Darvish

13

更新:该问题现在已在AGP 7.1.2中得到修复。


Firebase性能插件1.4.1只能在项目没有使用多重版本JAR(也称为MRJARs)的库的情况下与AGP 7.1一起使用。一个使用MRJARs的流行依赖项是moshi。问题的根本原因在于Android Gradle Plugin。Firebase Perf团队发表了以下statement
以下是一些更新:
  1. 上周发布了AGP v7.2.0-beta01,可以与最新的perf插件v1.4.1一起使用。
  2. AGP v7.2 RC1计划于3月1日发布,AGP v7.2 final计划于3月9日发布。
同时,以下是一些值得尝试的解决方法:
  1. 使用perf插件v1.3.5和AGP v6.8.3。perf插件v1.3.5及以下版本不兼容AGP v7.0.0+。为了使perf插件与AGP v7.0.0+兼容,我们必须使用新的transform API,这会引入构建失败,即使perf插件从仪器中的META-INF/目录中过滤出类,AGP仍然会尝试访问该类以收集有关它的信息。但是,AGP正在解决这个问题,我们将有一个选项完全过滤掉失败的类。
  2. 等到3月9日再集成最新的perf插件版本和AGP。
  3. 尝试使用最新的perf插件版本和beta版AGP,并在3月9日后切换到生产版本。
堆栈跟踪:
org.gradle.api.GradleScriptException: A problem occurred evaluating project ':app'.
    at org.gradle.groovy.scripts.internal.DefaultScriptRunnerFactory$ScriptRunnerImpl.run(DefaultScriptRunnerFactory.java:93)
    at org.gradle.configuration.DefaultScriptPluginFactory$ScriptPluginImpl.lambda$apply$0(DefaultScriptPluginFactory.java:133)
    at ...
Caused by: java.lang.NoClassDefFoundError: com/android/build/api/extension/AndroidComponentsExtension
    at com.google.firebase.perf.plugin.FirebasePerfClassVisitorFactory.registerForProject(FirebasePerfClassVisitorFactory.java:54)
    at com.google.firebase.perf.plugin.FirebasePerfPlugin.perform(FirebasePerfPlugin.java:145)
    at com.google.firebase.perf.plugin.FirebasePerfPlugin.lambda$apply$0(FirebasePerfPlugin.java:107)
    at org.gradle.api.internal.plugins.DefaultPluginManager$2.execute(DefaultPluginManager.java:258)
    at ...

2
将 Firebase Performance 插件更新到 1.4.1 版本对我起了作用。 - Arthur Bertemes
只有在您的项目不依赖于使用MRJARs的任何库时,它才能正常工作。我已经更新了答案,并提供了更多详细信息。 - David Miguel

6

您可以做到这件事。对我非常有效。

// Top-level build file where you can add configuration options common to all sub-projects/modules.
plugins {
    id 'com.android.application' version '7.1.0' apply false
    id 'com.android.library' version '7.1.0' apply false
    id 'org.jetbrains.kotlin.android' version '1.6.10' apply false
    id "com.google.dagger.hilt.android" version '2.41' apply false
    id 'androidx.navigation.safeargs.kotlin' version '2.4.0' apply false // use this one
//    classpath "androidx.navigation:navigation-safe-args-gradle-plugin:2.4.0" (will not work now)

}

task clean(type: Delete) {
    delete rootProject.buildDir
}

你必须使用先前在app文件夹的build.gradle中使用的插件ID(而不是项目build.gradle中使用的插件ID)。 - Nafis Kabbo
你从哪里获取这些版本号的? - Bitwise DEVS
@BitwiseDEVS 项目的 build.gradle 依赖块的版本号与之前版本相同。 - Nafis Kabbo

2

在我的情况下,我遇到了secrets-gradle-plugin的问题。最初我使用的是版本2.0.1(最新版本)。降级到1.3.0后,它对我起作用了。

在项目的根build.gradle文件中:

dependencies {
        classpath 'com.google.android.libraries.mapsplatform.secrets-gradle-plugin:secrets-gradle-plugin:1.3.0'
}

在应用程序级别的 build.gradle 文件中:
plugins {
    id 'com.android.application'
       id 'com.google.android.libraries.mapsplatform.secrets-gradle-plugin'
}

2

将Hilt升级到“2.40.5”和firebase:perf-plugin升级到“1.4.1”对我很有帮助。


0
I fixed the issue by downgrading the version of navigation to 2.3.5

    def nav_version = "2.3.5"

经过测试,使用 Navigation 2.4.0 和 AGP 7.0.4 可以正常工作。

虽然这解决了同步问题,但由于使用了已弃用的API,导致出现其他警告 - API 'BaseVariant.getApplicationIdTextResource'已过时,已被替换为'VariantProperties.applicationId'。它将在Android Gradle插件的7.0版本中被删除。有关更多信息,请参见TBD。 - 我特别喜欢该消息中的“参见TBD”部分,表明这很可能是危险领域,在任何时候都可能发生故障。 - ianhanniballake

0

虽然这个链接可能回答了问题,但最好在此处包含答案的基本部分并提供参考链接。如果链接页面更改,仅有链接的答案可能会失效。-【来自审查】 - abdo Salm

0

在我的情况下,我需要更新地图插件...

Updated Maps Plugin


0

我在我的项目中实现Hilt时,遇到了完全相同的问题。后来发现这是一个插件兼容性问题,只需更新到最新版本即可解决该问题。

奇怪的是,IDE并没有提示有新版本可用,所以我不得不手动搜索。

在项目的build.gradle文件中:

我更改了这一行:

classpath "com.google.dagger:hilt-android-gradle-plugin:2.35"

对于这个:

classpath "com.google.dagger:hilt-android-gradle-plugin:2.45"

问题已解决。

完整文件:

buildscript {
repositories {
    google()
    mavenCentral()
}
dependencies {
    classpath "androidx.navigation:navigation-safe-args-gradleplugin:2.5.3"
    classpath "com.google.dagger:hilt-android-gradle-plugin:2.45"
   }
}

plugins {
id 'com.android.application' version '7.4.1' apply false
id 'com.android.library' version '7.4.1' apply false
id 'org.jetbrains.kotlin.android' version '1.7.21' apply false

}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接