Android 종속성에는 컴파일 및 런타임에 대한 버전이 다릅니다.


105

Android Studio를 Canary 3 에서 Canary 4로 업데이트 한 후 빌드시 다음 오류가 발생합니다.

Android 종속성 'com.android.support:support-support-v4'에는 컴파일 (25.2.0) 및 런타임 (26.0.0-beta2) 클래스 경로에 대한 버전이 다릅니다. DependencyResolution을 통해 동일한 버전을 수동으로 설정해야합니다.

프로젝트 전체에서 전체 검색을 실행했으며 버전 25.1.0은 사용되는 곳이 없습니다.

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'

}

참고 : 프로젝트는 Canary 3에서 잘 구축되었습니다.


나는 또한 내 앱에서 두 개의 모듈을 사용하고 있으므로 동일한 문제에 직면 했으므로 모든 gradle 파일에 동일한 버전 코드를 사용하고 있는지 확인하십시오.
Nadeem Bhat 2018

답변:


136

빌드 스크립트 (build.gradle 루트)에서 다음 코드를 사용하세요.

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
그것은 나를 위해 일했습니다. details.useVersion을 버전 번호로 변경하는 것을 잊지 마십시오. 복사 및 붙여 넣기 만하면 실패합니다
John Starr Dewar

2
최고, rn 0.55, gradle 4.1, gradle 도구 빌드 3.0.1
Nerius Jok

1
!details.requested.name.contains('multidex')정말로 도움이되었던 것을 포함시키는 것을 확인하십시오 .
Jonah Starling

2
나는 이것을 시도했지만 com.android.support 충돌에서만 작동했습니다. com.google.firebase : firebase-analytics 충돌에 대해서는 작동하지 않았습니다. 'contains'가 너무 많은 패키지와 일치하는 것 같습니다. 모든 충돌 에 대해이 게시물 에서 더 간단한 솔루션을 대신 사용했으며 완벽하게 작동했습니다.
Jacob Joel

2
@ user3908686이 문제를 해결했지만 설명해주세요. 왜 이것을 추가해야합니까 ??
ArgaPK

81

나는 같은 오류가 있었고 내 문제를 해결했습니다. 내 라이브러리에서 컴파일 또는 구현을 사용하는 대신 "api"를 사용합니다. 그래서 결국 내 의존성 :

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

이 링크에서 "api", "implementation"에 대한 자세한 정보를 찾을 수 있습니다. https://stackoverflow.com/a/44493379/3479489


36
모든 안드로이드 스튜디오는 구현 사용을 권장합니다.이 색다른 솔루션이 작동합니다. Android 스튜디오의 Google 엔지니어는 세상에서 배울 수있는 교훈이 필요합니다. 얼마나 실망스러운 도구인가
Siddharth

3
이 문제를 해결 나던, 메시지가 말한다 : "안드로이드 의존성 '...............'컴파일에 대해 서로 다른 버전이"
Jorgesys

나를 위해 일하십시오. 감사합니다
Duan Nguyen

@KeithLoughnane이 나쁜 방법이 아닙니다, 할 수있는 올바른 방법은 그것을 및 설명서가 추천하는 방법
Yayo 아레야노

1
@YayoArellano 구현은 절대적으로 필요한 경우 api를 현명하게 사용하는 것이 좋습니다. 이것은 벽에 모든 것을 던지고 무엇이 프로그래밍을하는지 확인하는 것입니다. 그중 일부는 API가 필요할 수 있지만 전부는 아닙니다. 너무 많이 노출하고 있습니다.
Keith Loughnane

22

gradle -q dependencies여기에 설명 된대로 프로젝트에 대해 올바른 명령을 실행하여 어떤 종속성이 이상한 버전을 전이 종속성으로 가져 오는지 정확히 볼 수 있어야합니다 .

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

가져 오는 항목을 추적하면 다음과 같이 gradle 파일의 특정 종속성에 제외를 추가 할 수 있습니다.

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

안녕하세요, gradle 종속성 명령을 실행했으며 여기에 스크린 샷 URL imgur.com/dL35BaN을 게시하고 있습니다. 내 프로젝트에서 Firebase를 사용하지 않습니다. GCM 라인, 그것은 그래도 작동하지 않았다 추가
DroidLearner

@DroidLearner 뭔가 빠졌을 수 있지만 게시 한 스크린 샷에 com.android.support:support-compat에 대한 참조가 없습니다. 또한 해당 스크린 샷에는 OP의 gradle 파일에 표시되지 않는 '컴파일'구성을 나타내는 경고가 있습니다. : core 하위 모듈에서 오는 것 같습니다. 거기에서 관련 gradle 정보를 게시 할 수 있습니까?
jdonmoyer

