Circular dependency between the following tasks: :app:processDebugResources \--- :app:processDebugResources (*)

Hello Experts,

I am new to Android development & Gradle.

I was working on Android Studio project & had this error

Circular dependency between the following tasks:
:app:processDebugResources
\--- :app:processDebugResources (*)

* Try:
> Run with --stacktrace option to get the stack trace.
> Run with --info or --debug option to get more log output.
> Run with --scan to get full insights.
> Get more help at https://help.gradle.org.
BUILD FAILED in 569ms

When Running with --debug option

Circular dependency between the following tasks:
:app:processDebugResources
\--- :app:processDebugResources (*)

* Try:
> Run with --stacktrace option to get the stack trace.
> Run with --scan to get full insights.
> Get more help at https://help.gradle.org.
BUILD FAILED in 1s
Build operation 'Build finished for file system watching' started
Completing Build operation 'Build finished for file system watching'
Build operation 'Build finished for file system watching' completed
Releasing file lock for cache directory md-supplier (/home/srj/.gradle/caches/8.4/md-supplier)
Releasing lock on cache directory md-supplier (/home/srj/.gradle/caches/8.4/md-supplier).
Releasing file lock for Build Output Cleanup Cache (/home/srj/AndroidStudioProjects/MyTCPpro/.gradle/buildOutputCleanup)
Releasing lock on Build Output Cleanup Cache (/home/srj/AndroidStudioProjects/MyTCPpro/.gradle/buildOutputCleanup).
Releasing file lock for cache directory md-rule (/home/srj/.gradle/caches/8.4/md-rule)
Releasing lock on cache directory md-rule (/home/srj/.gradle/caches/8.4/md-rule).
Resolution result cache closed. Cache reads: 0, disk reads: 0 (avg: 0.0 secs, total: 0.0 secs)
Resolution result cache closed. Cache reads: 4, disk reads: 1 (avg: 0.005 secs, total: 0.005 secs)
Deleted 2 resolution results binary files in 0.0 secs
Completing Build operation 'Run build'
Build operation 'Run build' completed
Daemon worker Thread 6: released lock on worker lease
Stopping 0 deployment handles
Stopped deployment handles
VCS Checkout Cache (/home/srj/AndroidStudioProjects/MyTCPpro/.gradle/vcs-1) has last been fully cleaned up 23 hours ago
Cache VCS Checkout Cache (/home/srj/AndroidStudioProjects/MyTCPpro/.gradle/vcs-1) was closed 0 times.
Cache VCS metadata (/home/srj/AndroidStudioProjects/MyTCPpro/.gradle/8.4/vcsMetadata) was closed 0 times.
Releasing file lock for checksums cache (/home/srj/AndroidStudioProjects/MyTCPpro/.gradle/8.4/checksums)
Releasing lock on checksums cache (/home/srj/AndroidStudioProjects/MyTCPpro/.gradle/8.4/checksums).
Releasing file lock for file hash cache (/home/srj/AndroidStudioProjects/MyTCPpro/.gradle/8.4/fileHashes)
Releasing lock on file hash cache (/home/srj/AndroidStudioProjects/MyTCPpro/.gradle/8.4/fileHashes).
Releasing file lock for dependencies-accessors (/home/srj/AndroidStudioProjects/MyTCPpro/.gradle/8.4/dependencies-accessors)
Releasing lock on dependencies-accessors (/home/srj/AndroidStudioProjects/MyTCPpro/.gradle/8.4/dependencies-accessors).
dependencies-accessors (/home/srj/AndroidStudioProjects/MyTCPpro/.gradle/8.4/dependencies-accessors) has last been fully cleaned up 23 hours ago
The daemon has finished executing the build.

My build.gradle app module

plugins {
    alias(libs.plugins.androidApplication)
    alias(libs.plugins.jetbrainsKotlinAndroid)
}

