Зависимость 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'

}

Примечание: проект отлично строился в Canary 3


Я также столкнулся с той же проблемой, поскольку я использую два модуля в своем приложении, поэтому убедитесь, что вы используете один и тот же код версии для всех файлов Gradle.
Надим Бхат

Ответы:


136

Используйте этот код в своем скрипте сборки (корень 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
У меня это сработало, не забудьте изменить details.useVersion на номер версии, если вы просто скопируете и вставите, это не удастся
Джон Старр Дьюар

2
Лучшее, работает с rn 0.55, gradle 4.1, build gradle tools 3.0.1
Нериус Джок

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

2
Я пробовал это, но это сработало только для конфликта com.android.support. Это не сработало для конфликта com.google.firebase: firebase-analytics. Кажется, что "содержит" соответствует слишком большому количеству пакетов. Вместо этого я использовал более простое решение для всех конфликтов, и оно отлично сработало.
Jacob Joel

2
@ user3908686 решил проблему, но объясните, пожалуйста, зачем нам это добавлять ??
ArgaPK 08

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 нужен урок, который можно извлечь из всего мира. Какой разочаровывающий инструмент
Сиддхарт

3
это не решает проблему, в сообщении говорится: «Android-зависимость '...............' имеет другую версию для компиляции»
Jorgesys

Работай на меня. Спасибо
Дуан Нгуен

@KeithLoughnane: Это неплохая практика, это правильный способ сделать это и так, как рекомендует документация
Яё Арельяно

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 и публикую URL-адрес снимка экрана здесь, imgur.com/dL35BaN. Я никогда не использую Firebase в своем проекте. Добавил эту строку в gcm, но это не сработало
DroidLearner

@DroidLearner Возможно, мне что-то не хватает, но я не вижу ссылки на com.android.support:support-compat на опубликованном вами скриншоте. Также на этом снимке экрана есть предупреждение, которое относится к конфигурации «компиляции», которую я не вижу в вашем файле gradle в OP. вполне вероятно, что он исходит из подмодуля: core. Можете ли вы опубликовать оттуда соответствующую информацию о Gradle?
jdonmoyer

Привет, размещаю вам все файлы gradle с деревом зависимостей здесь .. файл приложения gradle -> gist.github.com/anonymous/93affc0d75eb96b59f9fde51332b9716 основной файл gradle -> gist.github.com/anonymous/5c85031f26ff766109061ab1f00b833d дерево зависимостей gist.gith. com / anonymous / 71dd33b6fa4dc63dd357889e8aff01ee Надеюсь, это поможет.
DroidLearner

1
Похоже, что старую версию библиотеки втягивает firebase, которая, в свою очередь, является транзитивной зависимостью от gms. Вы, вероятно, можете заставить это работать, добавив: implementation 'com.android.support:support-v4:26.0.0-beta2' перед любой другой зависимостью. Долгосрочное отключение транзитивных зависимостей в пользу явного использования или использования ResolutionStrategy ( docs.gradle.org/current/dsl/… ), вероятно, является лучшим подходом.
jdonmoyer

1
Спасибо. Как-то удалось исправить транзитивную зависимость. Сборка Gradle выполнена успешно. Во время выполнения он показывает ошибки со всеми классами библиотеки. ошибка: пакет 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 помогает. Вот хорошая статья от 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'

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

Замените жестко закодированную версию на + пример:

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

7
Не совсем лучшая практика, так как это может привести к тому, что библиотека убежит от вас. Ex. Они меняют способ работы в новой версии, и внезапно ваш код не работает. Хотя вы должны стремиться использовать последнюю версию, вы должны вручную установить номер версии после ее тестирования, чтобы предотвратить нежелательные сбои и ошибки.
Джона Старлинг

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