การพึ่งพา Android มีเวอร์ชันที่แตกต่างกันสำหรับการคอมไพล์และรันไทม์


105

หลังจากอัปเดต Android Studio จากCanary 3เป็นCanary 4ข้อผิดพลาดต่อไปนี้จะเกิดขึ้นในเวลาสร้าง

การพึ่งพา Android 'com.android.support:support-support-v4' มีเวอร์ชันที่แตกต่างกันสำหรับ classpath คอมไพล์ (25.2.0) และรันไทม์ (26.0.0-beta2) คุณควรตั้งค่าเวอร์ชันเดียวกันด้วยตนเองผ่าน DependencyResolution

ฉันทำการค้นหาอย่างสมบูรณ์ตลอดทั้งโครงการและ25.1.0ไม่มีเวอร์ชันที่ใช้

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

ไลบรารี 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'

}

หมายเหตุ:โครงการได้รับการปรับปรุงใน Canary 3


ฉันก็ประสบปัญหาเดียวกันเช่นกันเนื่องจากฉันใช้สองโมดูลในแอปของฉันดังนั้นตรวจสอบให้แน่ใจว่าคุณใช้รหัสเวอร์ชันเดียวกันสำหรับไฟล์ gradle ทั้งหมด
Nadeem Bhat

คำตอบ:


136

ใช้รหัสนี้ใน 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
มันใช้ได้ผลสำหรับฉันอย่าลืมเปลี่ยน details.useVersion เป็นหมายเลขเวอร์ชันหากคุณเพียงแค่คัดลอกและวางมันจะล้มเหลว
John Starr Dewar

2
ดีที่สุดทำงานร่วมกับ rn 0.55, gradle 4.1, build gradle tools 3.0.1
Nerius Jok

1
อย่าลืมรวม!details.requested.name.contains('multidex')สิ่งที่ช่วยฉันไว้ด้วย
Jonah Starling

2
ฉันลองแล้ว แต่ใช้ได้กับข้อขัดแย้ง com.android.support เท่านั้น ใช้ไม่ได้กับข้อขัดแย้ง com.google.firebase: firebase-analytics ดูเหมือนว่า 'มี' จะตรงกับแพ็คเกจมากเกินไป ฉันใช้วิธีแก้ปัญหาที่ง่ายกว่าในโพสต์นี้แทนสำหรับความขัดแย้งทั้งหมดและมันก็ทำงานได้อย่างสมบูรณ์
Jacob Joel

2
@ user3908686 แก้ไขปัญหาได้ แต่ช่วยอธิบายทำไมเราต้องเพิ่มสิ่งนี้ ??
ArgaPK

81

ฉันมีข้อผิดพลาดเดียวกันสิ่งที่ช่วยแก้ปัญหาของฉันคือ ในไลบรารีของฉันแทนที่จะใช้คอมไพล์หรือการใช้งานฉันใช้ "api" ดังนั้นในท้ายที่สุดการอ้างอิงของฉัน:

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

คุณสามารถดูข้อมูลเพิ่มเติมเกี่ยวกับ "api" "การใช้งาน" ได้ในลิงค์นี้https://stackoverflow.com/a/44493379/3479489


36
สตูดิโอ Android ทั้งหมดแนะนำให้ใช้การใช้งาน .. และโซลูชันที่ผิดปกตินี้ใช้งานได้ วิศวกรของ Google ที่สตูดิโอ Android ต้องการบทเรียนเพื่อเรียนรู้จากโลก ช่างเป็นเครื่องมือที่น่าผิดหวัง
Siddharth

3
ไม่สามารถแก้ปัญหาได้ข้อความระบุว่า: "การพึ่งพา Android" ............... "มีเวอร์ชันที่แตกต่างกันสำหรับการคอมไพล์"
Jorgesys

ทำงานให้ฉัน ขอบคุณ
Duan Nguyen

@KeithLoughnane นี่ไม่ใช่การปฏิบัติที่ไม่ดีเป็นวิธีที่ถูกต้องในการทำและวิธีที่เอกสารแนะนำ
Yayo Arellano

