Android 仅在版本上自动增加版本代码

Android 仅在版本上自动增加版本代码,android,gradle,android-gradle-plugin,Android,Gradle,Android Gradle Plugin,目前,我正试图通过自动增加版本代码来改进我们的构建脚本,这样我们的QA团队就可以了解他们正在测试的构建,并可以根据特定的版本代码进行日志记录。我们有3种产品风格(登台、qa、生产)和2种签名配置(调试、发布) 我研究了不同的解决方案: 基于这些答案,我使用version.properties文件构建了一个版本代码增量 现在问题出现了,对于每个productFlavor和SigningConfig组合(+android studio中的gradle同步),都会生成一个新的版本代码。每当我点击

目前,我正试图通过自动增加版本代码来改进我们的构建脚本,这样我们的QA团队就可以了解他们正在测试的构建,并可以根据特定的版本代码进行日志记录。我们有3种产品风格(登台、qa、生产)和2种签名配置(调试、发布)

我研究了不同的解决方案:

基于这些答案,我使用version.properties文件构建了一个版本代码增量

现在问题出现了,对于每个productFlavor和SigningConfig组合(+android studio中的gradle同步),都会生成一个新的版本代码。每当我点击play按钮创建一个发布版本时,我希望versioncode增加。因此,我们的构建周期是:

  • 开发(从不更改版本代码)
  • qual(更新版本代码)
  • 生产(从不更改版本代码)

    • 你可以试试这样的东西

      import java.util.regex.Pattern    
      task('increaseVersionCode') << {
      
          ... // You could code in your increment system, for eg
      
          // Using build.gradle (recommended)
          def buildFile = file("build.gradle")
          def pattern = Pattern.compile("versionCode\\s+(\\d+)")
          def manifestText = buildFile.getText()
          def matcher = pattern.matcher(manifestText)
          matcher.find()
          def versionCode = Integer.parseInt(matcher.group(1))
          def manifestContent = matcher.replaceAll("versionCode " + ++versionCode)
          buildFile.write(manifestContent)
      
      
          // Using manifest
          def manifestFile = file('AndroidManifest.xml')
          def matcher = Pattern.compile('versionCode=\"(\\d+)\"')
          .matcher(manifestFile.getText())
          matcher.find()
          def manifestContent = matcher.replaceAll('versionCode=\"' +
          ++Integer.parseInt(matcher.group(1)) + '\"')
          manifestFile.write(manifestContent)
      }
      
      
      
      tasks.whenTaskAdded { task ->
          if (task.name == 'assembleQaRelease') {
              task.dependsOn 'increaseVersionCode'
          }
      }
      
      import java.util.regex.Pattern
      任务('increaseVersionCode')
      if(task.name==“assembleqarease”){
      task.dependsOn“increaseVersionCode”
      }
      }
      
      您可以调整“assembleQaRelease”以增加版本代码以满足所需任务。

      我是如何解决的:

      • 我在android项目的根目录中创建了一个version.properties文件,并在其中添加了versioncode

      • 然后,我在build.gradle文件中创建了一个名为getCurrentVersionCode()的方法,该方法读取当前版本代码

      代码:

      我还创建了一个生成新代码的方法:

      代码:

      然后我创建了一个任务,在QA构建时触发

      代码:

      任务('increaseVersionCode')
      if(task.name==“assembleqarease”){
      task.dependsOn“increaseVersionCode”
      }
      }
      

      这样,它将版本代码保存在一个单独的文件中,因此我不需要使用
      文件(“build.gradle”)

      编辑build.gradle.
      你是说android清单文件而不是build.gradle?这取决于你设置版本代码的时间。在build.gradle中定义它是一种很好的做法,它覆盖了清单。只需选择适合您的项目的解决方案;)我会接受你的答案,因为你让我走上了正确的道路。但是我做了一些其他的事情,我也要在解决方案中添加:)有什么特别的方法让gradle读取您在项目文件夹根目录中创建的version.properties文件吗?我无法让gradle读取此文件。这不可能吗?
      def getCurrentVersionCode() {
          def versionPropsFile = file('version.properties')
          def Properties versionProps = new Properties()
      
          versionProps.load(new FileInputStream(versionPropsFile))
      
          return versionProps['version_code'].toInteger()
      }
      
      // http://stackoverflow.com/questions/30523393/auto-increment-versioncode-only-on-releases
      //
      def setUpdatedVersionCode() {
          def versionPropsFile = file('version.properties')
          def Properties versionProps = new Properties()
      
          def code = getCurrentVersionCode() + 1
      
          versionProps['version_code'] = code.toString()
          versionProps['version_name'] = generateVersionName()
      
          versionProps.store(versionPropsFile.newWriter(), null)
      }
      
      task('increaseVersionCode') << {
          setUpdatedVersionCode()
      }
      
      tasks.whenTaskAdded { task ->
          if (task.name == 'assembleQaRelease') {
              task.dependsOn 'increaseVersionCode'
          }
      }