Home » Android » android – Databinding fails with NoSuchMethodError

android – Databinding fails with NoSuchMethodError

Posted by: admin May 14, 2020 Leave a comment

Questions:

After updating to gradle 2.10 every time when I try to assemble debug build of the app I get the NoSuchMethodError exception. Here is the relevant part of the build log:

java.lang.RuntimeException: failure, see logs for details.
  cannot generate view binders java.lang.NoSuchMethodError: com.google.common.base.Strings.isNullOrEmpty(Ljava/lang/String;)Z
    at android.databinding.tool.util.StringUtils.capitalize(StringUtils.java:57)
    at android.databinding.tool.util.ParserHelper.toClassName(ParserHelper.java:23)
    at android.databinding.tool.store.ResourceBundle$LayoutFileBundle.getFullBindingClass(ResourceBundle.java:551)
    at android.databinding.tool.store.ResourceBundle$LayoutFileBundle.getBindingClassPackage(ResourceBundle.java:541)
    at android.databinding.tool.CompilerChef.pushClassesToAnalyzer(CompilerChef.java:124)
    at android.databinding.tool.CompilerChef.createChef(CompilerChef.java:73)
    at android.databinding.annotationprocessor.ProcessExpressions.writeResourceBundle(ProcessExpressions.java:148)
    at android.databinding.annotationprocessor.ProcessExpressions.onHandleStep(ProcessExpressions.java:82)
    at android.databinding.annotationprocessor.ProcessDataBinding$ProcessingStep.runStep(ProcessDataBinding.java:154)
    at android.databinding.annotationprocessor.ProcessDataBinding$ProcessingStep.access$000(ProcessDataBinding.java:139)
    at android.databinding.annotationprocessor.ProcessDataBinding.process(ProcessDataBinding.java:66)

As you can see Method com.google.common.base.Strings.isNullOrEmpty can’t be found.

Some specifics

I use Retrolambda 3.2.5 and Java 8. There are no other extra plugins.

Build plugin version: com.android.tools.build:gradle:2.0.0

Build tools version: 23.0.3

OS: OS X

build.gradle looks like this. I altered it slightly to not expose some private stuff, but problem is still there.

buildscript {
    repositories {
        jcenter()
        mavenCentral()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:2.0.0'
        classpath 'me.tatarka:gradle-retrolambda:3.2.3'
    }
}

apply plugin: 'com.android.application'
apply plugin: 'me.tatarka.retrolambda'

project.version = '1.0.0'

afterEvaluate {
    tasks.matching {
        it.name.startsWith('dex')
    }.each { dx ->
        if (dx.additionalParameters == null) {
            dx.additionalParameters = []
        }
        dx.additionalParameters += "--set-max-idx-number=50000" //    default 60000
    }
}

def googleApiKey = "key goes here"
def appVersionCode = 1
def appVersionName = project.version + "." + appVersionCode

android {
    compileSdkVersion 23
    buildToolsVersion "23.0.3"
    defaultConfig {
        minSdkVersion 15
        targetSdkVersion 23
        manifestPlaceholders = [googleApiKey  : googleApiKey,
                                appVersionCode: appVersionCode,
                                appVersionName: appVersionName]
        multiDexEnabled true

        ndk {
            abiFilters "armeabi", "armeabi-v7a"
        }
    }

    buildTypes {
        release {
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard.cfg'

            applicationVariants.all { variant ->
                variant.outputs.each { output ->
                    output.outputFile = new File(
                            output.outputFile.parent,
                            "App-${project.version}-${appVersionCode}.apk"
                    )
                }
            }
        }

        compileOptions {
            sourceCompatibility JavaVersion.VERSION_1_8
            targetCompatibility JavaVersion.VERSION_1_8
        }
    }

    flavorDimensions "multidex", "leakcanary"

    productFlavors {
        withLeakCanary {
            dimension "leakcanary"
        }

        withoutLeakCanary {
            dimension "leakcanary"
        }

        develDex {
            dimension "multidex"
            minSdkVersion 21
            targetSdkVersion 23
        }

        prodDex {
            dimension "multidex"
            minSdkVersion 15
            targetSdkVersion 23
        }
    }
    packagingOptions {
        exclude 'META-INF/LICENSE.txt'
        exclude 'META-INF/LICENSE'
        exclude 'META-INF/NOTICE.txt'
        exclude 'META-INF/NOTICE'
        exclude 'META-INF/DEPENDENCIES'
    }
    lintOptions {
        abortOnError false
    }
    sourceSets {
        main {
            jniLibs.srcDir 'build/jniLibs'
        }
    }

    dexOptions {
        javaMaxHeapSize "4g"
    }

    dataBinding {
        enabled = true
    }
}

