Phụ thuộc Android có phiên bản khác nhau cho biên dịch và thời gian chạy


105

Sau khi cập nhật Android Studio từ Canary 3 lên Canary 4 , lỗi sau xảy ra tại thời điểm xây dựng.

Phụ thuộc Android 'com.android.support:support-support-v4' có phiên bản khác nhau cho classpath biên dịch (25.2.0) và thời gian chạy (26.0.0-beta2). Bạn nên đặt cùng một phiên bản theo cách thủ công thông qua DependencyResolution.

Tôi đã tìm kiếm toàn bộ dự án và phiên bản 25.1.0này không được sử dụng ở đâu.

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'

}

Lưu ý: Dự án đang xây dựng tốt ở Canary 3


tôi cũng gặp phải vấn đề tương tự, vì tôi đang sử dụng hai mô-đun trong ứng dụng của mình, vì vậy hãy đảm bảo rằng bạn đang sử dụng cùng một mã phiên bản cho tất cả các tệp gradle.
Nadeem Bhat

Câu trả lời:


136

Sử dụng mã này trong bản xây dựng của bạn (gốc 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
Nó làm việc cho tôi, hãy nhớ thay đổi details.useVersion đến một số phiên bản, nếu bạn chỉ cần sao chép và dán nó sẽ thất bại
John Starr Dewar

2
Tốt nhất, hoạt động với rn 0.55, gradle 4.1, xây dựng các công cụ gradle 3.0.1
Nerius Jok

1
Đảm bảo bao gồm những điều !details.requested.name.contains('multidex')thực sự đã giúp tôi.
Jonah Starling

2
Tôi đã thử điều này, nhưng nó chỉ hoạt động đối với xung đột com.android.support. Nó không hoạt động đối với xung đột com.google.firebase: firebase-analytics. Có vẻ như 'chứa' quá nhiều gói. Tôi đã sử dụng giải pháp đơn giản hơn trong bài đăng này thay cho tất cả các xung đột và nó hoạt động hoàn hảo.
Jacob Joel

2
@ user3908686 đã giải quyết được vấn đề nhưng vui lòng giải thích, tại sao chúng ta cần thêm điều này ??
ArgaPK

81

Tôi đã có cùng một lỗi, những gì giải quyết được vấn đề của tôi. Trong thư viện của tôi thay vì sử dụng biên dịch hoặc triển khai, tôi sử dụng "api". Vì vậy, cuối cùng các phụ thuộc của tôi:

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

Bạn có thể tìm thêm thông tin về "api", "thực hiện" trong liên kết này https://stackoverflow.com/a/44493379/3479489


36
Tất cả các studio android đều khuyến nghị sử dụng triển khai .. Và giải pháp bất thường này hoạt động. Các kỹ sư của Google tại các studio android cần một bài học để học hỏi từ thế giới. Thật là một công cụ bực bội
Siddharth

3
nó doesn't giải quyết vấn đề, thông điệp nói: "Android phụ thuộc '...............' có phiên bản khác nhau cho các biên dịch"
Jorgesys

Làm việc cho tôi. Cảm ơn
Duẩn Nguyễn

@KeithLoughnane Đây không phải là thói quen xấu, là cách chính xác để làm điều đó và cách các tài liệu giới thiệu
Yayo Arellano

1
Triển khai @YayoArellano là những gì được khuyến nghị với việc sử dụng hợp lý api khi thực sự cần thiết. Đây là ném mọi thứ vào tường và xem những gì dính lập trình. Một số có thể cần api nhưng không phải tất cả chúng. Bạn đang phơi bày quá nhiều.
Keith Loughnane

22

Bạn sẽ có thể biết chính xác phụ thuộc nào đang kéo trong phiên bản lẻ dưới dạng phụ thuộc bắc cầu bằng cách chạy gradle -q dependencieslệnh chính xác cho dự án của bạn như được mô tả ở đây:

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

Khi bạn theo dõi những gì đang kéo nó vào, bạn có thể thêm một loại trừ cho phần phụ thuộc cụ thể đó trong tệp gradle của mình bằng những thứ như:

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

Xin chào, tôi đã chạy lệnh phụ thuộc gradle và tôi đang đăng url ảnh chụp màn hình ở đây, imgur.com/dL35BaN. Tôi không bao giờ sử dụng Firebase trong dự án của mình. Nói thêm rằng dòng trong GCM, nó đã không làm việc mặc dù
DroidLearner

@DroidLearner Tôi có thể thiếu thứ gì đó nhưng tôi không thấy bất kỳ tham chiếu nào đến com.android.support:support-compat trong ảnh chụp màn hình bạn đã đăng. Ngoài ra, có một cảnh báo trong ảnh chụp màn hình đó đề cập đến cấu hình 'biên dịch' mà tôi không thấy xuất hiện trong tệp gradle của bạn trong OP. có khả năng là nó đến từ: mô-đun con cốt lõi. Bạn có thể đăng thông tin về lớp có liên quan từ đó không?
jdonmoyer

Xin chào, đăng cho bạn toàn bộ tệp gradle với cây phụ thuộc tại đây .. tệp gradle ứng dụng -> gist.github.com/anonymous/93affc0d75eb96b59f9fde51332b9716 tệp lõi gradle -> gist.github.com/anonymous/5c85031f26ff766109061ab1f00b833d cây phụ thuộc -> gist.github. com / nặc danh / 71dd33b6fa4dc63dd357889e8aff01ee Hy vọng điều này sẽ hữu ích.
DroidLearner

1
Có vẻ như phiên bản cũ hơn của thư viện đang được firebase kéo vào, do đó nó là một phụ thuộc bắc cầu của gms. Bạn có thể làm cho điều này hoạt động bằng cách thêm: implement 'com.android.support:support-v4:26.0.0-beta2' trước bất kỳ sự phụ thuộc nào khác. Về lâu dài, việc tắt các phụ thuộc bắc cầu có lợi cho sự rõ ràng hoặc sử dụng một giải phápStrategy ( docs.gradle.org/current/dsl/… ) có thể là một cách tiếp cận tốt hơn.
jdonmoyer 13/07/17

1
Cảm ơn. Bằng cách nào đó đã quản lý để khắc phục sự phụ thuộc bắc cầu. Đã xây dựng thành công Gradle. Trong thời gian chạy, nó hiển thị lỗi với tất cả các lớp thư viện. error: package retrofit2 không tồn tại lỗi: package android.support.v7.app không tồn tại lỗi: package com.google.gson không tồn tại. Tại thời điểm biên dịch, nó không hiển thị bất kỳ lỗi nào.
DroidLearner 14/07/17

16

Sau rất nhiều thời gian và nhận được sự giúp đỡ từ một người bạn biết nhiều hơn tôi về 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"
        // }
    }

