La dépendance Android a une version différente pour la compilation et l'exécution

105

Après la mise à jour d'Android Studio de Canary 3 vers Canary 4 , l'erreur suivante est générée au moment de la construction.

La dépendance Android 'com.android.support:support-support-v4' a une version différente pour le chemin de classe de compilation (25.2.0) et d'exécution (26.0.0-beta2). Vous devez définir manuellement la même version via DependencyResolution.

J'ai effectué une recherche complète tout au long du projet et la version 25.1.0n'est nulle part utilisée.

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

Library-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'

}

Remarque: le projet se construisait correctement dans Canary 3

DroidLearner
la source
J'étais également confronté au même problème, car j'utilise deux modules dans mon application, alors assurez-vous d'utiliser le même code de version pour tous les fichiers gradle.
Nadeem Bhat

Réponses:

136

Utilisez ce code dans votre 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"
        }
     }
  }
}
user3908686
la source
8
Il a travaillé pour moi, rappelez - vous de changer details.useVersion à un numéro de version, si vous venez de copier et coller échouera
John Starr Dewar
2
Le meilleur, fonctionne avec rn 0.55, gradle 4.1, construit des outils de gradle 3.0.1
Nerius Jok
1
S'assurer d'inclure le !details.requested.name.contains('multidex')vraiment m'a aidé.
Jonah Starling
2
J'ai essayé cela, mais cela n'a fonctionné que pour le conflit com.android.support. Cela n'a pas fonctionné pour le conflit com.google.firebase: firebase-analytics. Le «contient» semble correspondre à trop de paquets. J'ai utilisé la solution la plus simple dans cet article à la place pour tous les conflits et cela a parfaitement fonctionné.
Jacob Joel du
2
@ user3908686 a résolu le problème, mais veuillez expliquer pourquoi nous devons ajouter ceci ??
ArgaPK
81

J'ai eu la même erreur, ce qui a résolu mon problème. Dans ma bibliothèque au lieu d'utiliser la compilation ou l'implémentation, j'utilise "api". Donc au final mes dépendances:

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

Vous pouvez trouver plus d'informations sur "api", "implémentation" dans ce lien https://stackoverflow.com/a/44493379/3479489

Yayo Arellano
la source
36
Tout le studio Android recommande d'utiliser l'implémentation .. Et cette solution décalée fonctionne. Les ingénieurs Google des studios Android ont besoin d'une leçon pour apprendre du monde. Quel outil frustrant
Siddharth
3
cela ne résout pas le problème, le message dit: "La dépendance Android '...............' a une version différente pour la compilation"
Jorgesys
Travaille pour moi. Merci
Duan Nguyen
@KeithLoughnane Ce n'est pas une mauvaise pratique, c'est la bonne façon de le faire et la façon dont la documentation le recommande
Yayo Arellano
1
La mise en œuvre de @YayoArellano est ce qui est recommandé avec une utilisation judicieuse de l'API lorsque cela est absolument nécessaire. Il s'agit de tout jeter au mur et voir ce que bâton de programmation. Certains d'entre eux peuvent avoir besoin d'API, mais pas tous. Vous exposez beaucoup trop.
Keith Loughnane
22

Vous devriez être en mesure de voir exactement quelle dépendance extrait la version impaire en tant que dépendance transitive en exécutant la gradle -q dependenciescommande appropriée pour votre projet, comme décrit ici:

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

Une fois que vous avez identifié ce qui l'entraîne, vous pouvez ajouter une exclusion à cette dépendance spécifique dans votre fichier gradle avec quelque chose comme:

implementation("XXXXX") {
    exclude group: 'com.android.support', module: 'support-compat'
}
jdonmoyer
la source
Salut, j'ai exécuté la commande de dépendance gradle et je poste l'url de la capture d'écran ici, imgur.com/dL35BaN. Je n'utilise jamais Firebase dans mon projet. Ajout de cette ligne dans gcm, mais cela n'a pas fonctionné
DroidLearner
@DroidLearner Il me manque peut-être quelque chose, mais je ne vois aucune référence à com.android.support:support-compat dans la capture d'écran que vous avez publiée. Il y a également un avertissement dans cette capture d'écran qui fait référence à une configuration de «compilation» que je ne vois pas présente dans votre fichier gradle dans l'OP. il est probable que cela provienne du sous-module: core. Pouvez-vous publier les informations de grade pertinentes à partir de là?
jdonmoyer
Salut, l' affichage des fichiers entiers Gradle avec arbre de dépendance ici .. app fichier gradle -> gist.github.com/anonymous/93affc0d75eb96b59f9fde51332b9716 noyau fichier gradle -> gist.github.com/anonymous/5c85031f26ff766109061ab1f00b833d arbre de dépendance -> gist.github. com / anonyme / 71dd33b6fa4dc63dd357889e8aff01ee J'espère que cela vous aidera.
DroidLearner
1
Il semble que l'ancienne version de la bibliothèque soit intégrée par Firebase, qui à son tour est une dépendance transitive de gms. Vous pouvez probablement faire fonctionner cela en ajoutant: implementation 'com.android.support:support-v4:26.0.0-beta2' avant toute autre dépendance. La désactivation à long terme des dépendances transitives en faveur de l'explicite ou de l'utilisation d'une stratégie de résolution ( docs.gradle.org/current/dsl/… ) est probablement une meilleure approche.
jdonmoyer
1
Merci. En quelque sorte réussi à corriger la dépendance transitive. La construction de Gradle a réussi. Au moment de l'exécution, il affiche des erreurs avec toutes les classes de bibliothèque. erreur: le package retrofit2 n'existe pas erreur: le package android.support.v7.app n'existe pas erreur: le package com.google.gson n'existe pas. Au moment de la compilation, il n'a montré aucune erreur.
DroidLearner
16

