Задача Gradle изменить логическое значение в конфигурации сборки

Я хотел бы создать очень простую задачу, которая меняет логическое значение в моей конфигурации gradle.

Я работаю над Android-приложением, которое может быть запущено с несколькими профилями, и для каждой сборки нужно указать, будет ли в моем коде приложение подделывать Bluetooth или нет.

Моя градация (соответствующий код):

def fakeBluetooth = "true" buildTypes { debug { minifyEnabled false signingConfig android.signingConfigs.debug buildConfigField "boolean", "fakeBluetooth", fakeBluetooth } release { minifyEnabled true signingConfig android.signingConfigs.release buildConfigField "boolean", "fakeBluetooth", fakeBluetooth } } task noFakeBluetooth { fakeBluetooth = "false" } 

Пример использования в моем Java-коде:

 if (BuildConfig.fakeBluetooth) { processFictiveBluetoothService(); } else { // other case } 

Примеры использования в командной строке:

 ./gradlew iDebug noFakeBluetooth 

а также

 ./gradlew iDebug 

Проблема: в обоих случаях значение fakeBluetooth всегда «истинно» (с или без «noFakeBluetooth» в строке cmd).

Вы можете использовать свойства проекта для передачи значения:

 buildTypes { debug { minifyEnabled false signingConfig android.signingConfigs.debug buildConfigField "boolean", "fakeBluetooth", fakeBluetooth() } release { minifyEnabled true signingConfig android.signingConfigs.release buildConfigField "boolean", "fakeBluetooth", fakeBluetooth() } } def fakeBluetooth() { def value = project.getProperties().get("fakeBluetooth") return value != null ? value : "true" } 

И затем вы можете передать свойство:

 ./gradlew iDebug -PfakeBluetooth=true 

Это работает

  android.defaultConfig.buildConfigField "String", "value", "1" 

Я думаю, что правильным подходом было бы определение ценности ресурса для buildTypes или productFlavours:

resValue "string", "key", "value"

Затем прочитайте его внутри своего кода, например: getResources().getString(R.string.key);