La dipendenza Android ha una versione diversa per la compilazione e il runtime


105

Dopo aver aggiornato Android Studio da Canary 3 a Canary 4 , viene visualizzato il seguente errore in fase di compilazione.

La dipendenza Android "com.android.support:support-support-v4" ha una versione diversa per il classpath di compilazione (25.2.0) e runtime (26.0.0-beta2). È necessario impostare manualmente la stessa versione tramite DependencyResolution.

Ho eseguito una ricerca completa in tutto il progetto e la versione 25.1.0non è stata utilizzata.

App-build.gradle

android {
compileSdkVersion 26
buildToolsVersion '26.0.0'


defaultConfig {
    applicationId "com.xxx.xxxx"
    minSdkVersion 14
    targetSdkVersion
    versionCode 1
    versionName "1.0"
    multiDexEnabled true

}


buildTypes {
    debug {
        debuggable true
    }
    release {
        debuggable false
        minifyEnabled true
        shrinkResources true
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }

    lintOptions {
        abortOnError false
    }

}}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
testImplementation 'junit:junit:4.12'
implementation project(':core')
implementation com.google.android.gms:play-services-gcm:9.0.0'

implementation('com.crashlytics.sdk.android:crashlytics:2.6.5@aar') {
    transitive = true
}
implementation 'com.android.support:multidex:1.0.1'
implementation 'com.flurry.android:analytics:7.0.0'
annotationProcessor 'com.jakewharton:butterknife-compiler:8.6.0'
implementation 'com.jakewharton:butterknife:8.6.0'
implementation 'com.android.support.constraint:constraint-layout:1.0.2'
}

Biblioteca-build.gradle:

apply plugin: 'com.android.library'
android {
compileSdkVersion 26
buildToolsVersion '26.0.0'

defaultConfig {
    minSdkVersion 14
    targetSdkVersion
    versionCode 1
    versionName "1.0"
}

}

dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation files('libs/model.jar')
testImplementation 'junit:junit:4.12'
implementation 'com.android.support:percent:26.0.0-beta2'
implementation 'com.android.support:appcompat-v7:26.0.0-beta2'
implementation 'com.android.support:support-core-utils:26.0.0-beta2'

implementation 'com.squareup.retrofit2:retrofit:2.0.2'
implementation 'com.squareup.picasso:picasso:2.4.0'
implementation 'com.squareup.retrofit2:converter-gson:2.0.2'
implementation 'com.squareup.okhttp3:logging-interceptor:3.2.0'
implementation 'uk.co.chrisjenx:calligraphy:2.2.0'
implementation 'com.google.code.gson:gson:2.2.4'
implementation 'com.android.support:design:26.0.0-beta2'
implementation 'com.github.PhilJay:MPAndroidChart:v3.0.1'

}

Nota: il progetto stava andando bene a Canary 3


Stavo anche affrontando lo stesso problema, poiché sto usando due moduli nella mia app, quindi assicurati di utilizzare lo stesso codice di versione per tutti i file gradle.
Nadeem Bhat

Risposte:


136

Usa questo codice nel tuo buildscript (build.gradle root):

subprojects {
  project.configurations.all {
     resolutionStrategy.eachDependency { details ->
        if (details.requested.group == 'com.android.support'
              && !details.requested.name.contains('multidex') ) {
           details.useVersion "version which should be used - in your case 26.0.0-beta2"
        }
     }
  }
}

8
Ha funzionato per me, ricordati di cambiare details.useVersion con un numero di versione, se copi e incolli non funzionerà
John Starr Dewar

2
Il migliore, funziona con rn 0.55, gradle 4.1, build gradle tools 3.0.1
Nerius Jok

1
Assicurarmi di includere la !details.requested.name.contains('multidex')cosa mi ha davvero aiutato.
Jonah Starling

