android - Gradle 任务完成后设置 Android versionCode

标签 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 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
  • Ant 1.9.3
  • Java 1.8.0_45
  • Mac OS X 10.10.5
  • Android 构建工具 22.0.1

在调用 Android 构建任务之前,有什么方法可以更改任务的版本代码吗?

最佳答案

如何在任务启动前配置versionCode

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

You can receive a notification immediately after a task is added to a project. This can be used to set some default values or add behaviour before the task is made available in the build file.

您可以定义任务:

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 //.... ;
} 

关于android - Gradle 任务完成后设置 Android versionCode,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32508297/

相关文章:

android - MyLocationOverlay 与 LocationManager.requestLocationUpdates

android - Android Studio无法同步Gradle项目

android - 如何在我的类里面使用共享首选项

java - 具有 PendingIntent 的 LocationManager.requestLocationUpdates 在 API 26 上不起作用

Android 相当于 applicationDidBecomeActive 和 applicationWillResignActive(来自 iOS)

gradle - 在gradle中创建源代码的zip

java - Spring boot gradle + lombok - 检测编译类路径上的注释处理器已被弃用

Android Studio Gradle 使用变量

android - annotationProcessor + androidTest + dagger2

android - 在 Android Studio 中运行 flutter 项目时出现 Gradle 错误