Android bağımlılığının derleme ve çalışma zamanı için farklı bir sürümü var


105

Alınan Android Studio güncelledikten sonra Kanarya 3 için Kanarya 4 , aşağıdaki hata yapı anda atılır.

Android bağımlılığı 'com.android.support:support-support-v4', derleme (25.2.0) ve çalışma zamanı (26.0.0-beta2) sınıf yolu için farklı bir sürüme sahiptir. Aynı sürümü DependencyResolution aracılığıyla manuel olarak ayarlamalısınız.

Proje boyunca tam bir arama yaptım ve versiyon 25.1.0hiçbir yerde kullanılmıyor.

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'

}

Not: Proje, Canary 3'te iyi inşa ediliyordu


Ben de aynı sorunla karşı karşıyaydım, çünkü uygulamamda iki modül kullanıyorum, bu yüzden tüm gradle dosyaları için aynı sürüm kodunu kullandığınızdan emin olun.
Nadeem Bhat

Yanıtlar:


136

Bu kodu buildscript'inizde kullanın (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
Benim için çalıştı, ayrıntıları değiştirmeyi unutma. Sürüm numarasını kullan, sadece kopyalayıp yapıştırırsan başarısız olur
John Starr Dewar

2
En iyisi, rn 0.55, gradle 4.1, build gradle tools 3.0.1 ile çalışır
Nerius Jok

1
!details.requested.name.contains('multidex')Bana gerçekten yardım ettiğinden emin olmak .
Jonah Starling

2
Bunu denedim, ancak yalnızca com.android.support çakışması için çalıştı. Com.google.firebase: firebase-analytics çakışması için işe yaramadı. 'İçerir' çok fazla paketle eşleşiyor gibi görünüyor. Tüm çatışmalar için bu yazıdaki daha basit çözümü kullandım ve mükemmel çalıştı.
Jacob Joel

2
@ user3908686 sorunu çözdü ama lütfen açıklayın, neden bunu eklememiz gerekiyor ??
ArgaPK

81

Aynı hatayı aldım, sorunumu çözen şeydi. Benim içinde kütüphanede yerine derleme veya uygulama kullanarak i "api" kullanırlar. Sonunda bağımlılıklarım:

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

Bu bağlantıda "api", "uygulama" hakkında daha fazla bilgi bulabilirsiniz https://stackoverflow.com/a/44493379/3479489


36
Tüm android stüdyoları uygulamayı kullanmanızı önerir .. Ve bu sıra dışı çözüm işe yarıyor. Android stüdyolarındaki Google mühendislerinin dünyadan öğrenmek için bir derse ihtiyacı var. Ne sinir bozucu bir araç
Siddharth

3
sorunu çözmez, mesaj şöyle diyor: "Android bağımlılığı '...............' derleme için farklı bir sürüme sahip"
Jorgesys

Benim için çalış. Teşekkürler
Duan Nguyen

@KeithLoughnane Bu kötü bir uygulama değil, bunu yapmanın doğru yolu ve belgelerin tavsiye ettiği yol
Yayo Arellano

1
@YayoArellano uygulaması, kesinlikle gerekli olduğunda api'nin akıllıca kullanılmasıyla tavsiye edilen şeydir. Bu, her şeyi duvara fırlatmak ve programlamanın ne olduğunu görmektir. Bazılarının api'ye ihtiyacı olabilir, ancak hepsine değil. Çok fazla açığa çıkıyorsun.
Keith Loughnane

22

gradle -q dependenciesProjeniz için doğru komutu burada açıklandığı gibi çalıştırarak tek sürümde geçişli bağımlılık olarak tam olarak hangi bağımlılığın çektiğini görebilmelisiniz :

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

İçeriği çeken şeyin izini sürdükten sonra, gradle dosyanızdaki bu belirli bağımlılığa aşağıdaki gibi bir şeyle bir dışlama ekleyebilirsiniz:

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

Merhaba, gradle bağımlılık komutunu çalıştırdım ve ekran görüntüsü url'sini buraya imgur.com/dL35BaN olarak gönderiyorum. Projemde asla Firebase kullanmıyorum. Bu satır gcm olarak eklendi, yine de işe yaramadı
DroidLearner

@DroidLearner Bir şey eksik olabilir, ancak gönderdiğiniz ekran görüntüsünde com.android.support:support-compat ile ilgili herhangi bir referans göremiyorum. Ayrıca, bu ekran görüntüsünde, OP'deki gradle dosyanızda mevcut görmediğim bir 'derleme' yapılandırmasına atıfta bulunan bir uyarı var. Çekirdek alt modülünden geliyor olabilir. Oradan ilgili not bilgilerini gönderebilir misiniz?
jdonmoyer

