La dependencia de Android tiene una versión diferente para la compilación y el tiempo de ejecución

105

Después de actualizar Android Studio de Canary 3 a Canary 4 , aparece el siguiente error en el momento de la compilación.

La dependencia de Android 'com.android.support:support-support-v4' tiene una versión diferente para la ruta de clase de compilación (25.2.0) y tiempo de ejecución (26.0.0-beta2). Debe configurar manualmente la misma versión a través de DependencyResolution.

Realicé una búsqueda completa en todo el proyecto y la versión 25.1.0no se utiliza.

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: El proyecto se estaba construyendo bien en Canary 3

DroidLearner
fuente
También estaba enfrentando el mismo problema, ya que estoy usando dos módulos en mi aplicación, así que asegúrese de estar usando el mismo código de versión para todos los archivos gradle.
Nadeem Bhat

Respuestas:

136

Use este código en su 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"
        }
     }
  }
}
usuario3908686
fuente
8
Me funcionó, recuerde cambiar details.useVersion a un número de versión, si solo copia y pega, fallará
John Starr Dewar
2
Lo mejor, funciona con rn 0.55, gradle 4.1, build gradle tools 3.0.1
Nerius Jok
1
Asegurarse de incluir lo que !details.requested.name.contains('multidex')realmente me ayudó.
Jonah Starling
2
Intenté esto, pero solo funcionó para el conflicto com.android.support. No funcionó para el conflicto com.google.firebase: firebase-analytics. El 'contiene' parece coincidir con demasiados paquetes. Usé la solución más simple en esta publicación para todos los conflictos y funcionó perfectamente.
Jacob Joel
2
@ user3908686 resolvió el problema, pero explique, ¿por qué necesitamos agregar esto?
ArgaPK
81

Tuve el mismo error, lo que resolvió mi problema fue. En mi biblioteca en lugar de usar compilar o implementar, uso "api". Así que al final mis dependencias:

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

Puede encontrar más información sobre "api", "implementación" en este enlace https://stackoverflow.com/a/44493379/3479489

Yayo Arellano
fuente
36
Todo Android Studio recomienda usar la implementación ... Y esta solución poco convencional funciona. Los ingenieros de Google en los estudios de Android necesitan una lección para aprender del mundo. Qué herramienta tan frustrante
Siddharth
3
no resuelve el problema, el mensaje dice: "La dependencia de Android '...............' tiene una versión diferente para la compilación"
Jorgesys
Trabaja para mi. Gracias
Duan Nguyen
@KeithLoughnane Esta no es una mala práctica, es la forma correcta de hacerlo y la forma en que recomienda la documentación
Yayo Arellano
1
La implementación de @YayoArellano es lo que se recomienda con un uso juicioso de la API donde sea absolutamente necesario. Esto es tirar todo a la pared y ver qué se pega a la programación. Algunos de ellos pueden necesitar api, pero no todos. Estás exponiendo demasiado.
Keith Loughnane
22

Debería poder ver exactamente qué dependencia está tirando en la versión impar como una dependencia transitiva ejecutando el gradle -q dependenciescomando correcto para su proyecto como se describe aquí:

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

Una vez que rastree lo que lo atrae, puede agregar una exclusión a esa dependencia específica en su archivo gradle con algo como:

implementation("XXXXX") {
    exclude group: 'com.android.support', module: 'support-compat'
}
jdonmoyer
fuente
Hola, ejecuté el comando de dependencia de gradle y estoy publicando la URL de captura de pantalla aquí, imgur.com/dL35BaN. Nunca uso Firebase en mi proyecto. Se agregó esa línea en gcm, aunque no funcionó
DroidLearner
@DroidLearner Puede que me esté perdiendo algo, pero no veo ninguna referencia a com.android.support:support-compat en la captura de pantalla que publicó. También hay una advertencia en esa captura de pantalla que se refiere a una configuración de 'compilación' que no veo presente en su archivo gradle en el OP. es probable que provenga del submódulo: core. ¿Puedes publicar la información relevante de Gradle desde allí?
jdonmoyer
Hola, publicando todos los archivos gradle con el árbol de dependencias aquí .. app gradle file -> gist.github.com/anonymous/93affc0d75eb96b59f9fde51332b9716 core gradle file -> gist.github.com/anonymous/5c85031f26ff766109061ab1f00b833d dependency tree . com / anonymous / 71dd33b6fa4dc63dd357889e8aff01ee Espero que esto ayude.
DroidLearner
1
Parece que firebase está incorporando la versión anterior de la biblioteca, que a su vez es una dependencia transitiva de gms. Es probable que pueda hacer que esto funcione agregando: implementación 'com.android.support:support-v4:26.0.0-beta2' antes de cualquier otra dependencia. Desactivar las dependencias transitivas a largo plazo en favor de ser explícito o utilizar una estrategia de resolución ( docs.gradle.org/current/dsl/… ) es probablemente un mejor enfoque.
jdonmoyer
1
Gracias. De alguna manera logró arreglar la dependencia transitiva. La compilación de Gradle tuvo éxito. En tiempo de ejecución, muestra errores con todas las clases de biblioteca. error: el paquete retrofit2 no existe error: el paquete android.support.v7.app no ​​existe error: el paquete com.google.gson no existe. En el momento de la compilación, no mostró ningún error.
DroidLearner
16

