在Gradle任务完成后设置Android版本代码

在Gradle任务完成后设置Android版本代码,android,gradle,android-gradle-plugin,build.gradle,Android,Gradle,Android Gradle Plugin,Build.gradle,我有一个更新我的应用程序版本代码的任务,叫做changeVersionCode。此任务在我的Android构建任务(assembleRelease)之前运行,但显然它发生在Android{}关闭之后。这似乎意味着versionCode已设置,即使在changeVersionCode运行时也无法更改 下面是一个简化的构建脚本,演示了我如何尝试解决此问题: // .version is a file that starts at "1" the first time I call this def

我有一个更新我的应用程序版本代码的任务,叫做changeVersionCode。此任务在我的Android构建任务(assembleRelease)之前运行,但显然它发生在
Android{}
关闭之后。这似乎意味着versionCode已设置,即使在changeVersionCode运行时也无法更改

下面是一个简化的构建脚本,演示了我如何尝试解决此问题:

// .version is a file that starts at "1" the first time I call this

def loadVersionCode() {
    // fetch version code from a file, '.version'
    return loadVersionCodeFromFile('.version')
}

def incrementVersionCode() {
    // fetch version code, update it, and save it back to a file
    def newVersion = loadVersionCode() + 1
    saveVersionCodeToFile('.version', newVersion)
}

apply plugin: 'com.android.application'

android {
    // ... snip ...
    defaultConfig {
        // Set the version code to contents of .version (eg. 1)
        versionCode loadVersionCode()
        // ...
    }
}

task incrementVersionCode << {
    println "Old version code: " + android.defaultConfig.versionCode // prints 1

    incrementVersionCode()
    def newVersion = loadVersion() // this now returns 2

    android.defaultConfig.versionCode = loadVersionCode()
    // Also tried:
    // android.defaultConfig.versionCode loadVersionCode()

    println "New version code: " + android.defaultConfig.versionCode // prints 2
    // android.defaultConfig.versionCode is now 2, but APK still has version 1 (until next time I run gradle)
}
我正在使用:

  • 梯度2.5
  • Groovy 2.3.10
  • 蚂蚁1.9.3
  • Java 1.8.0_45
  • Mac OS X 10.10.5
  • Android构建工具22.0.1

在调用Android build tasks之前,是否有任何方法可以更改任务的版本代码?

如何在启动任务之前配置versionCode

您可以使用DSL
任务。添加任务时
。您可以阅读第58.6.2章。任务创建

将任务添加到项目后,您可以立即收到通知。这可用于在生成文件中提供任务之前设置一些默认值或添加行为

您可以定义任务:

task incrementVersionCode << {
    //do something
}
在您的情况下,您可以这样做:

tasks.whenTaskAdded { task ->
    if (task.name == 'generateReleaseBuildConfig' || task.name == 'generateDebugBuildConfig') {
        task.dependsOn 'increaseVersionCode'
    }
}
ext {

     buildVersionCode = {
       //...
    }
}
defaultConfig {
    versionCode buildVersionCode()
    //....
}

如何使用函数配置versionCode

在顶级文件中,您可以配置如下功能:

tasks.whenTaskAdded { task ->
    if (task.name == 'generateReleaseBuildConfig' || task.name == 'generateDebugBuildConfig') {
        task.dependsOn 'increaseVersionCode'
    }
}
ext {

     buildVersionCode = {
       //...
    }
}
defaultConfig {
    versionCode buildVersionCode()
    //....
}
模块/build.gradle
中,您可以执行以下操作:

tasks.whenTaskAdded { task ->
    if (task.name == 'generateReleaseBuildConfig' || task.name == 'generateDebugBuildConfig') {
        task.dependsOn 'increaseVersionCode'
    }
}
ext {

     buildVersionCode = {
       //...
    }
}
defaultConfig {
    versionCode buildVersionCode()
    //....
}
否则,您可以在
build.gradle
中执行以下操作:

defaultConfig {
    //...
    versionCode getMyNumber()
}


def getMyNumber() {
    return //.... ;
} 

根据函数的结果设置versionCode没有问题。问题是我有一个Gradle任务,它改变了versionCode,这使得
android{versionCode}
过时了。我将编辑我的问题以澄清。@mrb我已更新了答案。您可以使用tasks.whenTaskAdded