2
Ho provato questo, ma ha funzionato solo per il conflitto com.android.support. Non ha funzionato per il conflitto com.google.firebase: firebase-analytics. Il "contiene" sembra corrispondere a troppi pacchetti. Ho usato la soluzione più semplice in questo post invece per tutti i conflitti e ha funzionato perfettamente.
Jacob Joel

2
@ user3908686 ha risolto il problema, ma per favore spiega, perché dobbiamo aggiungere questo ??
ArgaPK

81

Ho avuto lo stesso errore, cosa ha risolto il mio problema. Nella mia libreria invece di usare la compilazione o l'implementazione uso "api". Quindi alla fine le mie dipendenze:

dependencies {
api fileTree(dir: 'libs', include: ['*.jar'])
api files('libs/model.jar')
testApi 'junit:junit:4.12'
api 'com.android.support:percent:26.0.0-beta2'
api 'com.android.support:appcompat-v7:26.0.0-beta2'
api 'com.android.support:support-core-utils:26.0.0-beta2'

api 'com.squareup.retrofit2:retrofit:2.0.2'
api 'com.squareup.picasso:picasso:2.4.0'
api 'com.squareup.retrofit2:converter-gson:2.0.2'
api 'com.squareup.okhttp3:logging-interceptor:3.2.0'
api 'uk.co.chrisjenx:calligraphy:2.2.0'
api 'com.google.code.gson:gson:2.2.4'
api 'com.android.support:design:26.0.0-beta2'
api 'com.github.PhilJay:MPAndroidChart:v3.0.1'
}

Puoi trovare maggiori informazioni su "api", "implementazione" a questo link https://stackoverflow.com/a/44493379/3479489


36
Tutto Android Studio consiglia di utilizzare l'implementazione .. E questa soluzione insolita funziona. Gli ingegneri di Google negli studi Android hanno bisogno di una lezione per imparare dal mondo. Che strumento frustrante
Siddharth

3
non risolve il problema, il messaggio dice: "La dipendenza Android '...............' ha una versione diversa per la compilazione"
Jorgesys

Lavora per me. Grazie
Duan Nguyen

@KeithLoughnane Questa non è una cattiva pratica, è il modo corretto di farlo e il modo in cui la documentazione consiglia
Yayo Arellano

1
L'implementazione di @YayoArellano è ciò che è raccomandato con un uso giudizioso di api dove assolutamente richiesto. Questo è gettare tutto contro il muro e vedere cosa blocca la programmazione. Alcuni di questi potrebbero aver bisogno di API ma non tutti. Stai esponendo troppo.
Keith Loughnane

22

Dovresti essere in grado di vedere esattamente quale dipendenza sta tirando nella versione dispari come dipendenza transitiva eseguendo il gradle -q dependenciescomando corretto per il tuo progetto come descritto qui:

https://docs.gradle.org/current/userguide/userguide_single.html#sec:listing_dependencies

Una volta individuato ciò che lo attira, puoi aggiungere un'esclusione a quella specifica dipendenza nel tuo file gradle con qualcosa come:

implementation("XXXXX") {
    exclude group: 'com.android.support', module: 'support-compat'
}

Ciao, ho eseguito il comando gradle dependency e sto postando l'URL dello screenshot qui, imgur.com/dL35BaN. Non uso mai Firebase nel mio progetto. Aggiunta quella riga in gcm, ma non ha funzionato
DroidLearner

@DroidLearner Potrei perdere qualcosa, ma non vedo alcun riferimento a com.android.support:support-compat nello screenshot che hai pubblicato. Inoltre c'è un avviso in quella schermata che si riferisce a una configurazione di "compilazione" che non vedo presente nel tuo file gradle nell'OP. è probabile che provenga dal sottomodulo: core. Puoi pubblicare le informazioni pertinenti sul gradle da lì?
jdonmoyer

