【问题标题】:Renaming apk with gradle -> getting same apk twice使用 gradle 重命名 apk -> 两次获得相同的 apk
【发布时间】:2026-02-11 01:45:02
【问题描述】:

我有一个不同风格的应用 - 每种风格都有两个 buildType。

重命名清单中的某些行后,我还重命名了 apk。一切正常 - 我只是想知道为什么我两次获得相同的 apk?一次没改名一次改名...

具有不同名称的同一应用的简短示例:

  • “myApp-flavor-buildType.apk”(未重命名)
  • “myApp-appName-buildType-version.apk”(重命名为 apk)

这是我的 build.gradle 文件的代码:

// *** OVERRIDE data in MANIFEST ***
android.applicationVariants.each { variant ->
    variant.processManifest.doLast {
        overrideDataInManifest(variant)
    }
}

def overrideMapsKey(buildVariant){
    def appName = getAppName(buildVariant)

    // override line ... this is not necessary to this question

    renameAPK(buildVariant, appName)
}

// *** RENAME APK ***
def renameAPK(buildVariant, appName){
    def apk = buildVariant.packageApplication.outputFile;
    def newName = "";

    // get data for apk renaming
    def versionName = android.defaultConfig.versionName 
    def versionNameSuffix = buildVariant.buildType.versionNameSuffix
    if(versionNameSuffix.toString().equals("null"))
        versionNameSuffix = ""
    def buildTypeOfApp= buildVariant.buildType.name 

    if (buildVariant.zipAlign) {
        newName = "etscanner-" + appName + "-" + buildTypeOfApp.toUpperCase() + "-v" + versionName + versionNameSuffix + ".apk"
    }else{
        newName = "etscanner-" + appName + "-" + buildTypeOfApp.toUpperCase() + "-v" + versionName + versionNameSuffix + "-ALIGNED" + ".apk"
    }
    buildVariant.packageApplication.outputFile = new File(apk.parentFile, newName);
}

只是想知道发生了什么,以及是否可以在不获取两个 apk 的情况下执行相同的任务。

【问题讨论】:

    标签: android gradle android-studio build.gradle


    【解决方案1】:

    zipAlign 选项设置为 true 的变体总是有两个 APK 文件。首先 gradle 构建原始 APK 文件,然后对其进行 zipalign 并生成优化版本而不删除原始版本。

    buildVariant.packageApplication.outputFile 是构建过程的中间产物,据我观察,它始终是未对齐的 APK 文件。

    buildVariant.outputFile 是应用 zipAlign 选项的最终输出。

    另一方面,您可能想要更正 build.gradile 文件,它实际上将 APK 文件的未对齐版本重命名为“ALIGNED”版本,并保持 zipalign APK 文件不变。这是我的修改版本:

    if (buildVariant.zipAlign) {
        newName = "etscanner-" + appName + "-" + buildTypeOfApp.toUpperCase() + "-v" + versionName + versionNameSuffix + "-ALIGNED.apk"
        buildVariant.outputFile = new File(apk.parentFile, newName);
    }
    
    newName = "etscanner-" + appName + "-" + buildTypeOfApp.toUpperCase() + "-v" + versionName + versionNameSuffix + "-UNALIGNED" + ".apk"
    buildVariant.packageApplication.outputFile = new File(apk.parentFile, newName);
    

    【讨论】:

    • 谢谢!在我上面的帖子中,我没有区分buildVariant.packageApplication.outputFilebuildVariant.outputFile。所以我得到了一个奇怪的行为:有些文件被重命名,有些没有。现在每个 apk 都按照我想要的方式重命名。再次感谢您的解释:)
    【解决方案2】:

    对于任何搜索重命名 android 库文件 (aar) 的人,以下是我为 gradle 2.+ 版本提出的建议:

    android.libraryVariants.all { variant ->
        if (variant.buildType.name == 'release') {
            def oldFile = variant.outputs.get(0).getOutputFile()
            if (oldFile.name.contains("release")) {
                def newPath = oldFile.name.replace("release.aar", version.toString() + ".aar")
                variant.outputs.get(0).
                        setOutputFile(new File(oldFile.parentFile.toString(), newPath.toString()))
            }
        }
    }
    

    如果您想出更好的方法,请告诉我。

    【讨论】:

      【解决方案3】:
       buildTypes {
              release {
                  debuggable false
                  jniDebuggable false
                  signingConfig signingConfigs.config
                  minifyEnabled false
                  zipAlignEnabled true
      
                  applicationVariants.all { variant ->
                      variant.outputs.each { output ->
                          def outputFile = output.outputFile
                          if ((variant.buildType.name == 'release') && outputFile != null && outputFile.name.endsWith('.apk')) {
                              def fileName = "myFileName_release_" + defaultConfig.versionName + ".apk"
                              output.outputFile = new File(outputFile.parent, fileName)
                          }
                      }
                  }
      
      
              }
              debug {
                  debuggable true
                  jniDebuggable false
                  renderscriptDebuggable false
                  minifyEnabled false
                  zipAlignEnabled true
                  signingConfig signingConfigs.config
      
                  applicationVariants.all { variant ->
                      variant.outputs.each { output ->
                          def outputFile = output.outputFile
                          if ((variant.buildType.name == 'debug') && outputFile != null && outputFile.name.endsWith('.apk')) {
                              def fileName = "myFileName_debug_" + defaultConfig.versionName + ".apk"
                              output.outputFile = new File(outputFile.parent, fileName)
                          }
                      }
                  }
              }
          }
      

      【讨论】:

        【解决方案4】:

        如果您使用的是 Android Gradle Plugin 0.13 或更高版本,界面会发生一些变化:

        android.applicationVariants.all { variant ->
        
            def name
            variant.outputs.each { output ->
        
                def apkDirectory = variant.packageApplication.outputFile.parentFile
        
                if (output.zipAlign) {
                    name = "yourAppName.apk"
                    output.outputFile = new File(apkDirectory, name);
                }
        
                name = "yourAppName-UNALIGNED.apk"
                variant.packageApplication.outputFile = new File(apkDirectory, name);
            }    
        }
        

        【讨论】:

          最近更新 更多