Merhaba, size bağımlılık ağacıyla birlikte tüm gradle dosyalarını burada yayınlıyor .. app gradle dosyası -> gist.github.com/anonymous/93affc0d75eb96b59f9fde51332b9716 çekirdek gradle dosyası -> gist.github.com/anonymous/5c85031f26ff766109061ab1f00b833d bağımlılık ağacı -> gist.github. com / anonymous / 71dd33b6fa4dc63dd357889e8aff01ee Bunun yardımcı olacağını umuyoruz.
DroidLearner

1
Görünüşe göre kütüphanenin eski sürümü firebase tarafından çekiliyor, bu da gms'nin geçişli bir bağımlılığı. Başka bir bağımlılıktan önce "com.android.support:support-v4:26.0.0-beta2" uygulamasını ekleyerek muhtemelen bunu çalıştırabilirsiniz. Açık olma veya bir resolutionStratejisi ( docs.gradle.org/current/dsl/… ) kullanma lehine geçişli bağımlılıkları uzun vadede kapatmak muhtemelen daha iyi bir yaklaşımdır.
jdonmoyer

1
Teşekkürler. Bir şekilde geçişli bağımlılığı düzeltmeyi başardı. Gradle oluşturma başarılı oldu. Çalışma zamanında tüm kitaplık sınıflarında hataları gösterir. hata: retrofit2 paketi mevcut değil hata: android.support.v7.app paketi mevcut değil hata: com.google.gson paketi mevcut değil. Derleme zamanında herhangi bir hata göstermedi.
DroidLearner

16

Çok zaman geçtikten ve android hakkında benden çok daha fazlasını bilen bir arkadaşımdan yardım aldıktan sonra: 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"
        // }
    }

ve bağımlılıklar

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

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

gradle.properties içinde

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

4
resolutionStrategy.forcebenim için işe yarayan tek şeydi. Teşekkürler!
Orion Edwards

7

Benim için cevap, bunu dosyama da eklemekti build.gradle:

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

Benim durumumda, çözüm stratejisini bir configurations.all { .. }blok içine almak gerekliydi . configurations.allBloğu doğrudan dosyama yerleştirdim app/build.gradle(yani configurations.allbaşka hiçbir şeye yerleştirilmedi)


5

Bu benim için çalıştı:

Aşağıdaki satırı app/build.gradlebağımlılıklar bölümüne ekleyin :

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

veya :27.1.1benim durumumda


4

Bu kodu proje düzeyindeki build.gradle dosyanıza ekleyin.

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

Basit 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

2019'da bu bağımlılık sorununu yaşayan biri varsa, Android Studio'yu 3.4 veya sonraki bir sürüme güncelleyin


3

Bunu android / build.gradle dosyasındaki gradle bağımlılığımı yükselterek çözdüm: classpath 'com.android.tools.build:gradle:3.3.1' (Daha önce 3.2.0 sürümündeydim.


2

Eddi'nin yukarıda bahsettiği şeyi takip ederek çözdüm,

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

2

Çakışan bağımlılıklarımı uygulamadan api'ye geçirmek hile yapar. İşte mindorks tarafından yazılan farkı açıklayan güzel bir makale.

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

Düzenle:

İşte benim de bağımlılık çözümleri

 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

Kitaplık projelerinizde görün, compileSdkVersion ve targetSdkVersion sürümünü uygulamanızla aynı seviyeye getirin

android {
    compileSdkVersion 28

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

ayrıca tüm bağımlılıkları aynı seviyeye getirin


1

Ben dışarı yorum //api 'com.google.android.gms:play-services-ads:15.0.1'o senkronizasyon sonra benim için çalıştı


1

Bu satırları build.gradle dosyanıza eklemeniz yeterli

resolutionStrategy.force "com.android.support:support-media-compat:26.0.0-beta2"

ResolutionStrategy.force "com.android.support:support-v4:26.0.0-beta2"


0

Benim durumumda, iki farklı modülde aşağıdaki uygulamanın iki farklı versiyonuna sahiptim, bu yüzden her iki uygulamayı da 6.0.2 sürümlerine değiştirdim ve işe yaradı. Ayrıca, bağımlılık çözümünü yazmanız gerekebilir, kabul edilen cevaba bakın.

uygulama modülü

implementation 'com.karumi:dexter:5.0.0'

ortak modül

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
    }

bunu gradle'a (proje) ekle allprojects


-7

Sabit kodlanmış bir sürümü + örneğiyle değiştirin:

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

7
Tam olarak en iyi uygulama değildir çünkü bu, bir kütüphanenin sizden kaçmasına neden olabilir. Örn. Yeni bir sürümde işlerin yapılma şeklini değiştirirler ve aniden kodunuz çalışmaz. En son sürümü kullanmaya çalışmanız gerekirken, istenmeyen çökmeleri ve hataları önlemek için ilk önce test ettikten sonra sürüm numarasını manuel olarak ayarlamalısınız.
Jonah Starling

1
İyi bir uygulama değil. @JonahStarling'in söylediğine ek olarak, çevrimdışı özellik kapatılırsa Gradle derleme performansını da etkileyecektir.
Ankit Batra
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.