A dependência do Android tem versões diferentes para compilar e executar


105

Depois de atualizar o Android Studio do Canary 3 para o Canary 4 , o seguinte erro é gerado no momento da compilação.

A dependência do Android 'com.android.support:support-support-v4' tem uma versão diferente para o classpath de compilação (25.2.0) e runtime (26.0.0-beta2). Você deve definir manualmente a mesma versão por meio de DependencyResolution.

Fiz uma pesquisa completa em todo o projeto e a versão 25.1.0não é usada.

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'

}

Nota: O projeto estava sendo construído corretamente na Canária 3


Eu também estava enfrentando o mesmo problema, pois estou usando dois módulos em meu aplicativo, portanto, certifique-se de usar o mesmo código de versão para todos os arquivos do Gradle.
— Nadeem Bhat,

Respostas:


136

Use este código em seu 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
Funcionou para mim, lembre-se de alterar details.useVersion para um número de versão, se você apenas copiar e colar falhará
— John Starr Dewar

2
O melhor, funciona com rn 0.55, gradle 4.1, build gradle tools 3.0.1
— Nerius Jok

1
Certificar-se de incluir o que !details.requested.name.contains('multidex')realmente me ajudou.
— Jonah Starling

2
Eu tentei isso, mas só funcionou para o conflito com.android.support. Não funcionou para o conflito com.google.firebase: firebase-analytics. O 'contém' parece corresponder a muitos pacotes. Eu usei a solução mais simples neste post em vez de todos os conflitos e funcionou perfeitamente.
— Jacob Joel

2
@ user3908686 resolveu o problema, mas explique, por que precisamos adicionar isso ??
— ArgaPK

81

Tive o mesmo erro, o que resolveu meu problema foi. Na minha biblioteca, em vez de compilar ou implementar, eu uso "api". Então, no final, minhas dependências:

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

Você pode encontrar mais informações sobre "api", "implementação" neste link https://stackoverflow.com/a/44493379/3479489


36
Todos os Android Studio recomendam o uso de implementação .. E esta solução original funciona. Os engenheiros do Google nos estúdios Android precisam de uma lição para aprender com o mundo. Que ferramenta frustrante
— Siddharth,

3
não resolve o problema, a mensagem diz: "Dependência do Android '...............' tem versão diferente para compilar"
— Jorgesys

Trabalhe para mim. Obrigado
— Duan Nguyen

@KeithLoughnane Esta não é uma prática ruim, é a maneira correta de fazer e a forma como a documentação recomenda
— Yayo Arellano

1
A implementação de @YayoArellano é o que é recomendado com o uso criterioso da API quando absolutamente necessário. Isso é jogar tudo na parede e ver o que prende a programação. Alguns deles podem precisar da API, mas não todos. Você está expondo demais.
— Keith Loughnane

22

Você deve ser capaz de ver exatamente qual dependência está puxando na versão ímpar como uma dependência transitiva executando o gradle -q dependenciescomando correto para seu projeto, conforme descrito aqui:

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

Depois de rastrear o que está puxando para dentro, você pode adicionar uma exclusão a essa dependência específica em seu arquivo Gradle com algo como:

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

Olá, executei o comando gradle dependency e estou postando o URL da captura de tela aqui, imgur.com/dL35BaN. Nunca uso o Firebase em meu projeto. Adicionada essa linha no gcm, mas não funcionou
— DroidLearner

@DroidLearner Posso estar faltando alguma coisa, mas não vejo nenhuma referência a com.android.support:support-compat na captura de tela que você postou. Também há um aviso nessa captura de tela que se refere a uma configuração de 'compilação' que não vejo presente em seu arquivo Gradle no OP. é provável que esteja vindo do submódulo: core. Você pode postar as informações relevantes do Gradle a partir daí?
— jdonmoyer

Oi, postando-lhe toda a arquivos Gradle com árvore de dependência aqui .. arquivo aplicativo Gradle -> gist.github.com/anonymous/93affc0d75eb96b59f9fde51332b9716 arquivo Gradle core -> gist.github.com/anonymous/5c85031f26ff766109061ab1f00b833d árvore de dependência -> gist.github. com / anonymous / 71dd33b6fa4dc63dd357889e8aff01ee Espero que isso ajude.
— DroidLearner

