dagger: Dagger 2 swallows errors

Hi, i have an unexpected problem with my setup. Also to inform you, i heavily use the official android databinding in my project (in 10+ activities and 20+ fragments).

my app build.gradle is something like this:

apply plugin: 'com.android.application'
apply plugin: 'com.neenbedankt.android-apt'

android {
    compileSdkVersion 23
    buildToolsVersion '23.0.2'

    dataBinding {
        enabled = true
    }

    dexOptions {
        incremental true
        javaMaxHeapSize "4g"
    }

    defaultConfig {
        applicationId "com.charbgr"
        minSdkVersion 16
        targetSdkVersion 23
        versionCode 1
        versionName "1"

        //Espresso
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"

        //RenderScript
        renderscriptTargetApi 19
        renderscriptSupportModeEnabled true

        multiDexEnabled true
    }

    packagingOptions {

        //Espresso excludes
        exclude 'META-INF/DEPENDENCIES.txt'
        exclude 'META-INF/LICENSE.txt'
        exclude 'META-INF/NOTICE.txt'
        exclude 'META-INF/NOTICE'
        exclude 'META-INF/LICENSE'
        exclude 'META-INF/DEPENDENCIES'
        exclude 'META-INF/notice.txt'
        exclude 'META-INF/license.txt'
        exclude 'META-INF/dependencies.txt'
        exclude 'META-INF/LGPL2.1'
        exclude 'LICENSE.txt'
        //Espresso excludes

    }

    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_7
        targetCompatibility JavaVersion.VERSION_1_7
    }

}



dependencies {

    ...

    compile 'com.google.dagger:dagger:2.0.2'
    apt 'com.google.dagger:dagger-compiler:2.0.2'
    provided 'org.glassfish:javax.annotation:10.0-b28'
}

the root build.gradle is this one:

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:2.0.0-alpha5'
        classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
    }
}

allprojects {
    repositories {
        jcenter()
    }
}

In my code, i make an enforced error(i know that i cannot create an object with the same method name in a module). The enforced error looks like this:

@Module
public class AndroidModule {

    @Provides
    public Foo providesFoo(String bar) {
        return new Foo(bar);
    }

    @Provides
    public Foo providesFoo(String bar, String unusedArgument) {
        return new Foo(bar);
    }
}

For some reason, when i build my project i get 100+ errors from databinding with this output: cannot find symbol class BR

and dagger doesn’t prints this error Cannot have more than one @Provides method with the same name in a single module

Seems that Dagger “swallows” this error or the databinding overrides some behaviour of the annotation processor tool(apt).

Do you know what’s going on?

About this issue

  • Original URL
  • State: closed
  • Created 8 years ago
  • Comments: 27

Most upvoted comments

After couple of days of debugging, i found that javac outputs by default max 100 errors. So if anyone, come with this error just add to gradle to force javac to output over 100 errors.

gradle.projectsEvaluated {
    tasks.withType(JavaCompile) {
        options.compilerArgs << "-Xmaxerrs" << "500"
    }
}

so @ronshapiro you can close this issue.

The mentioned fix actually didn’t work for me with Gradle 4.0. It does not find the JavaCompile tasks. Here what I did instead (in my main build.gradle)

allprojects {
  afterEvaluate {
     tasks.withType(JavaCompile.class) {
       options.compilerArgs << "-Xmaxerrs" << "500"
     }
   }
 }

Kotlin docs helped me:

kapt {
    javacOptions {
        // Increase the max count of errors from annotation processors.
        // Default is 100.
        option("-Xmaxerrs", 500)
    }
}

Of course this should be used if you use kapt

I’ve applied it to all my submodules with this in my root build.gradle:

subprojects {

    afterEvaluate {
        if (project.plugins.hasPlugin("kotlin-kapt")) {
            kapt {
                javacOptions {
                    option("-Xmaxerrs", 500)
                }
            }
        }
    }
}

If you see many many errors coming from Android Databinding, upgrade to Android Gradle Plugin version 3.3.+ and it will show only 1 error. So this way you don’t have to increase -Xmaxerrs

@ronshapiro @charbgr my co-worker just ran into this issue. The fix above solved the problem, but in the meantime, it made her hate dagger and code-generation in general. 100 errors displayed on screen, and none having anything to do with something she did. So I would suggest to document it beter than in a comment of a closed issue

@tasomaniac I have found that new data binding library is causing the issue android.databinding.enableV2=true If databinding v2 is disabled it’s showing proper dagger error.

After couple of days of debugging, i found that javac outputs by default max 100 errors. So if anyone, come with this error just add to gradle to force javac to output over 100 errors.

gradle.projectsEvaluated {
    tasks.withType(JavaCompile) {
        options.compilerArgs << "-Xmaxerrs" << "500"
    }
}

so @ronshapiro you can close this issue.

thanks

But for koltin it’s showing databinding error in case of dagger related errors. Dagger related error is not showing in logs. Can anybody help me with this error

If you’re using data binding, android studio generates error for every layout file even though there’s no error in them, which causes dagger errors to be swallowed.

@cgruber it’s the bad interaction with the android data-binding library generates a MyLayoutBinding class for each resource/layout/my_layout.xml, and myLayoutBinding.subViewXX for each android:id="@+id/subViewXX". If you have 20 layouts and 5 ids in each layout, you have very soon 120 generated symbols in your code that each cause a compilation error if not generated correctly.