Dependensi Android memiliki versi berbeda untuk kompilasi dan runtime

105

Setelah memperbarui Android Studio dari Canary 3 ke Canary 4 , kesalahan berikut muncul pada waktu pembuatan.

Ketergantungan Android 'com.android.support:support-support-v4' memiliki versi berbeda untuk classpath kompilasi (25.2.0) dan runtime (26.0.0-beta2). Anda harus menyetel versi yang sama secara manual melalui DependencyResolution.

Saya menjalankan pencarian lengkap di seluruh proyek dan versinya 25.1.0tidak digunakan.

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'

}

Catatan: Proyek sedang dibangun dengan baik di Canary 3

DroidLearner
sumber
saya juga menghadapi masalah yang sama, karena saya menggunakan dua modul di aplikasi saya, jadi pastikan Anda menggunakan kode versi yang sama untuk semua file gradle.
Nadeem Bhat

Jawaban:

136

Gunakan kode ini di buildscript Anda (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"
        }
     }
  }
}
pengguna3908686
sumber
8
Ini berhasil untuk saya, ingatlah untuk mengubah detail. UseVersion ke nomor versi, jika Anda hanya menyalin & menempelkannya akan gagal
John Starr Dewar
2
Terbaik, bekerja dengan rn 0.55, gradle 4.1, build gradle tools 3.0.1
Nerius Jok
1
Memastikan untuk memasukkan yang !details.requested.name.contains('multidex')benar - benar membantu saya.
Jonah Starling
2
Saya mencoba ini, tetapi hanya berfungsi untuk konflik com.android.support. Tidak berhasil untuk konflik com.google.firebase: firebase-analytics. 'Berisi' tampaknya cocok dengan terlalu banyak paket. Saya menggunakan solusi yang lebih sederhana di posting ini alih-alih untuk semua konflik dan itu bekerja dengan sempurna.
Jacob Joel
2
@ user3908686 menyelesaikan masalah tapi tolong jelaskan, mengapa kita perlu menambahkan ini ??
ArgaPK
81

Saya mengalami kesalahan yang sama, yang memecahkan masalah saya. Di perpustakaan saya daripada menggunakan kompilasi atau implementasi, saya menggunakan "api". Jadi pada akhirnya ketergantungan saya:

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

Anda dapat menemukan info lebih lanjut tentang "api", "implementasi" di tautan ini https://stackoverflow.com/a/44493379/3479489

Yayo Arellano
sumber
36
Semua studio android merekomendasikan penggunaan implementasi .. Dan solusi offbeat ini berhasil. Teknisi Google di studio android membutuhkan pelajaran untuk dipelajari dari dunia. Alat yang membuat frustrasi
Siddharth
3
itu tidak menyelesaikan masalah, pesan mengatakan: "Android dependency '...............' memiliki versi yang berbeda untuk kompilasi"
Jorgesys
Bekerja untuk saya. Terima kasih
Duan Nguyen
@KeithLoughnane Ini bukan praktik yang buruk, adalah cara yang benar untuk melakukannya dan cara yang direkomendasikan oleh dokumentasi
Yayo Arellano
1
Implementasi @YayoArellano direkomendasikan dengan penggunaan api yang bijaksana jika benar-benar diperlukan. Ini membuang segalanya ke dinding dan melihat apa yang menempel pemrograman. Beberapa dari mereka mungkin membutuhkan api tetapi tidak semuanya. Anda mengekspos terlalu banyak.
Keith Loughnane
22

Anda harus dapat melihat dengan tepat dependensi mana yang menarik versi ganjil sebagai dependensi transitif dengan menjalankan gradle -q dependenciesperintah yang benar untuk project Anda seperti yang dijelaskan di sini:

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

Setelah Anda melacak apa yang menariknya, Anda dapat menambahkan pengecualian ke dependensi spesifik tersebut di file gradle Anda dengan sesuatu seperti:

implementation("XXXXX") {
    exclude group: 'com.android.support', module: 'support-compat'
}
jdonmoyer
sumber
Hai, Saya menjalankan perintah ketergantungan gradle dan saya memposting url tangkapan layar di sini, imgur.com/dL35BaN. Saya tidak pernah menggunakan Firebase dalam proyek saya. Menambahkan baris itu di gcm, itu tidak berfungsi
DroidLearner
@DroidLearner Saya mungkin melewatkan sesuatu, tetapi saya tidak melihat referensi apa pun ke com.android.support:support-compat di tangkapan layar yang Anda posting. Juga ada peringatan di tangkapan layar itu yang mengacu pada konfigurasi 'kompilasi' yang saya tidak lihat ada di file gradle Anda di OP. kemungkinan itu berasal dari: submodul inti. Dapatkah Anda memposting informasi gradle yang relevan dari sana?
jdonmoyer
Hi, posting Anda seluruh file Gradle dengan pohon dependensi disini .. berkas aplikasi Gradle -> gist.github.com/anonymous/93affc0d75eb96b59f9fde51332b9716 inti Gradle File -> gist.github.com/anonymous/5c85031f26ff766109061ab1f00b833d ketergantungan pohon -> gist.github. com / anonymous / 71dd33b6fa4dc63dd357889e8aff01ee Semoga ini bisa membantu.
DroidLearner
1
Sepertinya versi library yang lebih lama ditarik oleh firebase, yang pada gilirannya merupakan dependensi transitif dari gms. Anda mungkin bisa membuatnya berfungsi dengan menambahkan: implementasi 'com.android.support:support-v4:26.0.0-beta2' sebelum ketergantungan lainnya. Menonaktifkan dependensi transitif dalam jangka panjang untuk menjadi eksplisit atau menggunakan resolutionStrategy ( docs.gradle.org/current/dsl/… ) kemungkinan merupakan pendekatan yang lebih baik.
jdonmoyer
1
Terima kasih. Entah bagaimana berhasil memperbaiki ketergantungan transitif. Pembangunan Gradle berhasil. Saat runtime, kesalahan ini ditampilkan dengan semua kelas perpustakaan. error: paket retrofit2 tidak ada error: paket android.support.v7.app tidak ada error: paket com.google.gson tidak ada. Pada waktu kompilasi tidak menunjukkan kesalahan apapun.
DroidLearner
16

