Ошибка Android Studio 3.0. Перенос конфигураций зависимостей для локальных модулей

Недавно я установил последнюю версию Canary для Android Studio, которая в настоящее время использует плагин Android Gradle 3.0.0-alpha4.

Теперь я получаю сообщение об ошибке:

Error:Failed to resolve: Could not resolve project :MyLib.
Required by:
project :app

Я прочитал: Миграция конфигураций зависимостей для локальных модулей< /а>

dependencies 

{

// This is the old method and no longer works for local
// library modules:
// debugCompile project(path: ':foo', configuration: 'debug')
// releaseCompile project(path: ':foo', configuration: 'release')

// Instead, simply use the following to take advantage of
// variant-aware dependency resolution. You can learn more about
// the 'implementation' configuration in the section about
// new dependency configurations.
implementation project(':foo')

// You can, however, keep using variant-specific configurations when
// targeting external dependencies. The following line adds 'app-magic'
// as a dependency to only the 'debug' version of your module.

debugImplementation 'com.example.android:app-magic:12.3' 
}

Я изменил:

releaseCompile project(path: ':MyLib', configuration: 'appReleaseApp')
debugCompile project(path: ':MyLib', configuration: 'appDebug')

to:

implementation project(':MyLib')

но у меня все еще есть эта ошибка: Error:Failed to resolve: Could not resolve project :MyLib.

библиотека градации:

apply plugin: 'com.android.library'

android {
    publishNonDefault true
    compileSdkVersion 25
    buildToolsVersion "25.0.3"
    defaultConfig {
        minSdkVersion 14
        targetSdkVersion 25
    }
    buildTypes {
        debug {
            ...
        }
        releaseApp {
            ...
        }
        releaseSdk {
            ...'
        }
    }
    flavorDimensions "default"

    productFlavors {
        flavor1{
            ...
        flavor2{
            ...
        }
        flavor3{
            ...
        }
    }
}

dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')
    compile 'com.android.support:appcompat-v7:25.3.1'
    compile 'com.android.support:support-v4:25.3.1'
    compile 'com.google.code.gson:gson:2.8.0'
    compile 'com.google.android.gms:play-services-maps:10.2.6'
    compile 'com.google.android.gms:play-services-gcm:10.2.6'
    compile 'com.google.android.gms:play-services-location:10.2.6'
}

apply plugin: 'maven'

uploadArchives {
    repositories {
        mavenDeployer {
            repository(url: mavenLocal().url)
        }
    }
}

градация приложения:

apply plugin: 'com.android.application'

android {

    compileSdkVersion 25
    buildToolsVersion "25.0.3"
    defaultConfig {
        vectorDrawables.useSupportLibrary = true
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
        minSdkVersion 19
        targetSdkVersion 25
        versionCode 12
        versionName "5.0.2"
    }

    buildTypes {
        release {
            ...
        }
        debug {
            ...
        }
    }
    flavorDimensions "default"

    productFlavors {
        flavor1 {
            ...
        }

        flavor2 {
            ...
        }
    }

    testOptions {
        unitTests {
            all {
                jvmArgs '-noverify'
                systemProperty 'robolectric.logging.enable', true
            }
        }
    }
}