1
การใช้งาน @YayoArellano คือสิ่งที่แนะนำให้ใช้ API อย่างรอบคอบในกรณีที่จำเป็น นี่คือการโยนทุกอย่างไปที่กำแพงและดูว่าแท่งอะไร บางคนอาจต้องการ api แต่ไม่ใช่ทั้งหมด คุณกำลังเปิดเผยมากเกินไป
Keith Loughnane

22

คุณควรจะสามารถดูได้อย่างชัดเจนว่าการอ้างอิงใดที่ดึงมาในเวอร์ชันแปลกเป็นการอ้างอิงแบบสกรรมกริยาโดยเรียกใช้gradle -q dependenciesคำสั่งที่ถูกต้องสำหรับโครงการของคุณตามที่อธิบายไว้ที่นี่:

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

เมื่อคุณติดตามสิ่งที่ดึงเข้ามาคุณสามารถเพิ่มการยกเว้นให้กับการอ้างอิงเฉพาะนั้นในไฟล์ gradle ของคุณด้วยสิ่งต่างๆเช่น:

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

สวัสดีฉันรันคำสั่ง gradle dependency และกำลังโพสต์ URL สกรีนช็อตที่นี่ imgur.com/dL35BaN ฉันไม่เคยใช้ Firebase ในโครงการของฉัน เพิ่มบรรทัดนั้นใน gcm แต่ก็ไม่ได้ผล
DroidLearner

@DroidLearner ฉันอาจจะขาดอะไรไป แต่ฉันไม่เห็นการอ้างอิงถึง com.android.support:support-compat ในภาพหน้าจอที่คุณโพสต์ นอกจากนี้ยังมีคำเตือนในภาพหน้าจอที่อ้างถึงการกำหนดค่า 'คอมไพล์' ซึ่งฉันไม่เห็นอยู่ในไฟล์ gradle ของคุณใน OP เป็นไปได้ว่ามันมาจากโมดูลย่อย: core คุณสามารถโพสต์ข้อมูลการไล่ระดับสีที่เกี่ยวข้องจากที่นั่นได้หรือไม่?
jdonmoyer

สวัสดีคุณโพสต์ไฟล์ gradle ทั้งหมดที่มีต้นไม้พึ่งพานี่ .. แอปไฟล์ gradle -> gist.github.com/anonymous/93affc0d75eb96b59f9fde51332b9716หลักไฟล์ gradle -> gist.github.com/anonymous/5c85031f26ff766109061ab1f00b833dต้นไม้พึ่งพา -> gist.github com / anonymous / 71dd33b6fa4dc63dd357889e8aff01ee หวังว่านี่จะช่วยได้
DroidLearner

1
ดูเหมือนว่าไลบรารีเวอร์ชันเก่าจะถูกดึงเข้ามาโดย firebase ซึ่งจะเป็นการพึ่งพาสกรรมกริยาของ gms คุณสามารถทำงานได้โดยเพิ่ม: การใช้งาน 'com.android.support:support-v4:26.0.0-beta2' ก่อนการอ้างอิงอื่น ๆ การปิดการพึ่งพาสกรรมกริยาในระยะยาวเพื่อสนับสนุนการเปิดเผยหรือใช้ ResolutionStrategy ( docs.gradle.org/current/dsl/… ) น่าจะเป็นแนวทางที่ดีกว่า
jdonmoyer

1
ขอบคุณ. จัดการเพื่อแก้ไขการพึ่งพาสกรรมกริยา สร้าง Gradle สำเร็จ ในรันไทม์แสดงข้อผิดพลาดกับคลาสไลบรารีทั้งหมด ข้อผิดพลาด: ไม่มีแพ็คเกจชุดติดตั้งเพิ่มเติมข้อผิดพลาด: ไม่มีแพ็คเกจ android.support.v7.app ข้อผิดพลาด: ไม่มีแพ็คเกจ com.google.gson ในขณะคอมไพล์จะไม่แสดงข้อผิดพลาดใด ๆ
DroidLearner

16

ใช้เวลานานและได้รับความช่วยเหลือจากเพื่อนที่รู้มากกว่าฉันเกี่ยวกับ 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"
        // }
    }