Setelah banyak waktu dan mendapatkan bantuan dari seorang teman yang tahu lebih banyak dari saya tentang 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"
        // }
    }

dan ketergantungan

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
}

di build.gradle

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

di gradle.properties

android.useDeprecatedNdk=true
android.enableAapt2=false
org.gradle.jvmargs=-Xmx4608M
Stefano Solinas - obsidianart
sumber
4
resolutionStrategy.forceadalah satu-satunya hal yang berhasil bagi saya. Terima kasih!
Orion Edwards
7

Jawaban bagi saya adalah menambahkan ini ke build.gradlefile saya :

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

Dalam kasus saya, strategi resolusi harus disertakan dalam satu configurations.all { .. }blok. Saya menempatkan configurations.allblok langsung ke app/build.gradlefile saya (yaitu configurations.alltidak bersarang di hal lain)

Dacre Denny
sumber
5

Ini berhasil untuk saya:

Tambahkan baris ikuti app/build.gradledi bagian dependensi:

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

atau :27.1.1dalam kasus saya

ALEXANDER LOZANO
sumber
4

Tambahkan kode ini di file build.gradle level project Anda.

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

Kode sampel :

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

Jika ada yang mendapatkan masalah ketergantungan ini pada tahun 2019, perbarui Android Studio ke 3.4 atau yang lebih baru

Atul Vasudev A
sumber
3

Saya menyelesaikannya dengan memutakhirkan ketergantungan gradle saya di file android / build.gradle: classpath 'com.android.tools.build:gradle:3.3.1' (Saya sebelumnya menggunakan versi 3.2.

Ajani Eniola
sumber
2

Saya menyelesaikannya dengan mengikuti apa yang Eddi sebutkan di atas,

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

Mengalihkan ketergantungan saya yang bertentangan dari implementasi ke api bisa membantu. Inilah artikel bagus oleh mindorks yang menjelaskan perbedaannya.

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

Edit:

Inilah resolusi ketergantungan saya juga

 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"
                }
            }
        }
    }
saya E
sumber
2

Lihat di proyek perpustakaan Anda membuat versi compileSdkVersion dan targetSdkVersion ke level yang sama dengan aplikasi Anda

android {
    compileSdkVersion 28

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

juga membuat semua dependensi ke level yang sama

Ali Imran
sumber
1

Saya berkomentar bahwa //api 'com.google.android.gms:play-services-ads:15.0.1'itu berhasil untuk saya setelah sinkronisasi

Fredrick Reuben
sumber
1

Cukup tambahkan baris ini di file build.gradle Anda

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

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

tushar
sumber
0

Dalam kasus saya, saya memiliki dua versi berbeda dari implementasi di bawah ini dalam dua modul yang berbeda, jadi saya mengubah kedua implementasi ke versi yaitu: 6.0.2 dan berhasil. Anda mungkin juga perlu menulis resolusi ketergantungan untuk melihat jawaban yang diterima.

modul aplikasi

implementation 'com.karumi:dexter:5.0.0'

modul commons

implementation 'com.karumi:dexter:6.0.2'
Divyanshu Kumar
sumber
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
    }

tambahkan ini ke gradle (proyek) di dalamnya allprojects

Farido mastr
sumber
-7

Ganti versi hard code ke + contoh:

implementation 'com.google.android.gms:play-services-base:+'
implementation 'com.google.android.gms:play-services-maps:+'
Sarmad Shah
sumber
7
Bukan praktik terbaik karena hal ini dapat menyebabkan perpustakaan menjauh dari Anda. Ex. Mereka mengubah cara melakukan sesuatu di versi baru dan tiba-tiba kode Anda tidak berfungsi. Meskipun Anda harus berusaha untuk menggunakan versi terbaru, Anda harus mengatur nomor versi secara manual setelah mengujinya terlebih dahulu untuk mencegah crash dan bug yang tidak diinginkan.
Jonah Starling
1
Bukan praktik yang baik. Selain apa yang dikatakan @JonahStarling, itu juga akan memengaruhi performa build Gradle jika fitur offline dinonaktifkan.
Ankit Batra