Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/198.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 循环中的渐变复制和重命名_Android_Gradle_Build.gradle - Fatal编程技术网

Android 循环中的渐变复制和重命名

Android 循环中的渐变复制和重命名,android,gradle,build.gradle,Android,Gradle,Build.gradle,我在安卓工作室3工作 对于每种口味,我都要复制mapping.txt并重命名它 我的Gradle任务: task deployApks(type: Copy) { android.applicationVariants.all { variant -> if (variant.buildType.name == 'release') { variant.outputs.all { def f

我在安卓工作室3工作

对于每种口味,我都要复制
mapping.txt
并重命名它

我的Gradle任务:

task deployApks(type: Copy) {
        android.applicationVariants.all { variant ->
            if (variant.buildType.name == 'release') {
            variant.outputs.all {
                  def flavor = variant.productFlavors.name.get(0)

                  def dirApk = System.getProperty("user.dir") + '/app/build/' + flavor + '/release/'
                  def dirMapping = System.getProperty("user.dir") + '/app/build/outputs/mapping/' + flavor + '/release/'

                  //copy apk and mapping.txt
                  from dirApk, dirMapping
                  include '*-release.apk', 'mapping.txt'
                  into dirDeploy

                  //rename mapping.txt
                  from dirDeploy
                  include 'mapping.txt'
                  into dirDeploy
                  rename 'mapping.txt', 'mapping-' + flavor + '.txt'
                  println("Rename mapping.txt tomapping-" + flavor + ".txt")
             }
        }
    }
}
在部署目录中需要什么:

  • flavor1-release.apk

  • mapping-1.txt

  • flavor2-release.apk

  • mapping-2.txt

我得到的是:

  • flavor1-release.apk

  • mapping-1.txt

  • flavor2-release.apk

梯度复制是异步的吗


看起来好像在所有副本之后都进行了重命名。

您可能不知道,但gradle构建包含3个阶段:

  • 初始化
  • 配置
  • 执行
任务(包括您使用的
Copy
)操作(任务是按顺序运行的操作集合)在第二阶段配置。Eve如果您将循环放入任务体中,则最后一次迭代将获胜。最简单的方法是将任务更改为以下内容(手动复制):


如果这解决了问题-(您不需要任务缓存),您可以使用。否则,您需要适当地配置
复制
任务,甚至编写自定义任务。

我认为关键是
variant.assemble.doLast
。我首先制作所有apk文件,完成后运行doLast任务复制和重命名mapping.txt文件

渐变4(兼容)


那是完整的格拉德尔剧本吗?您在哪里定义了
copy
?您好,我已经添加了完整的任务脚本。太棒了!我的复印任务错了。我将2个副本{}重新组合成一个副本以简化它。我可以编辑您的回复吗?@rcperso,当然可以。阅读gradle是如何工作的,在某个操场上尝试一下。
task deployApks {
  doLast {
    android.applicationVariants.all { variant ->
      if (variant.buildType.name == 'release') {
      variant.outputs.all {
        def flavor = variant.productFlavors.name.get(0)

        def dirApk = System.getProperty("user.dir") + '/app/build/' + flavor + '/release/'
        def dirMapping = System.getProperty("user.dir") + '/app/build/outputs/mapping/' + flavor + '/release/'

        //copy apk and mapping.txt
        copy {
          from dirApk, dirMapping
          include '*-release.apk', 'mapping.txt'
          into dirDeploy
          rename 'mapping.txt', 'mapping-' + flavor + '.txt'
        }
       }
      }
    }
  }
}
// Map for the version code that gives each ABI a value.
ext.abiCodes = ['armeabi':3, 'armeabi-v7a':4, 'arm64-v8a':5, 'mips':6, 'x86':7, 'x86_64':8].withDefault {0}

import com.android.build.OutputFile
android.applicationVariants.all { variant ->
    def customName = ""
    if (project.hasProperty('projectName')) {
        customName = projectName
    } else {
        customName = project.name
    }

    def flavorName = variant.productFlavors[0].name
    def buildType = variant.variantData.variantConfiguration.buildType.name
    def abiVersionCode = ""
    def abiName = ""
    def fileName = ""
    def mappingDir = "${rootDir}/build/outputs/mapping/${flavorName}/${buildType}"


    variant.outputs.all { output ->
        abiVersionCode = project.ext.abiCodes.get(output.getFilter(OutputFile.ABI))
        if (abiVersionCode != null) {
            output.versionCodeOverride = abiVersionCode * 1000 + variant.versionCode
        }
        abiName = output.getFilter(OutputFile.ABI)
        if (abiName == null) {
            abiName = "universal"
            output.versionCodeOverride = 1 * 1000 + variant.versionCode
        }

        fileName = customName + "_" + variant.versionName + "-" + flavorName + "-" + abiName + "-" + buildType + "-" + output.versionCode
        outputFileName = new File("${fileName}.apk")
    }


    variant.assemble.doLast {
        variant.outputs.all { output ->
            if (buildType == "release") {
                def mappingFile = "${mappingDir}/mapping.txt"
                def newMappingName = "${fileName}-mapping.txt"

                delete "${output.outputFile.parent}/${newMappingName}"
                copy {
                    from "${mappingFile}"
                    into "${rootDir}"
                    rename { String mappingName ->
                        "${output.outputFile.parent}/${newMappingName}"
                    }
                }
            }

            delete "${output.outputFile.parent}/output.json"
        }
    }
}