repositories {
    flatDir {
        dirs 'libs'
    }
}
dependencies {
    //    releaseCompile project(path: ':MyLib', configuration: 'appRelease')
    //    debugCompile project(path: ':MyLib', configuration: 'appDebug')
    implementation project(':MyLib')

    compile fileTree(dir: 'libs', include: ['*.jar'])
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })
    compile 'com.google.android.gms:play-services-maps:10.2.6'
    compile 'com.google.android.gms:play-services-location:10.2.6'
    compile 'com.google.android.gms:play-services-analytics:10.2.6'
    compile 'com.google.android.gms:play-services-gcm:10.2.6'
    compile 'com.google.code.gson:gson:2.8.0'
    compile 'com.android.support:appcompat-v7:25.3.1'
    compile 'com.android.support:design:25.3.1'
    compile 'com.android.support:support-v4:25.3.1'
    compile 'com.android.support:cardview-v7:25.3.1'
    compile 'com.android.support:gridlayout-v7:25.3.1'
    compile 'com.android.volley:volley:1.0.0'
    compile 'com.facebook.stetho:stetho:1.4.1'
    compile 'com.facebook.stetho:stetho-okhttp3:1.4.1'
    compile 'com.android.support:percent:25.3.1'
    compile 'com.android.support:recyclerview-v7:25.3.1'
    compile 'com.squareup.picasso:picasso:2.5.2'
    testCompile 'junit:junit:4.12'
    testCompile 'org.mockito:mockito-core:2.1.0'
    testCompile 'org.robolectric:robolectric:3.1.4'
    testCompile 'org.assertj:assertj-core:1.7.1'

    compile 'com.flipboard:bottomsheet-core:1.5.0'
    compile 'com.flipboard:bottomsheet-commons:1.5.0'
    compile 'com.android.support.constraint:constraint-layout:1.0.1'
}

apply plugin: 'com.google.gms.google-services'

Пожалуйста помоги


person phnmnn    schedule 06.06.2017    source источник
comment
Вы заменили все зависимости внутри MyLib? compile -> api, при условии -> compileOnly. и скомпилировать -> реализовать в модуле приложения (для всех остальных зависимостей). По правде говоря, компиляция и предоставление по-прежнему поддерживаются, но не уверен, что это поможет. Сегодня утром я обновил плагин Gradle, и он работал с настройками выше.   -  person bajicdusko    schedule 06.06.2017
comment
я заменил compile -> api, все равно получаю ту же ошибку. Если я даже просто удалю все зависимости в MyLib, приложение все равно не сможет разрешить проект: MyLib   -  person phnmnn    schedule 06.06.2017
comment
Может быть, было бы полезно, если бы вы могли опубликовать оба файла gradle, трудно угадать вслепую. Я также удалил ретролямбду, увеличил исходную совместимость до java8..   -  person bajicdusko    schedule 06.06.2017
comment
я не пользуюсь ретролямбдой...   -  person phnmnn    schedule 06.06.2017
comment
Здесь точно такая же проблема. понятия не имею, как это решить.   -  person Gillis Haasnoot    schedule 28.06.2017
comment
Та же проблема. Невозможно продолжить   -  person DroidLearner    schedule 27.07.2017
comment
как это решить? Есть идеи ?   -  person Bincy Baby    schedule 02.01.2018


Ответы (6)


Google добавил дополнительные инструкции, как решить эту проблему: Устранение ошибок сборки, связанных с сопоставлением зависимостей

Причина ошибки сборки:

Ваше приложение включает тип сборки, которого нет в зависимости от библиотеки.

Например, ваше приложение включает в себя тип сборки "staging", но зависимость включает только тип сборки "debug" и "release".

Обратите внимание, что нет проблем, когда зависимость библиотеки включает тип сборки, которого нет в вашем приложении. Это потому, что плагин просто никогда не запрашивает этот тип сборки из зависимости.

Разрешение

Используйте MatchingFallbacks, чтобы указать альтернативные совпадения для данного типа сборки, как показано ниже:

// In the app's build.gradle file.
android {
    buildTypes {
        debug {}
        release {}
        staging {
            // Specifies a sorted list of fallback build types that the
            // plugin should try to use when a dependency does not include a
            // "staging" build type. You may specify as many fallbacks as you
            // like, and the plugin selects the first build type that's
            // available in the dependency.
            matchingFallbacks = ['debug', 'qa', 'release']
        }
    }
}
person phnmnn    schedule 28.09.2017
comment
Большой палец вверх брат для объяснения - person Saad Bilal; 20.11.2017

Столкнувшись с той же проблемой, я, наконец, объявил одни и те же типы buildTypes в файлах build.gradle приложений и модулей.