android {
    namespace = "com.srj.mytcppro"
    compileSdk = 34

    defaultConfig {
        applicationId = "com.srj.mytcppro"
        minSdk = 26
        targetSdk = 34
        versionCode = 1
        versionName = "1.0"

        testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
    }

    buildTypes {
        release {
            isMinifyEnabled = false
            proguardFiles(
                getDefaultProguardFile("proguard-android-optimize.txt"),
                "proguard-rules.pro"
            )
        }
    }
    compileOptions {
        sourceCompatibility = JavaVersion.VERSION_1_8
        targetCompatibility = JavaVersion.VERSION_1_8
    }
    kotlinOptions {
        jvmTarget = "1.8"
    }
    buildFeatures {
        viewBinding = true
    }
}

dependencies {

    implementation(libs.androidx.core.ktx)
    implementation(libs.androidx.appcompat)
    implementation(libs.material)
    implementation(libs.androidx.constraintlayout)
    implementation(libs.androidx.lifecycle.livedata.ktx)
    implementation(libs.androidx.lifecycle.viewmodel.ktx)
    implementation(libs.androidx.navigation.fragment.ktx)
    implementation(libs.androidx.navigation.ui.ktx)
    implementation(project(":app"))
    testImplementation(libs.junit)
    androidTestImplementation(libs.androidx.junit)
    androidTestImplementation(libs.androidx.espresso.core)
    implementation("androidx.appcompat:appcompat:1.3.1")
    implementation("com.google.android.material:material:1.4.0")
    implementation("androidx.databinding:databinding-runtime:7.0.2")


}

After Searching on Webs I found this:

Circular dependencies can occur when one task depends on another, and vice versa, creating a loop in the dependency graph.

Can someone help me with this?
How can I find which depencies might cause these issues.

How to solve this?

Thanks & Regards!!!

–SRJ

You depend on yourself with implementation(project(":app"))

Thanks for your valuable reply.

I tried removing that line & my issue is solved now…

1 Like

Heyy, Im facing the same problem how did u resolved it ??

Did you read the thread? :wink:

A post was split to a new topic: Circular dependency with extractDeepLinksLive_Debug task

FYI circular dependencies can also happen if you mistakenly use your task output as inputs. It should not happen normally but if you are in the middle of a refactoring, this can happen.

Circular dependency between the following tasks:
:dd-java-agent:instrumentation:exception-profiling:compileMain_java11Groovy
\--- :dd-java-agent:instrumentation:exception-profiling:compileMain_java11Java
     +--- :dd-java-agent:instrumentation:exception-profiling:compileMain_java11Groovy (*)
     +--- :dd-java-agent:instrumentation:exception-profiling:compileMain_java11Java (*)
     \--- :dd-java-agent:instrumentation:exception-profiling:main_java11Classes
          +--- :dd-java-agent:instrumentation:exception-profiling:compileMain_java11Groovy (*)
          \--- :dd-java-agent:instrumentation:exception-profiling:compileMain_java11Java (*)

Here’s how I think it happened ?

In a plugin that was gathering things from the compile task as input for another. And in new code the next task is transformed as an action. I believe this also related to how gradle tracks which task is generating in which output.

def compileClassPath = findCompileClassPath(project, it.name)
it.inputs.files(compileClassPath) // TODO is it still needed, i.e. can it be extracted from this compile task

method was doing this :

static List<NamedDomainObjectProvider<Configuration>> findCompileClassPath(Project project, String taskName) {
  def matcher = taskName =~ /instrument([A-Z].+)Java/
  def cfgName = matcher.matches() ? "${matcher.group(1).uncapitalize()}CompileClasspath" : 'compileClasspath'
  return project.configurations.named(cfgName).findAll {
    it.name != 'previous-compilation-data.bin' && !it.name.endsWith('.gz')
  }
}

Just in case you didn’t notice, that findAll is pointless. :smiley:
named(cfgName) gives you a NamedDomainObjectProvider<Configuration>.
The name of that is either compileClasspath or whateverCompileClasspath, so the condition in the findAll always matches and just makes a list out of that single object.

1 Like

Yeah, I removed the whole method.