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

DroidLearner
fonte
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"
        }
     }
  }
}
user3908686
fonte
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

Yayo Arellano
fonte
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'
}
Jdonmoyer
fonte
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
Stefano Solinas - obsidianart
fonte
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)

Dacre Denny
fonte
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

ALEXANDER LOZANO
fonte
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"
            }
        }
    }
}
Dileep Krishnan
fonte
3

Se alguém tiver esse problema de dependência em 2019, atualize o Android Studio para 3.4 ou posterior

Atul Vasudev A
fonte
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.

Ajani Eniola
fonte
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"
            }
        }
DILIP KOSURI
fonte
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"
                }
            }
        }
    }
Eu sou
fonte
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

Ali Imran
fonte
1

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

Fredrick Reuben
fonte
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"

Tushar
fonte
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'
Divyanshu Kumar
fonte
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

Farido mastr
fonte
-7

Substitua uma versão codificada para + exemplo:

implementation 'com.google.android.gms:play-services-base:+'
implementation 'com.google.android.gms:play-services-maps:+'
Sarmad Shah
fonte
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