Gradle: добавить зависимость для определенного вида библиотеки

У меня есть проект библиотеки и приложение. Я хотел бы иметь 2 варианта продукта (store, dev) для библиотеки и приложения. Когда я создаю хранилище для приложения, я хочу использовать хранилище из библиотеки. Также, когда я создаю версию dev для приложения, я хочу использовать версию dev из библиотеки. Я попытался установить одинаковые варианты продукта для библиотеки и приложения, но это не работает.

Вот моя конфигурация:

Библиотека

apply plugin: 'android-library'

android {
    compileSdkVersion 19
    buildToolsVersion "19.1.0"

    defaultConfig {
        applicationId "ro.amarkovits.graddletest.lib"
        minSdkVersion 14
        targetSdkVersion 19
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            runProguard false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
    productFlavors{
        store{

        }
        dev{

        }
    }

}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
}

и у меня есть эти файлы: src/main/res/values ​​/strings.xml и src / store / res / values ​​/strings.xml

заявка

apply plugin: 'android'

android {
    compileSdkVersion 19
    buildToolsVersion '19.1.0'
    defaultConfig {
        applicationId 'ro.amarkovits.mymodule.app'
        minSdkVersion 14
        targetSdkVersion 19
        versionCode 1
        versionName '1.0'
    }
    buildTypes {
        release {
            runProguard false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
    productFlavors{
        store{

        }
        dev{

        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile project(':lib')
}

В этой ситуации я получаю эту ошибку: Ошибка:(12, 23) Не найден ресурс, который соответствует данному имени (в 'text' со значением '@string/app_name'). Имя_приложения определено в файле string.xml в библиотеке (как в основном каталоге, так и в каталоге хранилища).

Если я удаляю productFlavors из библиотеки, которую она собирает, но всегда использую values.xml из основного каталога

3 ответа

Решение

В вашей библиотеке вы должны указать gradle каждый раз собирать каждый вариант:

android {
    publishNonDefault true
}

Тогда в вашем приложении, с недавнего времени, я думаю, вы можете сделать это:

dependencies {
    (...)
    devCompile project(path: ':lib', configuration: 'devDebug') // or 'devRelease'
    storeCompile project(path: ':lib', configuration: 'storeRelease') // or 'storeDebug'
}

Найдено в официальной документации в разделе " Публикация в библиотеке".

Редактировать:

Начиная с версии 0.14.3 (2014/11/18), теперь вы можете также иметь директиву Flavor-buildType-Compile:

В вашем build.gradle перед областью действия android {} добавьте следующее:

configurations {
    devDebugCompile
    devReleaseCompile
    storeDebugCompile
    storeReleaseCompile
}

Затем вы можете объявить и использовать разные версии вашей библиотеки для Flavor-BuildType:

dependencies {
    (...)
    devDebugCompile project(path: ':lib', configuration: 'devDebug')
    devReleaseCompile project(path: ':lib', configuration: 'devRelease')
    storeDebugCompile project(path: ':lib', configuration: 'storeDebug')
    storeReleaseCompile project(path: ':lib', configuration: 'storeRelease') 
}

Редактировать:

Управление зависимостями между модулями изменилось с момента появления Android Gradle Plugin 3.0.0. Он автоматически пытается сопоставить варианты между вашим приложением и библиотеками / модулями, от которых зависит.

Смотрите документацию для полного объяснения!

Чтобы определить конкретную зависимость для каждого варианта, вы можете использовать "nameOfTheFlavorCompile" вместо "compile"

dependencies {
    storeCompile project(':lib')
}

У меня была похожая проблема некоторое время назад, что происходит, когда компилятор игнорирует варианты продукта для проекта библиотеки. Более того, даже когда вы добавляете больше типов сборки, он продолжает искать и компилировать исходные / отладочные источники.

Причина проста:

  • Варианты продукта не поддерживаются для подключаемого модуля библиотеки.
  • Единственные поддерживаемые типы сборки, по-видимому, отладки и выпуска.

Компилятор никогда не будет искать ничего, что вы положили в каталог store вашего библиотечного проекта. Итак, вам нужно найти способ обойти это.

Одним из способов решения этой проблемы было бы включение обеих реализаций с уровнем абстракции в вашу библиотеку (через интерфейсы, множественные конструкторы и т. Д.), А затем позволить вашему проекту приложения решить, какую часть библиотеки запустить. Если вы используете proguard, он автоматически избавится от ненужного кода, если он достаточно хорошо отсоединен (и, возможно, даже если это не так).

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