【问题标题】:Gradle: applicationVariants.all skips one variantGradle:applicationVariants.all 跳过一个变体
【发布时间】:2020-06-20 05:26:32
【问题描述】:

我正在使用 Gradle 编译我的 Android 项目:

buildTypes {
    release {
        signingConfig signingConfigs.release 
        applicationVariants.all { variant ->
            def file = variant.outputFile
            def fileName = file.name
            fileName = fileName.replace(".apk", "-renamed.apk")
            variant.outputFile = new File(file.parent, fileName)
        }
    }
}

并非所有输出文件都被重命名,它总是跳过 1 个文件。为什么?

myapp-debug-unaligned-renamed.apk    <-renamed, OK!
myapp-release.apk                    <-NOT renamed, WRONG!
myapp-release-unaligned-renamed.apk  <-renamed, OK!

【问题讨论】:

    标签: android gradle


    【解决方案1】:

    我用这段代码解决了:

    buildTypes {
        release {
            signingConfig signingConfigs.release 
        }
    
        applicationVariants.all { variant ->
            def apk = variant.packageApplication.outputFile;
            def newName = apk.name.replace(".apk", "-renamed.apk");
            variant.packageApplication.outputFile = new File(apk.parentFile, newName);
            if (variant.zipAlign) {
                variant.zipAlign.outputFile = new File(apk.parentFile, newName.replace("-unaligned", ""));
            }
        }
    }
    

    applicationVariants.all {...} 块现在位于 release {...} 块之外。

    我认为variant.zipAlign.outputFile 与众不同。

    【讨论】:

    【解决方案2】:

    在使用您的 build.gradle 配置时应该有 3 个输出 APK 文件:调试未签名未对齐、发布已签名对齐和发布已签名未对齐。 applicationVariant有两个变量来处理输出文件:outputFilepackageApplication.outputFile,前者用于zipalign,后者用于一般情况。

    所以重命名所有文件的正确方法是这样的:

    android.applicationVariants.all { variant ->
        if (variant.zipAlign) {
            def oldFile = variant.outputFile;
            def newFile = oldFile.name.replace(".apk", "-renamed.apk")
            variant.outputFile = new File(oldFile.parent, newFile)
        }
    
        def oldFile = variant.packageApplication.outputFile;
        def newFile = oldFile.name.replace(".apk", "-renamed.apk")
        variant.packageApplication.outputFile = new File(oldFile.parent, newFile)
    }
    

    【讨论】:

      【解决方案3】:

      我通过删除你的一行来简化它,但基本上你需要像这样改变它:

      android {
      
          buildTypes {
          ...
          }
      
          applicationVariants.all { variant ->
              def file = variant.outputFile
              def fileName = file.name.replace(".apk", "-renamed".apk")
              variant.outputFile = new File(file.parent, fileName)
          }
      }
      

      【讨论】:

      • 从 buildTypes {} 块中取出代码并不能解决问题。
      • 变体现在有 outputFiles(复数)。
      猜你喜欢
      • 1970-01-01
      • 2019-03-09
      • 1970-01-01
      • 2018-05-01
      • 1970-01-01
      • 2014-04-01
      • 2014-03-22
      • 2011-02-22
      • 1970-01-01
      相关资源
      最近更新 更多