Build.gradle проблема с версиями реализации

Я получаю это предупреждение:

All com.android.support libraries must use the exact same version specification (mixing versions can lead to runtime crashes). Found versions 27.1.1, 27.1.0. Examples include com.android.support:animated-vector-drawable:27.1.1 and com.android.support:exifinterface:27.1.

Я понимаю это, но почему мне отображается это предупреждение, хотя все версии com.android.support одинаковы? (27.1.1)

это содержимое моего файла:

apply plugin: 'com.android.application'

android {
    compileSdkVersion 27
    defaultConfig {
        applicationId "com.app.sin.retrolist"
        minSdkVersion 18
        targetSdkVersion 27
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    } }

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'com.android.support:appcompat-v7:27.1.1'
    implementation 'com.android.support:recyclerview-v7:27.1.1'
    implementation 'com.android.support:cardview-v7:27.1.1'
    implementation 'com.android.support:design:27.1.1'
    implementation 'com.jakewharton:butterknife:8.8.1'
    implementation 'com.android.volley:volley:1.1.1'
    implementation 'com.squareup.picasso:picasso:2.71828' }
3
0
679
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Чтобы понять, почему конкретная зависимость включена в ваше дерево зависимостей, вы можете (при условии, что ваш основной модуль называется app и вы работаете в macOS) запустить простой:

./gradlew app:dependencies

В выводе консоли вы увидите полное дерево зависимостей и то, как решаются версии библиотек.

Правильный способ справиться с конфликтами зависимостей, подобными этому, - это явным образом определить стратегию разрешения:

configurations.all {
    resolutionStrategy {
        force 'com.android.support:exifinterface:27.1.1'
    }
}

Он должен быть помещен в корень вашего файла build.gradle в модуле app.

Переопределение конфликтующей зависимости с помощью:

dependencies {
    ...
    implementation 'com.android.support:exifinterface:27.1.1'
}

менее правильно, так как ваш модуль не зависит от этой библиотеки напрямую, поэтому, если, например, будущие версии ваших зависимостей больше не будут зависеть от нее, она все равно будет включена в список разрешенных зависимостей, даже если вы этого не сделаете. нужно это.

Более того, вы могли бы определить:

ext {
    supportLibVersion = "27.1.1"
}

в вашем основном файле build.gradle, а затем используйте его там, где вам это нужно:

configurations.all {
    resolutionStrategy {
        force "com.android.support:exifinterface:$rootProject.supportLibVersion"
    }
}

dependencies {
    ...
    implementation "com.android.support:appcompat-v7:$rootProject.supportLibVersion"
    implementation "com.android.support:recyclerview-v7:$rootProject.supportLibVersion"
    implementation "com.android.support:cardview-v7:$rootProject.supportLibVersion"
    ...
}

Другие вопросы по теме