1
Parece que a versão mais antiga da biblioteca está sendo puxada pelo firebase, que por sua vez é uma dependência transitiva do gms. Você provavelmente pode fazer isso funcionar adicionando: implementação 'com.android.support:support-v4:26.0.0-beta2' antes de qualquer outra dependência. Desligar dependências transitivas a longo prazo em favor de ser explícito ou usar um resolutionStrategy ( docs.gradle.org/current/dsl/… ) é provavelmente uma abordagem melhor.
— jdonmoyer

1
Obrigado. De alguma forma conseguiu consertar a dependência transitiva. A compilação do Gradle foi bem-sucedida. Em tempo de execução está mostrando erros com todas as classes da biblioteca. erro: pacote retrofit2 não existe erro: pacote android.support.v7.app não existe erro: pacote com.google.gson não existe. Em tempo de compilação, não apresentou erros.
— DroidLearner

16

Depois de muito tempo e recebendo a ajuda de um amigo que sabe muito mais do que eu 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"
        // }
    }

e dependências

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
}

em build.gradle

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

em gradle.properties

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

4
resolutionStrategy.forcefoi a única coisa que funcionou para mim. Obrigado!
— Orion Edwards

7

A resposta para mim foi adicionar isso também ao meu build.gradlearquivo:

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

No meu caso, foi necessário encerrar a estratégia de resolução em um configurations.all { .. }bloco. Coloquei o configurations.allbloco diretamente no meu app/build.gradlearquivo (ou seja, configurations.allnão estava aninhado em mais nada)


5

Isso funcionou para mim:

Adicione a seguinte linha na app/build.gradleseção de dependências:

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

ou :27.1.1no meu caso


4

Adicione este código em seu arquivo build.gradle de nível de projeto.

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 amostra :

// 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 alguém tiver esse problema de dependência em 2019, atualize o Android Studio para 3.4 ou posterior


3

Resolvi isso atualizando minha dependência do Gradle no arquivo android / build.gradle: classpath 'com.android.tools.build:gradle:3.3.1' (eu estava anteriormente na versão 3.2.


2

Resolvi isso seguindo o que Eddi mencionou acima,

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

2

Alternar minhas dependências conflitantes de implementação para API resolve o problema. Aqui está um bom artigo da mindorks explicando a diferença.

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

Editar:

Aqui estão minhas resoluções de dependência também

 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

Vejo em seus projetos de biblioteca tornar o compileSdkVersion e targetSdkVersion versão de mesmo nível que o seu pedido é

android {
    compileSdkVersion 28

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

também fazer todas as dependências no mesmo nível


1

Eu comento //api 'com.google.android.gms:play-services-ads:15.0.1'que funcionou para mim após a sincronização


1

Basta adicionar essas linhas em seu arquivo 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

No meu caso, eu tinha duas versões diferentes da implementação abaixo em dois módulos diferentes, então mudei ambas as implementações para versões, ou seja: 6.0.2 e funcionou. Você também pode precisar escrever resolução de dependência para ver a resposta aceita.

módulo de app

implementation 'com.karumi:dexter:5.0.0'

módulo comum

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
    }

adicione isso ao gradle (projeto) dentro allprojects


-7

Substitua uma versão codificada para + exemplo:

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

7
Não é exatamente a melhor prática, pois isso pode fazer com que uma biblioteca saia correndo de você. Ex. Eles mudam a maneira como as coisas são feitas em uma nova versão e, de repente, seu código não funciona. Embora você deva se esforçar para usar a versão mais recente, deve definir manualmente o número da versão depois de testá-la primeiro para evitar falhas e bugs indesejados.
— Jonah Starling

1
Não é uma boa prática. Além do que @JonahStarling disse, isso também afetará o desempenho de compilação do Gradle se o recurso off-line for desativado.
— Ankit Batra
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.