และการอ้างอิง

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

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

ใน gradle.properties

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

4
resolutionStrategy.forceเป็นสิ่งเดียวที่เหมาะกับฉัน ขอบคุณ!
Orion Edwards

7

คำตอบสำหรับฉันคือเพิ่มสิ่งนี้ลงในbuild.gradleไฟล์ของฉันด้วย:

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

ในกรณีของฉันมันเป็นเรื่องจำเป็นที่จะรวมกลยุทธ์การแก้ปัญหาไว้ในconfigurations.all { .. }บล็อก ฉันวางconfigurations.allบล็อกลงในapp/build.gradleไฟล์ของฉันโดยตรง(กล่าวconfigurations.allคือไม่ได้ซ้อนอยู่ในสิ่งอื่นใด)



4

เพิ่มรหัสนี้ในไฟล์ 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 28.0.0-beta2"
            }
        }
    }
}

รหัสตัวอย่าง:

// 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 ให้อัปเดต Android Studio เป็น 3.4 หรือใหม่กว่า


3

ฉันแก้ไขได้โดยอัปเกรดการพึ่งพาการไล่ระดับของฉันในไฟล์ android / build.gradle: classpath 'com.android.tools.build:gradle:3.3.1' (ก่อนหน้านี้ฉันใช้เวอร์ชัน 3.2


2

ฉันแก้ไขได้โดยทำตามสิ่งที่ Eddi กล่าวไว้ข้างต้น

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

2

การเปลี่ยนการอ้างอิงที่ขัดแย้งกันของฉันจากการใช้งานเป็น api จะช่วยแก้เคล็ด นี่เป็นบทความดีๆโดย mindorks ที่อธิบายความแตกต่าง

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

แก้ไข:

นี่คือมติการพึ่งพาของฉันเช่นกัน

 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

ดูในโครงการห้องสมุดของคุณทำให้เวอร์ชัน compileSdkVersionและtargetSdkVersionอยู่ในระดับเดียวกับที่แอปพลิเคชันของคุณเป็น

android {
    compileSdkVersion 28

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

ยังทำให้การอ้างอิงทั้งหมดอยู่ในระดับเดียวกัน



1

เพียงเพิ่มบรรทัดเหล่านี้ในไฟล์ 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

ในกรณีของฉันฉันมีการใช้งานด้านล่างสองเวอร์ชันที่แตกต่างกันในสองโมดูลที่แตกต่างกันดังนั้นฉันจึงเปลี่ยนการใช้งานทั้งสองเป็นเวอร์ชันเช่น 6.0.2 และใช้งานได้ คุณอาจต้องเขียนวิธีแก้ปัญหาการพึ่งพาเพื่อดูคำตอบที่ยอมรับ

โมดูลแอป

implementation 'com.karumi:dexter:5.0.0'

โมดูลคอมมอนส์

implementation 'com.karumi:dexter:6.0.2'


-7

แทนที่เวอร์ชันฮาร์ดโค้ดเป็น + ตัวอย่าง:

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

7
ไม่ใช่แนวทางปฏิบัติที่ดีที่สุดอย่างแน่นอนเพราะอาจทำให้ห้องสมุดหนีไปจากคุณได้ เช่น พวกเขาเปลี่ยนวิธีการทำสิ่งต่างๆในเวอร์ชันใหม่และทันใดนั้นโค้ดของคุณก็ไม่ทำงาน แม้ว่าคุณควรพยายามใช้เวอร์ชันล่าสุด แต่คุณควรตั้งค่าหมายเลขเวอร์ชันด้วยตนเองหลังจากทดสอบก่อนเพื่อป้องกันข้อขัดข้องและข้อบกพร่องที่ไม่ต้องการ
Jonah Starling

1
ไม่ใช่วิธีปฏิบัติที่ดี นอกจากสิ่งที่ @JonahStarling กล่าวแล้วมันจะส่งผลต่อประสิทธิภาพการสร้าง Gradle ด้วยหากปิดคุณสมบัติออฟไลน์
Ankit Batra
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.