Android Gradle - отправить переменную в зависимость

У меня есть модули gradle: приложение и модуль библиотеки libApp. У каждого из них есть собственный файл gradle. app.gradle:

productFlavors {
     prod {somevariable = false}
     debug {somevariable = true}
}

dependencies {
    implementation project(':libApp')
}

И libApp.gradle:

defaultConfig {
    buildConfigField "boolean", "SOME_VARIABLE_FROM_APP_MODULE", somevariable
}

Как заставить Gradle скомпилировать проект libApp в модуле приложения с некоторой переменной, зависящей от вкуса продукта?

0
0
976
2

Ответы 2

Вы можете создать блок ext на уровне вашего проекта build.gradle, который инкапсулирует пользовательские свойства и делает их доступными для всех модулей в проекте.

ext {
    somevariable = true
}

При доступе к нему вы можете просто

defaultConfig {
    buildConfigField "boolean", "SOME_VARIABLE_FROM_APP_MODULE", ext.somevariable
}

Это будет работать, НО я хочу изменить значение некоторой переменной в зависимости от созданного в настоящее время аромата.

taulus 24.09.2018 11:40

Вы можете установить переменную для каждого варианта, как показано здесь

Jan Stoltman 24.09.2018 13:13

@taulus просто обновляет значение для каждого вкуса, и это должно помочь

Sagar 24.09.2018 14:33

@Sagar, но это не так: / Он ведет себя так, как будто libApp скомпилирован один раз с некоторым значением переменной, как в отладке, - даже если я создаю продукт.

taulus 24.09.2018 15:21

Вы можете сделать это с ароматизаторами.

В модуле библиотеки build.gradle определите измерение аромата, соответствующее значению переменной:

android {
    /* ... */

    flavorDimensions "someVar"

    productFlavors {
        someVarTrue {
            dimension "someVar"
            buildConfigField "boolean", "SOME_VARIABLE_FROM_APP_MODULE", 'true'
        }

        someVarFalse {
            dimension "someVar"
            buildConfigField "boolean", "SOME_VARIABLE_FROM_APP_MODULE", 'false'
        }
    }
}

В build.gradle модуля приложения определите, какой вариант приложения должен использовать какой вариант библиотеки:

android {
    /* ... */

    flavorDimensions "environment"

    productFlavors {
        prod {
            dimension "environment"
        }

        dev {
            dimension "environment"
        } // note: naming a flavor "debug" might create a conflict with the default "debug" configuration
    }
}

dependencies {
    /* ... */
    prodImplementation project(path: ':libApp', configuration: 'someVarTrue')
    devImplementation project(path: ':libApp', configuration: 'someVarFalse')
}

Возможно, вы захотите увидеть эта статья для получения более подробной информации.

Это не сработает, потому что вы ошиблись конфигурацией с названием аромата. someVarTrue должен быть объявлен в блоке configurations {} библиотеки, но внутри него мы не можем объявить buildConfigFields. Вы уверены, что приведенный выше код правильный?

taulus 25.09.2018 13:42

@taulus Я обновил свой ответ, теперь он должен работать. Извините, я выкладывал это по памяти на смартфон и испортил синтаксис. ;)

SpaceBison 26.09.2018 12:35

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