androidandroid-gradle-pluginandroid-architecture-navigationfirebase-performanceandroid-safe-args

Unable to load class AndroidComponentsExtension after upgrading the Android Gradle Plugin 7.1


I recently downloaded Android Studio Bumblebee and it helpfully asked whether I wanted to upgrade to Android Gradle Plugin 7.1.0, the version that shipped alongside Android Studio Bumblebee.

After upgrading, I get a build error:

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

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

And looking at the idea.log file, I see:

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

Which means I can't run my app and I need to downgrade the AGP 7.0 to get things working again. How do I fix this and upgrade to Android Gradle Plugin 7.1.0?


Solution

  • Updating Navigation Safe Args

    These lines are the important ones to look at:

    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)
    

    This indicates that the error is coming from the Navigation Safe Args plugin.

    As per the Android Gradle Plugin 7.1.0 release notes:

    AGP APIs that the Navigation Safe Args Gradle plugin depend on have been removed. AGP 7.1 does not work with Navigation Safe Args versions 2.4.0-rc1 or 2.4.0, but will work with versions 2.5.0-alpha01 and 2.4.1. In the meantime, as a workaround, you can use AGP 7.1 with a snapshot build of Navigation Safe Args, Navigation 2.5.0-SNAPSHOT. To use the snapshot build, follow the snapshot instructions with build id #8054565.

    As Navigation 2.4.1 is now available, you can upgrade to that version of Navigation to gain the fix:

    Backported from Navigation 2.5.0-alpha01: Safe Args now depends on Android Gradle Plugin version 7.0.4. This means that Navigation Safe Args will no longer be compatible with Android Studio versions prior to 7.0, but is now compatible with Android Gradle Plugin 7.1.0 and higher.

    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"
    }
    

    Note that you should always use the same version of the Navigation library as the Safe Args plugin (i.e., your app should also use Navigation 2.4.1): you should not try to use the Navigation 2.4.1+ Safe Args plugin with an earlier version of Navigation (such as 2.3.5).

    Note on Firebase Perf Plugin

    Note that you might see this same error when you are using:

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

    With an idea.log of that states:

    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)
    

    As per the Firebase Perf Plugin 1.4.1 Release Notes:

    Migrated away from the deprecated Android Gradle plugin APIs.

    So you should upgrade to 1.4.1:

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