Después de mucho tiempo y recibir ayuda de un amigo que sabe mucho más que yo sobre 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"
        // }
    }

y dependencias

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
}

en build.gradle

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

en gradle.properties

android.useDeprecatedNdk=true
android.enableAapt2=false
org.gradle.jvmargs=-Xmx4608M
Stefano Solinas - obsidianart
fuente
4
resolutionStrategy.forcefue lo único que funcionó para mí. ¡Gracias!
Orion Edwards
7

La respuesta para mí fue agregar esto también a mi build.gradlearchivo:

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

En mi caso, fue necesario encerrar la estrategia de resolución en un configurations.all { .. }bloque. Coloqué el configurations.allbloque directamente en mi app/build.gradlearchivo (es decir configurations.all, no estaba anidado en nada más)

Dacre Denny
fuente
5

Esto funcionó para mí:

Agregue la siguiente línea en la app/build.gradlesección de dependencias:

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

o :27.1.1en mi caso

ALEXANDER LOZANO
fuente
4

Agregue este código en su archivo build.gradle de nivel de proyecto.

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

Código de muestra :

// 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
fuente
3

Si alguien tiene este problema de dependencia en 2019, actualice Android Studio a 3.4 o posterior

Atul Vasudev A
fuente
3

Lo resolví actualizando mi dependencia de gradle en el archivo android / build.gradle: classpath 'com.android.tools.build:gradle:3.3.1' (anteriormente estaba en la versión 3.2.

Ajani Eniola
fuente
2

Lo resolví siguiendo lo que Eddi mencionó anteriormente,

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

Cambiar mis dependencias en conflicto de la implementación a la API hace el truco. Aquí hay un buen artículo de Mindorks que explica la diferencia.

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

Editar:

Aquí están mis resoluciones de dependencia también

 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"
                }
            }
        }
    }
yo soy E
fuente
2

Vea en los proyectos de su biblioteca hacer que la versión compileSdkVersion y targetSdkVersion esté al mismo nivel que su aplicación

android {
    compileSdkVersion 28

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

también haga todas las dependencias al mismo nivel

Ali Imran
fuente
1

Comento //api 'com.google.android.gms:play-services-ads:15.0.1'que funcionó para mí después de la sincronización

Fredrick Reuben
fuente
1

Simplemente agregue estas líneas en su archivo 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
fuente
0

En mi caso, tenía dos versiones diferentes de la implementación a continuación en dos módulos diferentes, así que cambié ambas implementaciones a las versiones, es decir: 6.0.2 y funcionó. Es posible que también deba escribir la resolución de dependencia para ver la respuesta aceptada.

módulo de aplicación

implementation 'com.karumi:dexter:5.0.0'

módulo de bienes comunes

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

agregue esto a gradle (proyecto) dentro allprojects

Farido mastr
fuente
-7

Reemplazar una versión codificada por + ejemplo:

implementation 'com.google.android.gms:play-services-base:+'
implementation 'com.google.android.gms:play-services-maps:+'
Sarmad Shah
fuente
7
No es exactamente la mejor práctica, ya que esto puede hacer que una biblioteca se le escape. Ex. Cambian la forma en que se hacen las cosas en una nueva versión y, de repente, su código no funciona. Si bien debe esforzarse por usar la última versión, debe establecer manualmente el número de versión después de probarlo primero para evitar fallas y errores no deseados.
Jonah Starling
1
No es una buena práctica. Además de lo que dijo @JonahStarling, también afectará el rendimiento de la compilación de Gradle si la función fuera de línea está desactivada.
Ankit Batra