Куча готовых решений в сети, но почему то ничего не работает. Пришлось исследовать этот вопрос. Оказалось, что gradle.kts это тоже kotlin скрипт, который выполняется каждый раз при сборке проекта.
И задача состоит в том, чтобы увеличивать версию сборки каждый раз автоматически. Конфигурация в build.gradle.kts содержит секцию android.defaultConfig, которая изначально выглядит вот так:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
android { namespace = "..." compileSdk = ... defaultConfig { applicationId = "..." minSdk = ... targetSdk = ... versionCode = 1 versionName = "1.0" testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" } ... |
На месте многоточий — какие то более конкретные значения.
Хочется, чтобы versionName выглядел, как то так:
1 |
versionName = "1.0.${versionCode}" |
А versionCode менялся автоматически.
Раз уж мы разобрались, что это скрипт на kotlin, то никто не мешает нам создать функцию, которая читает версию сборки из файла, увеличивает её на единицу и пишет обратно в этот же файл.
Добавим в конец build.gradle.kts следующую функцию:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
fun getNextVersion(): Int { val properties = Properties() val propertiesFile = File(".gradle/my.properties") var result = 1 if (propertiesFile.exists()) { propertiesFile.inputStream().use { inputStream -> properties.load(inputStream) result = properties.getProperty("myBuildNumber", "1").toInt() + 1 properties["myBuildNumber"] = result.toString() propertiesFile.outputStream().use { outputStream -> properties.store(outputStream, null) } } } else { propertiesFile.createNewFile() properties["myBuildNumber"] = result.toString() propertiesFile.outputStream().use { outputStream -> properties.store(outputStream, null) } } println("New build version is " + result) return result } |
Также потребуется импорт библиотеки java.util.Properties, её мы добавим в самое начало файла:
1 |
import java.util.Properties |
Функция getNextVersion выполняет описанные выше операции с файлом .gradle/my.properties, попутно создавая его, если он не существует. В этом файле создаётся свойство — myBuildNumber, которое хранит актуальную версию билда.
Дополнительно, версия будет выводится в консоль во время сборки.
Остается только исправить строки в defaultConfig секции, чтобы всё заработало.
1 2 |
versionCode = getNextVersion() versionName = "1.0.${versionCode}" |
Если потребуется установить вручную версию сборки, вы можете это сделать в файле .gradle/my.properties.