Используйте другой версии VersionCode для отладки/выпуска android gradle build

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

Ниже код дает mypackage-release-1.apk файл как assembleRelease артефакт, чего не ожидается. Я ожидал mypackage-release-10111.apk для этого.

почему строка debug { defaultConfig.versionCode=1 } влияет на артефакт сборки?

defaultConfig {
    versionCode 10111
    versionName '2.5.4'
    minSdkVersion 10
    targetSdkVersion 21
}
signingConfigs {
    debug {
        project.ext.loadSign = false
        defaultConfig.versionCode = 1 // Why this value applied to assembleRelease?
    }
    release {
        project.ext.loadSign = true
        applicationVariants.all { variant ->
            variant.outputs.each { output ->
                def file = output.outputFile
                output.outputFile = new File(file.parent, file.name.replace(".apk", "-" + defaultConfig.versionCode + ".apk"))
            }
        }
    }
}
buildTypes {
    debug {
        signingConfig signingConfigs.debug
    }
    release {
        signingConfig signingConfigs.release
    }
}

Ответ 1

Мне тоже, но я думаю, что defaultConfig.versionCode был задан при компиляции build.gradle. Это глобальная статическая переменная и назначается в compiletime, а не во время выполнения.

Я думаю, что мы можем перехватить выполнение задачи gradle и изменить defaultConfig.versionCode во время выполнения.


После goooooooogle я нашел, что это работает для меня: https://gist.github.com/keyboardsurfer/a6a5bcf2b62f9aa41ae2

Ответ 2

Поздно на вечеринке...

Весь файл gradle оценивается перед выполнением любой задачи, поэтому вы в основном меняете значение по умолчанию versionCode при объявлении конфигураций debug. Нет прямого пути к reset versionCode из buildType, но ссылка на другой ответ делает трюк, объявляя задачу о вариантах сборки.

android {
    ...
    defaultConfig {
         ...
    }
    buildTypes {
         ...
    }
    applicationVariants.all { variant ->
        def flavor = variant.mergedFlavor
        def versionCode = flavor.versionCode
        if (variant.buildType.isDebuggable()) {
            versionCode += 1
        }
        flavor.versionCode = versionCode
    }
}

Ответ 3

Вот обновленная версия:

android {
  defaultConfig { ... }

  applicationVariants.all { variant ->
    if (variant.name == 'debug') {
      variant.outputs.each { output ->
        output.versionCodeOverride = 1
      }
    }
  }
}

Ответ 4

Использовать с ароматами:

    applicationVariants.all { variant ->
    def flavor = variant.mergedFlavor
    def name = flavor.getVersionName()
    def code = flavor.getVersionCode()

    if (variant.buildType.isDebuggable()) {
        name += '-d'
        code = 1
    }

    variant.outputs.each { output ->
        output.versionNameOverride = name
        output.versionCodeOverride = code
    }
}