Android Gradle:在构建时动态更改版本名

Android Gradle:在构建时动态更改版本名,android,groovy,gradle,android-gradle-plugin,Android,Groovy,Gradle,Android Gradle Plugin,我试图通过使用gradle release plugin的定制版本在Android中模拟Maven release plugin: 有趣的步骤是: 检查未提交的更改 步骤版本代码和删除-快照 来自版本名的后缀 建造 步骤版本名称和添加-快照 下一个开发版本的后缀 但是,生成的APK始终具有以前的版本(即1.0.0-SNAPSHOT,而不是1.0.0) 版本号存储并正确更新在gradle.properties中,因此我假设需要更新数据模型中的版本,以使更改生效 我的android插件配置: d

我试图通过使用gradle release plugin的定制版本在Android中模拟Maven release plugin:

有趣的步骤是:

  • 检查未提交的更改
  • 步骤版本代码和删除-快照 来自版本名的后缀
  • 建造
  • 步骤版本名称和添加-快照 下一个开发版本的后缀
但是,生成的APK始终具有以前的版本(即1.0.0-SNAPSHOT,而不是1.0.0)

版本号存储并正确更新在gradle.properties中,因此我假设需要更新数据模型中的版本,以使更改生效

我的android插件配置:

defaultConfig {
    versionCode versionCode as int  // taken from gradle.properties
    versionName versionName // taken from gradle.properties
    minSdkVersion 10
    targetSdkVersion 19
}
我尝试过的事情:

preBuild << {
    android.applicationVariants.each { variant ->
        variant.versionName = versionName
    }
}
预构建
variant.versionName=versionName
}
}
但是变体中没有versionName

preBuild << {
    android.buildTypes.each { type ->
        type.versionName = versionName
    }
}
预构建
type.versionName=versionName
}
}
但是类型中没有versionName

preBuild << {
    android.productFlavors.each { flavor ->
        flavor.versionName = versionName
    }
}
预构建
flavor.versionName=versionName
}
}
但我的应用程序中没有任何风格(仅限于普通调试和发布构建类型)

我的另一种选择是在调用Gradle之前编写bash/bat脚本来逐步升级版本,这与使用Groovy改进构建定制的目的大相径庭


如何在执行阶段在Android Gradle插件中动态更新版本?

这并不能直接解决您关于如何完全更改版本名的问题,但这是我用来为我的构建类型添加后缀的内容:

defaultConfig {
    versionName "1.0"
}

buildTypes {
    debug {
        versionNameSuffix "-SNAPSHOT"
    }
}

这就是
buildTypes
的用途。您所描述的是一个
版本
构建,IMO

下面是一个示例:当执行
assembleDebug
时,它将为您提供一个快照构建,而执行
assembleerelease
将为您提供一个没有任何后缀和递增版本号的干净构建。下一个调试版本也将使用递增的数字

以下是在文件夹中创建文件时的完整功能构建。它也应该与口味一起使用,但这只是一个副产品:)。Gradle 2.2.1,Android插件1.1.3

格雷德尔先生 src/main/AndroidManifest.xml 执行
gradle assembleDebug
以正常构建,
gradle assemblererelease
以增量和构建,以及
gradle incrementVersion
以仅增量。 注意:小心使用
gradle assemble
,因为
assembleDebug
assembleerelease
的顺序将产生不同的结果

检查
build
目录中生成的文件,查看这些值是否符合您的喜好

手动执行(来自注释) 您可能有多种风格,在这种情况下,版本会增加多次,因为多个变体与发布版本类型匹配。最初的问题是没有味道。如果您想在版本号递增时拥有更多控制权,只需删除
afterEvaluate
块,并随时调用
incrementVersion
任务即可:

gradle incrementVersion assembleFreeRelease assemblePaidRelease
(上述手动执行是一个未经测试的想法。)

检查未提交的更改
“检查未提交的更改”不包括在这个答案中,这是另一个游戏。如果我理解正确,您可以挂接到
tasks.preBuild.doFirst{/*如果未限制的更改*/}
,在这里失败。但这在很大程度上取决于您的版本控制。多问一个问题

对于发布版本和非发布版本,我面临着类似的需要,需要有单独的构建逻辑。 除了不同的版本控制之外,我还必须使用一组不同的依赖项,甚至是不同的存储库

没有一个可用的插件具有我所需要的所有特性,所以我开发了自己的解决方案,基于简单的方法-命令行参数

在调用gradle构建脚本时,可以传递命令行参数,如下所示:

gradle build -PmyParameter=myValue
if (project.hasProperty('isRelease') && project.isRelease) {
        // Here be the logic!
}
我将这个逻辑提取到一个单独的插件中,并成功地在不同的项目中使用它


虽然这并不能直接回答您的问题,但我希望我给了您另一个角度来思考这个问题和另一个可能的解决方案。