안녕하세요, 여기에 종속성 트리가있는 전체 gradle 파일을 게시합니다. 앱 gradle 파일-> gist.github.com/anonymous/93affc0d75eb96b59f9fde51332b9716 코어 gradle 파일-> gist.github.com/anonymous/5c85031f26ff766109061ab1f00b833d 종속성 트리-> gist.github. com / anonymous / 71dd33b6fa4dc63dd357889e8aff01ee 도움이 되었기를 바랍니다 .
DroidLearner

1
이전 버전의 라이브러리가 firebase에서 가져 오는 것 같습니다. 이는 차례로 gms의 전 이적 종속성입니다. 다른 종속성 앞에 implementation 'com.android.support:support-v4:26.0.0-beta2'를 추가하여이 작업을 수행 할 수 있습니다. 명시 적이거나 resolutionStrategy ( docs.gradle.org/current/dsl/… )를 사용하기 위해 장기적으로 전이 종속성을 끄는 것이 더 나은 방법 일 수 있습니다.
jdonmoyer

1
감사. 어떻게 든 전 이적 종속성을 수정했습니다. Gradle 빌드가 성공했습니다. 런타임시 모든 라이브러리 클래스에 오류가 표시됩니다. 오류 : retrofit2 패키지가 없습니다. 오류 : android.support.v7.app 패키지가 없습니다. 오류 : com.google.gson 패키지가 없습니다. 컴파일 시간에는 오류가 표시되지 않았습니다.
DroidLearner

16

많은 시간을 보내고 나보다 안드로이드에 대해 더 많이 아는 친구의 도움을받은 후 : 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"
        // }
    }

및 종속성

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
}

build.gradle에서

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

gradle.properties에서

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

4
resolutionStrategy.force나를 위해 일한 유일한 것입니다. 감사!
Orion Edwards

7

나를위한 대답은 이것을 내 build.gradle파일에 추가하는 것이 었습니다 .

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

제 경우에는 해결 전략을 configurations.all { .. }블록 으로 묶는 것이 필요했습니다 . configurations.all블록을 내 app/build.gradle파일에 직접 배치했습니다 (예 : configurations.all다른 항목에 중첩되지 않음).


5

이것은 나를 위해 일했습니다.

app/build.gradle종속성 섹션에 다음 행을 추가 하십시오.

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

또는 :27.1.1내 경우에는


4

프로젝트 수준 build.gradle 파일에이 코드를 추가합니다.

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

샘플 코드 :

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

android / build.gradle 파일 : classpath 'com.android.tools.build:gradle:3.3.1'에서 내 gradle 종속성을 업그레이드하여 문제를 해결했습니다 (이전에는 버전 3.2.


2

나는 Eddi가 위에서 언급 한 것을 따라 해결했습니다.

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

2

내 충돌하는 종속성을 구현에서 API로 전환하는 것이 트릭입니다. 차이점을 설명하는 mindorks의 좋은 기사가 있습니다.

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

편집하다:

여기에 내 종속성 해결도 있습니다.

 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

라이브러리 프로젝트에서 compileSdkVersiontargetSdkVersion 버전을 애플리케이션과 동일한 수준으로 만듭니다.

android {
    compileSdkVersion 28

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

또한 모든 종속성을 동일한 수준으로 만듭니다.


1

//api 'com.google.android.gms:play-services-ads:15.0.1'동기화 후 효과가 있다고 주석 처리 합니다.


1

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

제 경우에는 두 개의 다른 모듈에서 아래 구현의 두 가지 다른 버전을 가지고 있었기 때문에 두 구현을 버전 즉 : 6.0.2로 변경했으며 작동했습니다. 또한 수락 된 답변을 참조하여 종속성 해결을 작성해야 할 수도 있습니다.

앱 모듈

implementation 'com.karumi:dexter:5.0.0'

커먼즈 모듈

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
    }

이것을 gradle (프로젝트) 내부에 추가하십시오. allprojects


-7

하드 코딩 된 버전을 + 예제로 바꿉니다.

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

7
이것은 라이브러리가 당신에게서 멀어 질 수 있기 때문에 정확히 모범 사례는 아닙니다. 전의. 새 버전에서 작업이 수행되는 방식을 변경하고 갑자기 코드가 작동하지 않습니다. 최신 버전을 사용하기 위해 노력해야하지만 원치 않는 충돌 및 버그를 방지하려면 먼저 테스트 한 후 버전 번호를 수동으로 설정해야합니다.
Jonah Starling

1
좋은 습관이 아닙니다. @JonahStarling이 말한 것 외에도 오프라인 기능이 꺼져 있으면 Gradle 빌드 성능에도 영향을 미칩니다.
Ankit Batra
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.