và phụ thuộc

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
}

trong build.gradle

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

trong gradle.properties

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

4
resolutionStrategy.forcelà điều duy nhất làm việc cho tôi. Cảm ơn!
Orion Edwards

7

Câu trả lời cho tôi là cũng thêm cái này vào build.gradletệp của tôi :

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

Trong trường hợp của tôi, thật khó để đưa chiến lược phân giải vào một configurations.all { .. }khối. Tôi đã đặt configurations.allkhối trực tiếp vào app/build.gradletệp của mình (tức configurations.alllà không được lồng trong bất kỳ thứ gì khác)


5

Điều này đã làm việc cho tôi:

Thêm dòng tiếp theo app/build.gradletrong phần phụ thuộc:

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

hoặc :27.1.1trong trường hợp của tôi


4

Thêm mã này vào tệp build.gradle cấp dự án của bạn.

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

Mã mẫu:

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

Nếu bất kỳ ai gặp sự cố phụ thuộc này vào năm 2019, hãy cập nhật Android Studio lên 3.4 trở lên


3

Tôi đã giải quyết nó bằng cách nâng cấp sự phụ thuộc gradle của mình trong tệp android / build.gradle: classpath 'com.android.tools.build:gradle:3.3.1' (Trước đây tôi đã sử dụng phiên bản 3.2.


2

Tôi đã giải quyết nó bằng cách làm theo những gì Eddi đã đề cập ở trên,

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

2

Chuyển các phụ thuộc xung đột của tôi từ triển khai sang api thực hiện một mẹo nhỏ. Đây là một bài báo hay của mindorks giải thích sự khác biệt.

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

Biên tập:

Đây cũng là các giải pháp phụ thuộc của tôi

 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

Xem các dự án thư viện của bạn làm cho compileSdkVersiontargetSdkVersion phiên bản với cùng mức độ như ứng dụng của bạn là

android {
    compileSdkVersion 28

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

cũng làm cho tất cả các phụ thuộc ở cùng một mức độ


1

Tôi nhận xét rằng //api 'com.google.android.gms:play-services-ads:15.0.1'nó có hiệu quả với tôi sau khi đồng bộ hóa


1

Chỉ cần thêm những dòng này vào tệp build.gradle của bạn

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

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


0

Trong trường hợp của tôi, tôi đang có hai phiên bản khác nhau của việc triển khai bên dưới trong hai mô-đun khác nhau, Vì vậy, tôi đã thay đổi cả hai phiên bản triển khai thành phiên bản tức là: 6.0.2 và nó đã hoạt động. Bạn cũng có thể cần phải viết giải pháp phụ thuộc để xem câu trả lời được chấp nhận.

mô-đun ứng dụng

implementation 'com.karumi:dexter:5.0.0'

mô-đun 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
    }

thêm cái này vào gradle (dự án) bên trong allprojects


-7

Thay thế phiên bản được mã hóa cứng thành + ví dụ:

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

7
Không hẳn là phương pháp hay nhất vì điều này có thể khiến một thư viện chạy trốn khỏi bạn. Ví dụ. Chúng thay đổi cách mọi thứ được thực hiện trong một phiên bản mới và đột nhiên mã của bạn không hoạt động. Mặc dù bạn nên cố gắng sử dụng phiên bản mới nhất, nhưng bạn nên đặt số phiên bản theo cách thủ công sau khi thử nghiệm trước để tránh sự cố và lỗi không mong muốn.
Jonah Starling

1
Không phải là một thực hành tốt. Ngoài những gì @JonahStarling đã nói, nó cũng sẽ ảnh hưởng đến hiệu suất xây dựng Gradle nếu tính năng ngoại tuyến bị tắt.
Ankit Batra
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.