एंड्रॉइड निर्भरता का संकलन और रनटाइम के लिए अलग-अलग संस्करण है


105

कैनरी 3 से कैनरी 4 तक एंड्रॉइड स्टूडियो को अपडेट करने के बाद , बिल्ड समय पर निम्न त्रुटि होती है।

Android निर्भरता 'com.android.support:support-support-v4' के संकलन (25.2.0) और रनटाइम (26.0.0-beta2) वर्गपथ के लिए अलग संस्करण है। आपको मैन्युअल रूप से DependencyResolution के माध्यम से एक ही संस्करण सेट करना चाहिए।

मैंने पूरे प्रोजेक्ट में पूरी खोज की और संस्करण 25.1.0का उपयोग नहीं किया गया।

ऐप-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'

}

नोट: परियोजना कैनरी 3 में ठीक निर्माण कर रही थी


मैं भी एक ही मुद्दे का सामना कर रहा था, जैसा कि मैं अपने ऐप में दो मॉड्यूल का उपयोग कर रहा हूं, इसलिए सुनिश्चित करें कि आप सभी ग्रेडिंग फ़ाइलों के लिए समान संस्करण कोड का उपयोग कर रहे हैं।
नदीम भट

जवाबों:


136

इस कोड का उपयोग अपनी बिल्डस्क्रिप्ट (बिल्ड.ग्रेडल रूट) में करें:

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
यह मेरे लिए काम करता है, विवरण बदलने के लिए याद रखें। एक संस्करण संख्या में बदलने के लिए, अगर आप इसे कॉपी और पेस्ट करेंगे तो यह विफल हो जाएगा
जॉन स्टारर देवर

2
सबसे अच्छा, आर.एन.
५.५५ के

1
!details.requested.name.contains('multidex')वास्तव में मेरी मदद करने के लिए सुनिश्चित करना शामिल है।
जोनाह स्टारिंग

2
मैंने यह कोशिश की, लेकिन यह केवल com.android.support संघर्ष के लिए काम किया। यह com.google.firebase के लिए काम नहीं करता था: फायरबेस-एनालिटिक्स संघर्ष। 'समाहित' बहुत सारे पैकेजों से मेल खाता है। मैंने इस पोस्ट में सभी संघर्षों के बजाय सरल समाधान का उपयोग किया और इसने पूरी तरह से काम किया।
याकूब जोएल

2
@ user3908686 ने इस समस्या को हल किया लेकिन कृपया समझाएं, हमें इसे जोड़ने की आवश्यकता क्यों है ??
ArgaPK

81

मेरी एक ही त्रुटि थी, मेरी समस्या का समाधान क्या था। मेरे पुस्तकालय में संकलन या कार्यान्वयन का उपयोग करने के बजाय मैं "एपीआई" का उपयोग करता हूं। तो अंत में मेरी निर्भरता:

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

आप इस लिंक https://stackoverflow.com/a/44493379/3479489 पर "api", "कार्यान्वयन" के बारे में अधिक जानकारी प्राप्त कर सकते हैं


36
सभी Android स्टूडियो कार्यान्वयन का उपयोग करने की अनुशंसा करते हैं .. और यह ऑफ़बीट समाधान काम करता है। Android स्टूडियो में Google इंजीनियरों को दुनिया से सीखने के लिए एक सबक की आवश्यकता होती है। क्या निराशाजनक उपकरण है
सिद्धार्थ

3
यह समस्या को हल नहीं करता है, संदेश कहता है: "एंड्रॉइड निर्भरता '...............' संकलन के लिए अलग संस्करण है"
जोर्जेस

मेरे लिए काम। धन्यवाद
डुआन गुयेन

@KeithLoughnane यह बुरा अभ्यास नहीं है, इसे करने का सही तरीका है और जिस तरह से प्रलेखन की सिफारिश की गई है
Yayo Arellano

1
@YayoArellano कार्यान्वयन एपी के विवेकपूर्ण उपयोग के साथ अनुशंसित है जहां बिल्कुल आवश्यक है। यह दीवार पर सब कुछ फेंक देता है और देखता है कि प्रोग्रामिंग क्या है। उनमें से कुछ को आपी की जरूरत हो सकती है लेकिन सभी की नहीं। आप बहुत अधिक उजागर कर रहे हैं।
कीथ लफ़नेन

22

आपको यह देखने में सक्षम होना चाहिए कि gradle -q dependenciesआपकी परियोजना के लिए सही कमांड को चलाकर कौन सी निर्भरता विषम संस्करण के रूप में एक सकर्मक संस्करण में खींच रही है:

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

एक बार जब आप इसे नीचे खींच रहे हैं, तो आप अपनी विशिष्ट फ़ाइल में उस विशिष्ट निर्भरता को कुछ इस तरह से जोड़ सकते हैं:

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

नमस्ते, मैंने ग्रेड निर्भरता कमांड को चलाया और मैं यहां स्क्रीनशॉट url, imgur.com/dL35BaN पोस्ट कर रहा हूं। मैं अपने प्रोजेक्ट में कभी भी फायरबेस का इस्तेमाल नहीं करता। उस लाइन को
gcm

