Zależność systemu Android ma inną wersję kompilacji i środowiska uruchomieniowego


105

Po zaktualizowaniu Android Studio z wersji Canary 3 do Canary 4 podczas kompilacji generowany jest następujący błąd.

Zależność systemu Android „com.android.support:support-support-v4” ma inną wersję ścieżki klas kompilacji (25.2.0) i środowiska uruchomieniowego (26.0.0-beta2). Należy ręcznie ustawić tę samą wersję za pośrednictwem DependencyResolution.

Przeprowadziłem pełne wyszukiwanie w całym projekcie i wersja 25.1.0nie jest używana.

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

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

}

Uwaga: projekt był w porządku w Canary 3


miałem również ten sam problem, ponieważ używam dwóch modułów w mojej aplikacji, więc upewnij się, że używasz tego samego kodu wersji dla wszystkich plików Gradle.
Nadeem Bhat

Odpowiedzi:


136

Użyj tego kodu w swoim 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
U mnie zadziałało, pamiętaj o zmianie details.useVersion na numer wersji, jeśli po prostu skopiujesz i wkleisz, to się nie powiedzie
John Starr Dewar

2
The best, działa z rn 0.55, gradle 4.1, build gradle tools 3.0.1
Nerius Jok

1
Włączenie tego !details.requested.name.contains('multidex')naprawdę pomogło mi.
Jonah Starling

2
Próbowałem tego, ale zadziałało tylko w przypadku konfliktu com.android.support. To nie zadziałało w przypadku konfliktu com.google.firebase: firebase-analytics. „Zawiera” wydaje się pasować do zbyt wielu pakietów. Użyłem prostszego rozwiązania w tym poście zamiast dla wszystkich konfliktów i zadziałało idealnie.
Jacob Joel,

2
@ user3908686 rozwiązał problem, ale proszę wyjaśnić, dlaczego musimy to dodać?
ArgaPK

81

Miałem ten sam błąd, co rozwiązało mój problem. W mojej bibliotece zamiast kompilacji lub implementacji używam "api". W końcu moje zależności:

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

Więcej informacji na temat „api” i „implementacji” można znaleźć pod tym linkiem https://stackoverflow.com/a/44493379/3479489


36
Całe studio Android zaleca korzystanie z implementacji ... I to niecodzienne rozwiązanie działa. Inżynierowie Google w studiach Android potrzebują lekcji, aby uczyć się od świata. Co za frustrujące narzędzie
Siddharth

3
nie rozwiązuje problemu, pojawia się komunikat: „Zależność Androida '...............' ma inną wersję kompilacji”
Jorgesys

Pracuj dla mnie. Dzięki
Duan Nguyen,

@KeithLoughnane To nie jest zła praktyka, to właściwy sposób i sposób, w jaki zaleca dokumentacja
Yayo Arellano

1
Implementacja @YayoArellano jest zalecana przy rozsądnym korzystaniu z interfejsu API, gdy jest to absolutnie wymagane. To rzucić wszystko na ścianę i zobaczyć, co trzyma programowanie. Niektóre z nich mogą wymagać interfejsu API, ale nie wszystkie. Za dużo odsłaniasz.
Keith Loughnane

22

Powinieneś być w stanie zobaczyć dokładnie, która zależność pobiera nieparzystą wersję jako zależność przechodnią, uruchamiając odpowiednie gradle -q dependenciespolecenie dla twojego projektu, jak opisano tutaj:

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

Po wyśledzeniu, co go przyciąga, możesz dodać wykluczenie do tej konkretnej zależności w swoim pliku gradle za pomocą czegoś takiego:

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

Cześć, uruchomiłem polecenie zależności gradle i zamieszczam tutaj adres URL zrzutu ekranu, imgur.com/dL35BaN. Nigdy nie używam Firebase w moim projekcie. Dodano tę linię w gcm, ale to nie działało
DroidLearner

@DroidLearner Mogę czegoś brakować, ale na opublikowanym zrzucie ekranu nie widzę żadnego odniesienia do com.android.support:support-compat. Na tym zrzucie ekranu jest również ostrzeżenie, które odnosi się do konfiguracji „kompilacji”, której nie widzę w pliku gradle w OP. prawdopodobnie pochodzi z podmodułu: core. Czy możesz tam opublikować odpowiednie informacje o stopniach?
jdonmoyer

