使用Gradle自动递增versionCode时出现问题

Seb*_*ano 5 android gradle android-manifest

我正在尝试配置应用程序的构建变体,作为从Ant迁移到Gradle的一部分.我想出的结构如下:

main
  |-> monkey
Run Code Online (Sandbox Code Playgroud)

我想要一种自动递增 "猴子"味道的版本代码的方法.我复制了AndroidManifest,因此它类似于下面的结构.我添加了两个版本代码和两个版本名称,我将用它来解释我面临的问题.

main
  |-> AndroidManifest.xml
        | -> versionName="mainFlavour"
        | -> versionCode=12
monkey
  |-> AndroidManifest.xml
        | -> versionName="monkeyFlavour"
        | -> versionCode=13
Run Code Online (Sandbox Code Playgroud)

第一种方法

我的第一次尝试是基于这个答案,包括定义一个解析AndroidManifest文件并增加版本代码的任务.该任务将是该任务的依赖generateBuildConfig项.

结果是每当我使用'monkey'风格构建时,读取版本代码和版本名称属性会导致此输出:

 versionName "monkeyFlavour"
 versionCode 12
Run Code Online (Sandbox Code Playgroud)

也就是说,构建版本具有'monkey'风格的版本名称,但是'main'风格的版本代码.使用PackageManagerBuildConfig读取这些值没有区别.这是我使用的代码:

// Increment version code for 'monkey' builds
task('increaseVersionCode') << {
    def manifestFile = file("src/monkey/AndroidManifest.xml")
    def pattern = Pattern.compile("versionCode=\"(\\d+)\"")
    def manifestText = manifestFile.getText()
    def matcher = pattern.matcher(manifestText)
    matcher.find()
    def versionCode = Integer.parseInt(matcher.group(1))
    def manifestContent = matcher.replaceAll("versionCode=\"" + ++versionCode + "\"")
    manifestFile.write(manifestContent)
}

tasks.whenTaskAdded { task ->
    if (task.name == 'generateMonkeyReleaseBuildConfig') {
        task.dependsOn 'increaseVersionCode'
    }
}
Run Code Online (Sandbox Code Playgroud)

第二种方法

然后我尝试了另一种方法,这里描述的方法是定义一个函数,该函数增加AndroidManifest文件的版本代码并返回递增的值.然后通过versionCode'monkey'风格的属性分配该值.

apply plugin: 'android'

android {

    ...

    productFlavors {
        monkey {
            versionCode incrementVersionCode()
        }
    }

    ...

}

def incrementVersionCode() {
    def manifestFile = file("src/monkey/AndroidManifest.xml")
    def pattern = Pattern.compile("versionCode=\"(\\d+)\"")
    def manifestText = manifestFile.getText()
    def matcher = pattern.matcher(manifestText)
    matcher.find()
    def versionCode = Integer.parseInt(matcher.group(1))
    def manifestContent = matcher.replaceAll("versionCode=\"" + ++versionCode + "\"")
    manifestFile.write(manifestContent)
    return versionCode
}
Run Code Online (Sandbox Code Playgroud)

这种方法证明了我实现了我想要的目标.但我想了解第一种方法有什么问题.我希望有人能开导我.