В вашем случае добавление

buildTypes {
    debug {}
    releaseApp {}
    releaseSdk {}
}

к вашему модулю build.gradle должно помочь.

Не забудьте также изменить любой «проект компиляции» на «проект реализации».

Надеюсь, поможет

person Zoubiock    schedule 19.06.2017
comment
Это правильный ответ. Поскольку новый плагин автоматически сопоставляет типы сборки, они должны точно соответствовать типам в каждом модуле. Надеюсь текст ошибки будет точнее. - person Patrick Favre; 20.06.2017
comment
Где можно прочитать эту информацию? Это так чертовски сложно, чтобы не тратить дни на проблемы с градиентом - person Gillis Haasnoot; 28.06.2017
comment
изменил все на «Реализация», и все равно выдает ту же ошибку. Вот мой тип сборки для приложения и библиотеки gist.github.com/anonymous/1dda4a85d4d3c021a8fc07251901f9f2 - person DroidLearner; 27.07.2017
comment
Поскольку плагин Gradle был обновлен с того времени, правильный ответ должен теперь использовать buildTypeMatching. Посмотрите на ответ @kamy ниже - person Zoubiock; 26.09.2017
comment
Спасибо! Кажется, что все модули должны указывать одни и те же имена buildType. - person steliosf; 01.12.2017
comment
Уже есть только тип сборки релиза как в приложении, так и в модуле. До сих пор не работает - person Muhammad Babar; 27.02.2018

С новым подключаемым модулем разрешение зависимостей с учетом вариантов

implementation project(':MyLib')

должны иметь точно соответствующие типы сборки. Это описано в руководстве по миграции

Например, с помощью этого механизма невозможно заставить «отладочный» вариант потреблять «релизный» вариант, потому что производитель и потребитель не совпадают. (В данном случае имя «отладка» относится к опубликованному объекту конфигурации, упомянутому выше в разделе «Публикация зависимостей».) Теперь, когда мы публикуем две конфигурации, одну для компиляции и одну для среды выполнения, этот старый способ выбора одной конфигурации действительно не работает. больше не работаю.

Итак, старый метод

releaseCompile project(path: ':foo', configuration: 'debug')

больше не будет работать.

Пример

В вашем примере это будет выглядеть так:

В приложении build.gradle:

apply plugin: 'com.android.application'

android {
  buildTypes {
    debug {}
    releaseApp {}
    releaseSdk {}
  }
  ...
  dependencies {
    implementation project(':MyLib')
  }
}

В модуле/библиотеке 'MyLib' build.gradle:

apply plugin: 'com.android.library'

android {
  buildTypes {
    debug {}
    releaseApp {}
    releaseSdk {}
  }
}

Поэтому тип сборки должен точно совпадать, ни больше, ни меньше.

Использование резервных вариантов типа сборки

Новая функция под названием «matchingFallbacks» может использоваться для определения типов сборки по умолчанию, если подмодуль не определяет тип сборки.

Используйте MatchingFallbacks, чтобы указать альтернативные совпадения для данного типа сборки (...)

Например, если градация module/lib 'MyLib' будет выглядеть так:

apply plugin: 'com.android.library'

android {
  buildTypes {
    debug {}
    releaseLib {}
  }
}

Вы можете определить следующее в своем приложении build.gradle:

apply plugin: 'com.android.application'

android {
  buildTypes {
    debug {}
    releaseApp {
        ...
        matchingFallbacks = ['releaseLib']
    }
    releaseSdk {
        ...
        matchingFallbacks = ['releaseLib']
    }
  }
  ...
  dependencies {
    implementation project(':MyLib')
  }
}

Отсутствующие параметры вкуса

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