@DroidLearner मुझे कुछ याद आ रहा है, लेकिन मैं आपके द्वारा पोस्ट किए गए स्क्रीनशॉट में com.android.support:support-compat का कोई संदर्भ नहीं देखता हूं। इसके अलावा उस स्क्रीन शॉट में एक चेतावनी है जो एक 'संकलन' विन्यास को संदर्भित करता है जिसे मैं ओपी में आपकी फ़ाइल में मौजूद नहीं देखता हूं। यह संभावना है कि यह से आ रहा है: कोर सबमॉड्यूल। क्या आप वहां से प्रासंगिक ग्रेड की जानकारी पोस्ट कर सकते हैं?
jdonmoyer

नमस्ते, आपको यहाँ पर निर्भरता के पेड़ के साथ पूरे ग्रेड की फाइलों को पोस्ट किया जा रहा है .. ऐप ग्रेड फ़ाइल -> gist.github.com/anonymous/93affc0d75eb96b59f9fde51332b9716 कोर ग्रेड फ़ाइल -> gist.github.com/anonymous/5c85031f26ff766109061ab1f00b833d निर्भरता पेड़ -> gist.github। com / अनाम / 71dd33b6fa4dc63dd357889e8aff01ee आशा है कि यह मदद करता है।
DroidLearner

1
ऐसा लग रहा है कि लाइब्रेरी के पुराने संस्करण को फायरबेस द्वारा खींचा जा रहा है, जो बदले में ग्रामों की एक सकर्मक निर्भरता है। आप किसी अन्य निर्भरता से पहले 'com.android.support:support-v4:26.0.0-beta2' कार्यान्वयन को जोड़कर इस काम को प्राप्त कर सकते हैं। स्पष्ट होने या रिज़ॉल्यूशनस्ट्रेगी ( docs.gradle.org/current/dsl/… ) का उपयोग करने के पक्ष में सकर्मक निर्भरता को बंद करना दीर्घकालिक एक बेहतर दृष्टिकोण है।
jdonmoyer

1
धन्यवाद। किसी तरह सकर्मक निर्भरता को ठीक करने में कामयाब रहे। ग्रैड बिल्ड सफल रहा। रनटाइम के दौरान सभी पुस्तकालय कक्षाओं के साथ इसकी त्रुटियां दिखाई दे रही हैं। त्रुटि: पैकेज रेट्रोफ़िट 2 में त्रुटि नहीं है: पैकेज android.support.v7.app में त्रुटि मौजूद नहीं है: पैकेज com.google.gson मौजूद नहीं है। संकलन के समय इसमें कोई त्रुटि नहीं दिखी।
DroidLearner

16

बहुत समय के बाद और एक ऐसे दोस्त की मदद लेना जो एंड्रॉइड के बारे में मुझसे कहीं ज्यादा जानता है: ऐप / बिल्ड.ग्रेड

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
}

in build.gradle

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

in gradle.properties

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

4
resolutionStrategy.forceकेवल एक चीज थी जो मेरे लिए काम करती थी। धन्यवाद!
ओरियन एडवर्ड्स

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किसी और चीज़ में नेस्टेड नहीं था)


5

यह मेरे लिए काम किया:

app/build.gradleनिर्भरता अनुभाग में फॉलो लाइन जोड़ें :

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

या :27.1.1मेरे मामले में


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 में यह निर्भरता मुद्दा मिल रहा है, तो एंड्रॉइड स्टूडियो को 3.4 या बाद में अपडेट करें


3

मैंने इसे एंड्रॉइड / बिल्ड.ग्रेड फ़ाइल में अपनी ग्रेडियल निर्भरता को अपग्रेड करके हल किया है: classpath 'com.android.tools.build:gradle:3.3.1' (मैं पहले संस्करण 3.2 पर था।


2

मैंने एड्डी के ऊपर जो उल्लेख किया है, उसका अनुसरण करके मैंने इसे हल किया।

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

2

मेरे परस्पर विरोधी निर्भरता को लागू करने से लेकर एपि में बदलने तक की कोशिश करता है। यहाँ अंतर को समझाते हुए माइंडकोर्स द्वारा एक अच्छा लेख है।

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

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
ठीक से सबसे अच्छा अभ्यास नहीं है क्योंकि यह एक पुस्तकालय को आप से दूर भागने का कारण बन सकता है। पूर्व। वे जिस तरह से चीजों को एक नए संस्करण में बदलते हैं और अचानक आपका कोड काम नहीं करता है। जबकि आपको नवीनतम संस्करण का उपयोग करने का प्रयास करना चाहिए, अवांछित क्रैश और बग्स को रोकने के लिए पहले परीक्षण करने के बाद आपको मैन्युअल रूप से संस्करण संख्या निर्धारित करनी चाहिए।
जोनाह स्टारिंग

1
अच्छी प्रैक्टिस नहीं। @JonahStarling ने जो कहा उसके अलावा, यह ऑफ़लाइन सुविधा बंद होने पर ग्रेडल बिल्ड प्रदर्शन को भी प्रभावित करेगा।
अंकित बत्रा
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.