Залежність від Android має різну версію для компіляції та виконання


105

Після оновлення Android Studio з Canary 3 до Canary 4 на час збирання видається наступна помилка.

Залежність від Android 'com.android.support:support-support-v4' має різну версію для класу компіляції (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'

}

Примітка: Проект добре розвивався в Канарі 3


Я також стикався з тією ж проблемою, оскільки я використовую два модулі в моєму додатку, тому переконайтеся, що ви використовуєте той самий код версії для всіх файлів gradle.
Надей Бхат

Відповіді:


136

Використовуйте цей код у своєму buildscript (root.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
Це працювало для мене, не забудьте змінити деталі.useVersion на номер версії, якщо просто скопіювати та вставити його не вдасться
John Starr Dewar

2
Найкраще, працює з rn 0,55, gradle 4.1, збирає gradle tools 3.0.1
Nerius Jok

1
Переконайтесь, що включити !details.requested.name.contains('multidex')дійсно допомогло мені.
Джона Старлінг

2
Я спробував це, але це спрацювало лише для конфлікту com.android.support. Це не спрацювало для конфлікту com.google.firebase: конфлікт з аналізами. Здається, що "містить" відповідає занадто багато пакетів. Я використовував більш просте рішення на цій посаді замість усіх конфліктів, і це спрацювало чудово.
Якоб Джоел

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
Всі андроїд-студії рекомендують використовувати реалізацію. І це чудове рішення працює. Інженерам Google в андроїд-студіях потрібен урок, щоб вивчити світ. Що засмучує інструмент
Сіддхарт

3
це не вирішує проблему, в повідомленні йдеться: "Залежність від Android" ............... 'має іншу версію для компіляції "
Jorgesys

Працюй для мене. Спасибі
Duan Nguyen

@KeithLoughnane Це не погана практика, це правильний спосіб зробити це так, як рекомендує документація
Yayo Arellano

1
Реалізація @YayoArellano - це те, що рекомендується при розумному використанні api там, де це абсолютно потрібно. Це киньте все на стіну і подивіться, що палички програмує. Деяким з них можуть знадобитися api, але не всі вони. Ви занадто багато викриваєтесь.
Кіт Лофнан

22

Ви повинні мати можливість точно бачити, яка залежність тягне у непарній версії як перехідну залежність, виконавши правильну gradle -q dependencies команду для вашого проекту, як описано тут:

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

Після того як ви відстежите, що втягує його, ви можете додати виключення до цієї конкретної залежності у вашому файлі gradle за допомогою чогось:

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

Привіт, я запустив команду залежності від градуса і розміщую тут скриншот URL-адреси, imgur.com/dL35BaN. Я ніколи не використовую Firebase у своєму проекті. Додано цей рядок у гкм, однак це не спрацювало
DroidLearner

@DroidLearner Можливо, мені щось не вистачає, але я не бачу посилань на com.android.support:support-compat на екрані, який ви розмістили. Також на цьому знімку екрану є попередження, яке стосується конфігурації "компілювати", яку я не бачу у вашому файлі gradle в ОП. цілком ймовірно, що він походить від: основного підмодуля. Чи можете ви розмістити звідти відповідну інформацію про gradle?
jdonmoyer

Привіт, розміщуємо тут усі файли gradle з деревом залежностей .. файл програми gradle -> gist.github.com/anonymous/93affc0d75eb96b59f9fde51332b9716 core gradle file -> gist.github.com/anonymous/5c85031f26ff766109061ab1f00b833d залежність . com / anonymous / 71dd33b6fa4dc63dd357889e8aff01ee Сподіваюся, що це допомагає.
DroidLearner

1
Схоже, старішу версію бібліотеки залучає firebase, що, в свою чергу, є перехідною залежністю GM. Ви можете скористатися цим, додавши: введення "com.android.support:support-v4:26.0.0-beta2" перед будь-якою іншою залежністю. Довгострокове вимкнення транзитивних залежностей на користь явного або використання резолюції Стратегії ( docs.gradle.org/current/dsl/… ), ймовірно, кращий підхід.
jdonmoyer

1
Дякую. Якось вдалося виправити перехідну залежність. Збудувати Градле вдалося. Під час виконання його показ відображає помилки з усіма бібліотечними класами. помилка: пакет retrofit2 не існує помилка: пакет 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було єдине, що працювало на мене. Дякую!
Оріон Едвардс

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 році, оновіть Android Studio до 3.4 або пізнішої версії


3

Я вирішив це, оновивши свою залежність від gradle у файлі android / build.gradle: 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

Переключення моїх конфліктних залежностей від реалізації до api робить свою справу. Ось гарна стаття мислителів, що пояснює різницю.

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

Я коментую, що //api 'com.google.android.gms:play-services-ads:15.0.1'це працювало для мене після синхронізації


1

Просто додайте ці рядки у файл build.gradle

дозвілStrategy.force "com.android.support:support-media-compat:26.0.0-beta2"

дозвілStrategy.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'

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
    }

додайте це в gradle (проект) всередині allprojects


-7

Замініть жорстко закодовану версію на + example:

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

7
Не зовсім найкраща практика, оскільки це може призвести до того, що бібліотека начебто втече від вас. Вих. Вони змінюють спосіб роботи в новій версії, і раптом ваш код не працює. Хоча ви повинні прагнути використовувати останню версію, вам слід вручну встановити номер версії після її попереднього тестування, щоб запобігти небажаним збоям та помилкам.
Джона Старлінг

1
Недобра практика. На додаток до того, що сказав @JonahStarling, це також вплине на продуктивність збірки Gradle, якщо функцію офлайн буде вимкнено.
Анкіт Батра
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.