Ciao, ti invio i file interi Gradle con albero delle dipendenze qui .. file app Gradle -> gist.github.com/anonymous/93affc0d75eb96b59f9fde51332b9716 file core Gradle -> gist.github.com/anonymous/5c85031f26ff766109061ab1f00b833d dell'albero delle dipendenze -> gist.github. com / anonymous / 71dd33b6fa4dc63dd357889e8aff01ee Spero che questo aiuti.
DroidLearner

1
Sembra che la versione precedente della libreria sia stata inserita da Firebase, che a sua volta è una dipendenza transitiva di gms. Probabilmente puoi farlo funzionare aggiungendo: implementation 'com.android.support:support-v4:26.0.0-beta2' prima di qualsiasi altra dipendenza. La disattivazione a lungo termine delle dipendenze transitive a favore dell'essere espliciti o dell'uso di una resolutionStrategy ( docs.gradle.org/current/dsl/… ) è probabilmente un approccio migliore.
jdonmoyer

1
Grazie. In qualche modo è riuscito a correggere la dipendenza transitiva. Costruzione Gradle riuscita. In fase di esecuzione mostra errori con tutte le classi della libreria. errore: il pacchetto retrofit2 non esiste errore: il pacchetto android.support.v7.app non esiste errore: il pacchetto com.google.gson non esiste. In fase di compilazione non ha mostrato errori.
DroidLearner

16

Dopo molto tempo e ottenere aiuto da un amico che sa molto più di me su Android: app / build.gradle