task copyNativeLibs(type: Copy) {
    from(new File(buildDir, 'intermediates/exploded-aar/')) {
        include '**/*.so'
        exclude '**/lib-detector.so'
    }
    into new File(buildDir, 'jniLibs')
    eachFile { details ->
        def pathSplit = details.path.split('/')
        details.path = pathSplit[pathSplit.length - 2] + '/' +    pathSplit[pathSplit.length - 1]
    }

    includeEmptyDirs = false
}

tasks.withType(JavaCompile) { javaCompileTask ->    javaCompileTask.dependsOn copyNativeLibs }

clean.dependsOn 'cleanCopyNativeLibs'

dependencies {
    testCompile 'junit:junit:4.11'
    testCompile 'org.robolectric:robolectric:3.0'
    testCompile 'org.robolectric:shadows-multidex:3.0'
    testCompile('org.robolectric:shadows-httpclient:3.0') {
        exclude module: 'httpcore'
        exclude module: 'commons-codec'
    }
    testCompile 'org.powermock:powermock-module-junit4:1.5.2'
    testCompile 'org.powermock:powermock-api-mockito:1.5.2'
    testCompile 'org.roboguice:roboguice:3.0.1'

    compile 'com.parse.bolts:bolts-android:1.2.1'
    compile fileTree(dir: 'libs', include: 'Parse-*.jar')

    compile 'com.google.android.gms:play-services-drive:7.8.0'
    compile 'com.squareup.retrofit:retrofit:1.9.0'
    compile 'com.android.support:multidex:1.0.1'
    compile 'com.android.support:support-annotations:23.0.1'
    compile 'com.android.support:support-v4:23.0.1'
    compile 'com.android.support:appcompat-v7:23.0.1'
    compile 'com.android.support:recyclerview-v7:23.0.1'
    compile 'com.android.support:design:23.0.1'
    compile 'org.roboguice:roboguice:3.0.1'
    provided 'org.roboguice:roboblender:3.0.1'
    compile('com.google.inject.extensions:guice-assistedinject:3.0') {
        exclude group: 'com.google.inject', module: 'guice'
    }
    compile 'commons-io:commons-io:2.4'
    compile 'commons-lang:commons-lang:2.6'
    compile 'com.intellij:annotations:12.0'

    compile 'com.google.zxing:core:3.2.1'
    compile 'com.google.zxing:android-core:3.2.1'
    compile 'com.google.android.gms:play-services-base:7.8.0'
    compile 'com.google.android.gms:play-services-location:7.8.0'
    compile 'com.google.android.gms:play-services-maps:7.8.0'
    compile 'com.google.android.gms:play-services-analytics:7.8.0'
    compile 'com.amazon:in-app-purchasing:2.0.1'

    compile 'com.googlecode.libphonenumber:libphonenumber:7.0.7'

    withLeakCanaryCompile 'com.squareup.leakcanary:leakcanary-android:1.3.1'

    compile 'com.google.android.gms:play-services-ads:7.8.0'

    compile 'io.reactivex:rxandroid:1.0.1'
    compile 'io.reactivex:rxjava:1.0.14'
}

Question

Did anyone else had the same problem? How to fix it? If you need some extra information, please let me know in comments.

How to&Answers:

Have you tried the new patch on jitpack of simular issue #134 clean-build, there seemed to be something wrong with gradle import ordering you can try it with :

repositories {
    maven { url "https://jitpack.io" }
}
dependencies {
    classpath 'com.github.denis-itskovich:gradle-retrolambda:3.2.3-fix-134'
}

Answer:

It looks like there is an error with a plugin after upgrading the Android Studio.

If you go in : <Android Studio Dir>/plugins/android/lib/builder-model-x.x.x.jar you may find 2 .jars. Try to delete the old version .jar and keep the new one and also clean and rebuild the project.

if the above does not work try this:

Change the version of Objectify library in the build.gradle file of your backend to 4.0b to 5.0.3 or higher if it exists.

This is may sound irrelevant but objectify 4.0b library has same classes with same package name which are present in appengine sdk like com.google.common.base.Strings.isNullOrEmpty.

when you deploy the app backend the appengine classes are overridden by objectify classes and hence when you try to call some method it is throwing error.

This is solved in objectify 5.0.+

Hope it helps as it helped me solving this issue.