我需要在版本名后面附加当前git提交代码修订计数。它在很多情况下都很方便。我最终得到了下面这个简单的gradle文件

apply plugin: 'com.android.application'

android {
    compileSdkVersion 21
    buildToolsVersion "21.1.2"

    def gitCommitCount = "git rev-list HEAD --count".execute().text.trim()

    defaultConfig {
        applicationId "my.app.package.name"
        minSdkVersion 16
        targetSdkVersion 21
        versionCode 6
        versionName "0.8"
    }

    buildTypes {

        debug {
            versionNameSuffix ".${gitCommitCount}"
        }

        release {
            versionNameSuffix ".${gitCommitCount}"
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'

        }
    }
}
与gitCommitCount类似,您可以生成自己的变量来定制版本名。因为我只是执行一个终端命令,将其结果存储在一个变量中。

我只是使用并修改了它,这样提交计数不仅有助于更改名称,而且还确保版本代码保持唯一。下面是我所做工作的一个示例(可能有一些事情可以优化,但仍然可以为我完成这项工作):

编辑: 最后一点也可能是

    applicationVariants.all { variant ->
    if (variant.name.contains('release')) {
        variant.outputs.each { output ->
            variant.outputs.all {
                outputFileName = "MyProject-${variant.versionName}${variant.versionCode}.apk"
            }
        }
    }
}

到此问题已过,但您可以尝试以下方法将动态生成后缀附加到
build.gradle
中的
versionName

def buildCode = (int)(((new Date().getTime()/1000) - 1451606400) / 10)
android {
    compileSdkVersion 30
    buildToolsVersion "30.0.2"
    defaultConfig {
        ...
        versionName "0.1.${buildCode}"
        ...
    }
}

我在发布我的问题后发现了你的问题,你找到解决方案了吗?抱歉,没有,我最终编写了更改版本的bash/bat脚本,现在我要维护Windows和Unix特定的代码:(哈哈,我也创建了自定义脚本,但我将它们作为Gradle任务编写,所以它们是跨平台的:)
variant.mergedFlavor
是您需要的是,我知道,但是
versionNameSuffix
在任何渐变任务之前进行初始化,因此您无法从某些任务中更改它:(这正是我想要的,将调试附加到我的调试构建中以保持我的日志干净。Tx!虽然我不确定这是否是问题细节的最佳答案,但它回答了标题,以及我从google来到这里的问题,所以我给你一个投票。这只起到了部分作用。版本是从文件中读取的,但没有ver incremented!我登录并看到从未调用过
incrementVersionNumber()
。似乎
if (project.hasProperty('isRelease') && project.isRelease) {
        // Here be the logic!
}
apply plugin: 'com.android.application'

android {
    compileSdkVersion 21
    buildToolsVersion "21.1.2"

    def gitCommitCount = "git rev-list HEAD --count".execute().text.trim()

    defaultConfig {
        applicationId "my.app.package.name"
        minSdkVersion 16
        targetSdkVersion 21
        versionCode 6
        versionName "0.8"
    }

    buildTypes {

        debug {
            versionNameSuffix ".${gitCommitCount}"
        }

        release {
            versionNameSuffix ".${gitCommitCount}"
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'

        }
    }
}
android {
    compileSdkVersion 25
    buildToolsVersion "25.0.2"
    def gitCommitCount = "git rev-list HEAD --count".execute().text.trim().toBigInteger()
    project.ext.set("versionCode", gitCommitCount)
    project.ext.set("versionNameSuffix", "(${gitCommitCount})")

    defaultConfig {
        applicationId "my.app.package.name"
        minSdkVersion 15
        targetSdkVersion 25
        versionCode  project.versionCode
        versionName "1.0"
        versionNameSuffix project.versionNameSuffix
        setProperty("archivesBaseName", "MyProject-$versionName")
        ....
    }

    signingConfigs {
        config {
            .........
        }
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            signingConfig signingConfigs.config
        }
    }

    packagingOptions {
        .....
    }

    applicationVariants.all { variant ->
        variant.outputs.each { output ->
            output.outputFile = new File(
                    output.outputFile.parent,
                    output.outputFile.name.replace(".apk", "-${variant.versionName}.apk"))
        }
    }
}
    applicationVariants.all { variant ->
    if (variant.name.contains('release')) {
        variant.outputs.each { output ->
            variant.outputs.all {
                outputFileName = "MyProject-${variant.versionName}${variant.versionCode}.apk"
            }
        }
    }
}
def buildCode = (int)(((new Date().getTime()/1000) - 1451606400) / 10)
android {
    compileSdkVersion 30
    buildToolsVersion "30.0.2"
    defaultConfig {
        ...
        versionName "0.1.${buildCode}"
        ...
    }
}