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

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

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

Мой Gradle (соответствующий код):

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 всегда "true" (с или без "noFakeBluetooth" в строке cmd).

3 ответа

Решение

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

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);

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