【问题标题】:Set Android versionCode after Gradle task completesGradle 任务完成后设置 Android versionCode
【发布时间】:2015-09-10 17:34:13
【问题描述】:

我有一个任务会更新我的应用程序的版本代码,称为 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)
}

然后:

# Build an APK with versionCode 1
$ ./gradlew assembleRelease

# This seems to change versionCode to 2, but still builds an APK with versionCode 1
#
# Prints:
#     Old version code: 1
#     New version code: 2
$ ./gradlew incrementVersionCode assembleRelease

我正在使用:

  • 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 构建任务之前从任务中更改我的版本代码?

【问题讨论】:

    标签: android gradle android-gradle-plugin build.gradle


    【解决方案1】:

    如何在任务启动前配置 versionCode

    您可以使用 DSL tasks.whenTaskAdded。您可以阅读official doc,第 58.6.2 章。任务创建。

    您可以在将任务添加到项目后立即收到通知。这可用于设置一些默认值或添加行为在任务在构建文件中可用。

    你可以定义一个任务:

    task incrementVersionCode << {
        //do something
    }
    

    然后定义依赖:

    tasks.whenTaskAdded { task ->
        if (task.name == 'xxxxx') {
            task.dependsOn incrementVersionCode 
        }
    }
    

    在你的情况下,你可以这样做:

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

    如何用函数配置versionCode

    在顶层文件中你可以像这样配置一个函数:

    ext {
    
         buildVersionCode = {
           //...
        }
    }
    

    在您的module/build.gradle 中,您可以执行以下操作:

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

    否则,您可以在 build.gradle 中执行以下操作:

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

    【讨论】:

    • 根据函数结果设置versionCode没有问题。问题是我有一个更改 versionCode 的 Gradle 任务,这使得 android { versionCode } 过时了。我将编辑我的问题以澄清。
    • @mrb 我已经更新了答案。您可以使用 tasks.whenTaskAdded
    猜你喜欢
    • 1970-01-01
    • 2021-12-31
    • 2019-05-17
    • 1970-01-01
    • 1970-01-01
    • 2018-12-16
    • 1970-01-01
    • 2016-12-20
    • 2016-01-10
    相关资源
    最近更新 更多