Cześć, przesyłam Ci wszystkie pliki Gradle z drzewem zależności tutaj .. plik gradle aplikacji -> gist.github.com/anonymous/93affc0d75eb96b59f9fde51332b9716 podstawowy plik gradle -> gist.github.com/anonymous/5c85031f26ff766109061ab1f00b833d drzewo zależności -> gist.github.com/anonymous/5c85031f26ff766109061ab1f00b833d drzewo zależności . com / anonymous / 71dd33b6fa4dc63dd357889e8aff01ee Mam nadzieję, że to pomoże.
DroidLearner

1
Wygląda na to, że starsza wersja biblioteki jest pobierana przez firebase, co z kolei jest przechodnią zależnością gms. Prawdopodobnie możesz to osiągnąć, dodając: implementację „com.android.support:support-v4:26.0.0-beta2” przed jakąkolwiek inną zależnością. Długotrwałe wyłączenie zależności przechodnich na rzecz jawności lub użycie strategii resolution ( docs.gradle.org/current/dsl/… ) jest prawdopodobnie lepszym podejściem.
jdonmoyer

1
Dzięki. Jakoś udało się naprawić zależność przechodnią. Budowa Gradle powiodła się. W czasie wykonywania pokazuje błędy ze wszystkimi klasami biblioteki. błąd: pakiet retrofit2 nie istnieje błąd: pakiet android.support.v7.app nie istnieje błąd: pakiet com.google.gson nie istnieje. W czasie kompilacji nie pokazywał żadnych błędów.
DroidLearner

16

Po długim czasie i uzyskaniu pomocy od znajomego, który wie o wiele więcej niż ja o Androidzie: 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"
        // }
    }

i zależności

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
}

w build.gradle

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

w gradle.properties

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

4
resolutionStrategy.forcebyła jedyną rzeczą, która działała dla mnie. Dzięki!
Orion Edwards

7

Odpowiedzią dla mnie było również dodanie tego do mojego build.gradlepliku:

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

W moim przypadku konieczne było zamknięcie strategii rozwiązania w configurations.all { .. }bloku. Umieściłem configurations.allblok bezpośrednio w moim app/build.gradlepliku (tj. configurations.allNie został zagnieżdżony w niczym innym)


5

To zadziałało dla mnie:

Dodaj następującą linię w app/build.gradlesekcji zależności:

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

lub :27.1.1w moim przypadku


4

Dodaj ten kod do pliku build.gradle na poziomie projektu.

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

Przykładowy kod :

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

Jeśli ktoś napotka ten problem z zależnościami w 2019, zaktualizuj Android Studio do wersji 3.4 lub nowszej


3

Rozwiązałem to, uaktualniając zależność od gradle w pliku android / build.gradle: classpath 'com.android.tools.build:gradle:3.3.1' (poprzednio korzystałem z wersji 3.2.


2

Rozwiązałem to, postępując zgodnie z powyższym wspomnieniem Eddiego,

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

2

Przełączenie moich sprzecznych zależności z implementacji na API załatwia sprawę. Oto dobry artykuł Mindorks wyjaśniający różnicę.

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

Edytować:

Oto także moje postanowienia dotyczące zależności

 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

Zobacz w swoich projektach biblioteki, aby wersja compileSdkVersion i targetSdkVersion była na tym samym poziomie, co Twoja aplikacja

android {
    compileSdkVersion 28

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

również ustaw wszystkie zależności na tym samym poziomie


1

Komentuję, //api 'com.google.android.gms:play-services-ads:15.0.1'że zadziałało to po synchronizacji


1

Po prostu dodaj te linie do pliku 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

W moim przypadku miałem dwie różne wersje poniższej implementacji w dwóch różnych modułach, więc zmieniłem obie implementacje na wersje tj .: 6.0.2 i zadziałało. Być może będziesz musiał napisać rozwiązanie zależności, zobacz zaakceptowaną odpowiedź.

moduł aplikacji

implementation 'com.karumi:dexter:5.0.0'

moduł wspólny

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
    }

dodaj to do gradle (projektu) w środku allprojects


-7

Zastąp wersję zakodowaną na + przykład:

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

7
Niezupełnie najlepsza praktyka, ponieważ może to spowodować, że biblioteka od ciebie ucieknie. Dawny. Zmieniają sposób działania w nowej wersji i nagle twój kod nie działa. Chociaż powinieneś starać się używać najnowszej wersji, powinieneś ręcznie ustawić numer wersji po jej przetestowaniu, aby zapobiec niechcianym awariom i błędom.
Jonah Starling

1
Nie jest to dobra praktyka. Oprócz tego, co powiedział @JonahStarling, wpłynie to również na wydajność kompilacji Gradle, jeśli funkcja offline jest wyłączona.
Ankit Batra,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.