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

新手上路,请多包涵

我最近下载了 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?

原文由 ianhanniballake 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 3k
2 个回答

更新导航安全参数

这些行是要看的重要行:

 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)

这表明错误来自 Navigation Safe Args 插件

根据 Android Gradle Plugin 7.1.0 发行说明

Navigation Safe Args Gradle 插件所依赖的 AGP API 已被移除。 AGP 7.1 不适用于 Navigation Safe Args 版本 2.4.0-rc1 或 2.4.0 ,但适用于版本 2.5.0-alpha01 和 2.4.1。同时,作为一种解决方法,您可以将 AGP 7.1 与 Navigation Safe Args 的快照版本 Navigation 2.5.0-SNAPSHOT 结合使用。要使用快照构建,请按照构建 ID #8054565 的 快照说明 进行操作。

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

导航 2.5.0-alpha01 :Safe Args 现在依赖于 Android Gradle 插件版本 7.0.4。这意味着 Navigation Safe Args 将不再与 7.0 之前的 Android Studio 版本兼容,但现在与 Android Gradle Plugin 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 插件与更早版本一起使用导航版本(例如 2.3.5)。

关于 Firebase Perf 插件的注意事项

请注意,您在使用时可能会看到同样的错误:

 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 插件 1.4.1 发行说明

从已弃用的 Android Gradle 插件 API 迁移。

所以你应该升级到 1.4.1:

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

原文由 ianhanniballake 发布,翻译遵循 CC BY-SA 4.0 许可协议

更新: 此问题现已在 AGP 7.1.2 中修复。


  • 如果您的项目不依赖于任何使用多版本 JAR(也称为 MRJAR )的库,Firebase perf 插件 1.4.1 将仅适用于 AGP 7.1。
  • 使用 MRJAR 的流行依赖项是 moshi
  • 问题的根本原因在于 Android Gradle Plugin
  • Firebase Perf 团队发表了以下 声明

以下是一些更新:

  1. AGP v7.2.0-beta01 已于上周推出,并将与最新的性能插件 v1.4.1 使用。
  2. AGP v7.2 RC1 计划于 3 月 1 日发布,AGP v7.2 决赛计划于 3 月 9 日发布。

与此同时,这里有一些值得尝试的解决方法:

  1. 使用 perf 插件 v1.3.5 与 AGP v6.8.3 。 Perf 插件 v1.3.5 及以下与 AGP 不兼容 v7.0.0+ ;为了使 perf 插件与 AGP 兼容 v7.0.0+ ,我们必须使用新的转换 API,它会引入构建失败,即使 perf 插件过滤掉 META-INF/ 中的类 --- 来自检测的目录,AGP 仍然尝试访问该类以收集有关它的信息。但是,AGP 正在为此进行更永久的修复,我们将可以选择完全过滤掉失败的类。
  2. 等到 3 月 9 日集成最新的 perf 插件版本和 AGP。
  3. 试用带有最新 perf 插件版本的 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 ...

原文由 David Miguel 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题