android {
    defaultConfig {
        missingDimensionStrategy 'minApi', 'minApi18', 'minApi23'
        ...
    }
}
person Patrick Favre    schedule 19.06.2017
comment
это не сработало, вот мой тип сборки для приложения и библиотеки. gist.github.com/anonymous/1dda4a85d4d3c021a8fc07251901f9f2 - person DroidLearner; 27.07.2017
comment
вкусы тоже должны быть одинаковыми - person phnmnn; 27.07.2017
comment
Это объяснение помогло мне понять, почему устаревшее приложение сломалось после обновления Gradle, спасибо. - person Eddie; 04.05.2019

Я столкнулся с той же проблемой, я нашел эту страницу миграции: Создание типов соответствия

Говорится:

Выберите значения по умолчанию для отсутствующих типов сборки
Если потребитель настраивает тип сборки, которого нет у производителя, вам необходимо вручную сопоставить тип сборки потребителя с типом сборки производителя. Например, если ваш модуль приложения настраивает тип сборки «staging», а его зависимость от библиотечного модуля «mylibrary» — нет, подключаемый модуль Android выдает следующую ошибку сборки:

Error:Failed to resolve: Could not resolve project :mylibrary.
Required by: project :app

Чтобы устранить эту ошибку, вам нужно указать, какой тип сборки из «mylibrary» должен соответствовать подключаемому модулю Android «постановочному» типу сборки приложения. Вы можете сделать это с помощью свойства buildTypeMatching в файле build.gradle приложения, как показано ниже:

// Add the following to the consumer's build.gradle file.
android {
    ...
    // Tells the Android plugin to use a library's 'debug' build type
    // when a 'staging' build type is not available. You can include
    // additional build types, and the plugin matches 'staging' to the
    // first build type it finds from the one's you specify. That is,
    // if 'mylibrary' doesn't include a 'debug' build type either, the
    // plugin matches 'staging' with the producer's 'release' build type.
    buildTypeMatching 'staging', 'debug', 'release'
}

Добавление buildTypeMatching исправило это для меня, не создавая ненужных типов в моей библиотеке.

person Kamy    schedule 04.08.2017

Сегодня у меня также была такая же проблема после перехода на Android Studio 3. Проблема в том, что gradle не может разрешить определенные библиотеки из-за проблемы с сетью. Причины могут быть разные. Если вы работаете за прокси, вам нужно добавить параметры прокси в файл gradle.properties:

systemProp.http.proxyHost=<proxy_host>
systemProp.http.proxyPort=<proxy_port
systemProp.https.proxyHost=<proxy_host>
systemProp.https.proxyPort=<proxy_port>

В моем случае у меня была еще одна проблема. Моя компания использует самозаверяющий SSL-сертификат, поэтому с SSL-соединением возникли проблемы. Если то же самое относится и к вам, вы можете снова установить параметр в файле gradle.properties следующим образом:

org.gradle.jvmargs=-Djavax.net.ssl.trustStore="/usr/lib/jvm/java-8-oracle/jre/lib/security/cacerts" -Djavax.net.ssl.trustStoreType=JKS -Djavax.net.ssl.keyStorePassword=changeit

Чтобы быть более понятным, вы можете нажать ссылку «Показать подробности» в журнале сообщений в Android Studio. Этот журнал будет более полезен для определения реальной проблемы.

person Adil Aliyev    schedule 27.10.2017

Это решение сработало для меня. Я использую Android Studio 3.1.2. Плагин Android Gradle 3.1.2. Грейдл 4.4. У меня есть библиотечный модуль с такими вариантами, как trial и premium. В рамках процесса перехода на плагин Android Gradle 3.1.2 я добавил параметр main в файл сборки gradle моего библиотечного модуля. Поэтому, чтобы исправить ошибку сборки, в файле build.gradle моего приложения я изменил следующее:

debugImplementation project(path: ':library', configuration: 'premiumDebug')
releaseImplementation project(path: ':library', configuration: 'premiumRelease')

стал

implementation project(':library')

и я добавил следующую строку в свой блок defaultConfig: missingDimensionStrategy 'main', 'premium'

person Kai    schedule 25.05.2018