Après beaucoup de temps et avoir obtenu l'aide d'un ami qui en sait beaucoup plus que moi sur 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"
        // }
    }

et dépendances

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
}

dans build.gradle

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

dans gradle.properties

android.useDeprecatedNdk=true
android.enableAapt2=false
org.gradle.jvmargs=-Xmx4608M
Stefano Solinas - ObsidianArt
la source
4
resolutionStrategy.forceétait la seule chose qui fonctionnait pour moi. Merci!
Orion Edwards
7

La réponse pour moi était également d'ajouter ceci à mon build.gradlefichier:

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

Dans mon cas, il était nécessaire d'enfermer la stratégie de résolution dans un configurations.all { .. }bloc. J'ai placé le configurations.allbloc directement dans mon app/build.gradlefichier (c'est-à-dire qu'il configurations.alln'était imbriqué dans rien d'autre)

Dacre Denny
la source
5

Cela a fonctionné pour moi:

Ajoutez la ligne suivante dans la app/build.gradlesection des dépendances:

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

ou :27.1.1dans mon cas

ALEXANDER LOZANO
la source
4

Ajoutez ce code dans votre fichier build.gradle au niveau du projet.

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

Exemple de code:

// 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"
            }
        }
    }
}
Dileep Krishnan
la source
3

Si quelqu'un rencontre ce problème de dépendance en 2019, mettez à jour Android Studio vers 3.4 ou version ultérieure

Atul Vasudev A
la source
3

Je l'ai résolu en mettant à jour ma dépendance gradle dans le fichier android / build.gradle: classpath 'com.android.tools.build:gradle:3.3.1' (j'étais auparavant sur la version 3.2.

Ajani Eniola
la source
2

Je l'ai résolu en suivant ce qu'Eddi a mentionné ci-dessus,

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

Passer de l'implémentation à l'API mes dépendances conflictuelles fait l'affaire. Voici un bon article de mindorks expliquant la différence.

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

Éditer:

Voici aussi mes résolutions de dépendance

 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"
                }
            }
        }
    }
je suis E
la source
2

Voir dans vos projets de bibliothèque rendre la version compileSdkVersion et targetSdkVersion au même niveau que votre application

android {
    compileSdkVersion 28

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

rendre également toutes les dépendances au même niveau

Ali Imran
la source
1

Je commente que //api 'com.google.android.gms:play-services-ads:15.0.1'cela a fonctionné pour moi après la synchronisation

Fredrick Reuben
la source
1

Ajoutez simplement ces lignes dans votre fichier 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"

Tushar
la source
0

Dans mon cas, j'avais deux versions différentes de l'implémentation ci-dessous dans deux modules différents, donc j'ai changé les deux implémentations en versions, c'est-à-dire: 6.0.2 et cela a fonctionné. Vous devrez peut-être également écrire une résolution de dépendance pour voir la réponse acceptée.

module d'application

implementation 'com.karumi:dexter:5.0.0'

module commun

implementation 'com.karumi:dexter:6.0.2'
Divyanshu Kumar
la source
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
    }

ajoutez ceci à gradle (projet) à l'intérieur allprojects

Farido mastr
la source
-7

Remplacez une version codée en dur par + exemple:

implementation 'com.google.android.gms:play-services-base:+'
implementation 'com.google.android.gms:play-services-maps:+'
Sarmad Shah
la source
7
Ce n'est pas exactement la meilleure pratique, car cela peut entraîner une sorte de fuite d'une bibliothèque. Ex. Ils changent la façon dont les choses sont faites dans une nouvelle version et tout d'un coup votre code ne fonctionne plus. Bien que vous deviez vous efforcer d'utiliser la dernière version, vous devez définir manuellement le numéro de version après l'avoir testé pour éviter les plantages et les bogues indésirables.
Jonah Starling
1
Pas une bonne pratique. En plus de ce que @JonahStarling a dit, cela affectera également les performances de construction de Gradle si la fonctionnalité hors ligne est désactivée.
Ankit Batra