android - 循环中的 Gradle 复制和重命名

标签 android gradle build.gradle

我正在使用 Android Studio 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
  • 映射 flavor 1.txt
  • flavor2-release.apk
  • 映射 flavor 2.txt

  • 我得到什么:
  • flavor1-release.apk
  • 映射 flavor 1.txt
  • flavor2-release.apk

  • gradle 复制是异步的吗?

    看起来如果在所有副本之后完成重命名。

    最佳答案

    你可能不知道,gradle build 包含 3 个阶段:

  • 初始化
  • 配置
  • 执行

  • 任务(包括您使用的Copy)操作(任务是按顺序运行的操作的集合)在第二阶段配置。夏娃如果你把循环放在任务的主体中,最后一次迭代将获胜。最简单的方法是将您的任务更改为以下内容(手动复制):
    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'
            }
           }
          }
        }
      }
    }
    

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

    关于android - 循环中的 Gradle 复制和重命名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47253559/

    相关文章:

    gradle - 测试任务的额外属性无法保持值(value)

    android - RemoteView.setImageViewResource 不显示任何内容

    java.lang.NoClassDefFoundError : Failed resolution of: Lcom/google/android/gms/common/GoogleApiAvailabilityLight;

    java - 我有两张 Bitmap 格式的图片,我想将一张透明度为 50% 的图片叠加在另一张上

    java - 打开带有建议日期的 DatePicker

    android - Android Studio 3.2.1项目同步失败

    android - "already added"ormlite 和 gradle 异常

    gradle - 包括来自其他模块的测试

    java - Heroku 在 gradle 任务 'nodeSetup' 期间构建失败,错误为 'Couldn' t follow 符号链接(symbolic link)'

    android - 带有gradle build 4.1的android studio 3.0.1中的Gradle同步错误