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


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

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


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

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

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)


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


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

3

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


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.


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

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

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


1

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


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"


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'

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


-7

Ganti versi hard code ke + contoh:

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

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.