android {
    compileSdkVersion 27

    // org.gradle.caching = true

    defaultConfig {
        applicationId "com.cryptoviewer"
        minSdkVersion 16
        targetSdkVersion 23
        versionCode 196
        versionName "16.83"
        // ndk {
        //     abiFilters "armeabi-v7a", "x86"
        // }
    }

e dipendenze

dependencies {
    implementation project(':react-native-camera')
   //...
    implementation "com.android.support:appcompat-v7:26.1.0" // <= YOU CARE ABOUT THIS
    implementation "com.facebook.react:react-native:+"  // From node_modules
}

in build.gradle

allprojects {
   //...
    configurations.all {
        resolutionStrategy.force "com.android.support:support-v4:26.1.0"
    }

in gradle.properties

android.useDeprecatedNdk=true
android.enableAapt2=false
org.gradle.jvmargs=-Xmx4608M

4
resolutionStrategy.forceera l'unica cosa che ha funzionato per me. Grazie!
Orion Edwards

7

La risposta per me è stata aggiungere anche questo al mio build.gradlefile:

configurations.all {
  resolutionStrategy.eachDependency { details ->
      if (details.requested.group == 'com.android.support'
              && !details.requested.name.contains('multidex') ) {
          details.useVersion "26.1.0"
      }
  }
}

Nel mio caso, era necessario racchiudere la strategia di risoluzione in un configurations.all { .. }blocco. Ho inserito il configurations.allblocco direttamente nel mio app/build.gradlefile (cioè configurations.allnon era annidato in nient'altro)


5

Questo ha funzionato per me:

Aggiungi la seguente riga nella app/build.gradlesezione delle dipendenze:

implementation "com.android.support:appcompat-v7:27.1.0"

o :27.1.1nel mio caso


4

Aggiungi questo codice nel file build.gradle a livello di progetto.

subprojects {
    project.configurations.all {
        resolutionStrategy.eachDependency { details ->
            if (details.requested.group == 'com.android.support'
                    && !details.requested.name.contains('multidex') ) {
                details.useVersion "version which should be used - in your case 28.0.0-beta2"
            }
        }
    }
}

Codice di esempio :

// Top-level build file where you can add configuration options common to all sub-projects/modules.

buildscript {

    repositories {
        google()
        jcenter()
        maven { url 'https://maven.fabric.io/public' }
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.2.0'
        classpath 'io.fabric.tools:gradle:1.31.0'

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files

    }
}

allprojects {
    repositories {
        google()
        jcenter()
    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}


subprojects {
    project.configurations.all {
        resolutionStrategy.eachDependency { details ->
            if (details.requested.group == 'com.android.support'
                    && !details.requested.name.contains('multidex') ) {
                details.useVersion "28.0.0"
            }
        }
    }
}

3

Se qualcuno riscontra questo problema di dipendenza nel 2019, aggiorna Android Studio alla versione 3.4 o successiva


3

L'ho risolto aggiornando la mia dipendenza gradle nel file android / build.gradle: classpath 'com.android.tools.build:gradle:3.3.1' (in precedenza ero alla versione 3.2.


2

L'ho risolto seguendo quanto sopra accennato da Eddi,

 resolutionStrategy.eachDependency { details ->
            if (details.requested.group == 'com.android.support'
                    && !details.requested.name.contains('multidex') ) {
                details.useVersion "26.1.0"
            }
        }

2

Il passaggio delle mie dipendenze in conflitto dall'implementazione all'api fa il trucco. Ecco un buon articolo di mindorks che spiega la differenza.

https://medium.com/mindorks/implementation-vs-api-in-gradle-3-0-494c817a6fa

Modificare:

Ecco anche le mie risoluzioni sulle dipendenze

 subprojects {
        project.configurations.all {
            resolutionStrategy.eachDependency { details ->
                if (details.requested.group == 'com.android.support'
                        && !details.requested.name.contains('multidex')) {
                    details.useVersion "28.0.0"
                }
                if (details.requested.group == 'com.google.android.gms'
                        && details.requested.name.contains('play-services-base')) {
                    details.useVersion "15.0.1"
                }
                if (details.requested.group == 'com.google.android.gms'
                        && details.requested.name.contains('play-services-tasks')) {
                    details.useVersion "15.0.1"
                }
            }
        }
    }

2

Vedi nei tuoi progetti di libreria rendere la versione compileSdkVersion e targetSdkVersion allo stesso livello della tua applicazione

android {
    compileSdkVersion 28

    defaultConfig {
        consumerProguardFiles 'proguard-rules.txt'
        minSdkVersion 14
        targetSdkVersion 28
    }
}

rende anche tutte le dipendenze allo stesso livello


1

Ho commentato che //api 'com.google.android.gms:play-services-ads:15.0.1'ha funzionato per me dopo la sincronizzazione


1

Basta aggiungere queste righe nel file build.gradle

resolutionStrategy.force "com.android.support:support-media-compat:26.0.0-beta2"

resolutionStrategy.force "com.android.support:support-v4:26.0.0-beta2"


0

Nel mio caso, avevo due versioni diverse dell'implementazione di seguito in due moduli diversi, quindi ho cambiato entrambe l'implementazione in versioni, ad esempio: 6.0.2 e ha funzionato. Potrebbe anche essere necessario scrivere la risoluzione delle dipendenze per vedere la risposta accettata.

modulo app

implementation 'com.karumi:dexter:5.0.0'

modulo comuni

implementation 'com.karumi:dexter:6.0.2'

0

    configurations.all {
        resolutionStrategy.force
        //"com.android.support:appcompat-v7:25.3.1"
        //here put the library that made the error with the version you want to use
    }

aggiungilo a gradle (progetto) all'interno allprojects


-7

Sostituisci una versione hardcoded con + esempio:

implementation 'com.google.android.gms:play-services-base:+'
implementation 'com.google.android.gms:play-services-maps:+'

7
Non esattamente la migliore pratica in quanto ciò può farti scappare una libreria. Ex. Cambiano il modo in cui le cose vengono fatte in una nuova versione e all'improvviso il tuo codice non funziona. Anche se dovresti sforzarti di utilizzare la versione più recente, dovresti impostare manualmente il numero di versione dopo averla testata prima per evitare arresti anomali e bug indesiderati.
Jonah Starling

1
Non è una buona pratica. Oltre a quanto affermato da @JonahStarling, se la funzionalità offline è disattivata, influirà anche sulle prestazioni della build Gradle.
Ankit Batra
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.