【问题标题】:" app-release.apk" how to change this default generated apk name“app-release.apk”如何更改这个默认生成的apk名称
【发布时间】:2015-01-31 06:46:07
【问题描述】:

每当我在 Android Studio 中生成签名的 apk 时,默认情况下它都会将名称命名为 app-release.apk...

我们可以做任何设置,以便它应该提示并询问我需要分配给 apk 的名称(它在 eclipse 中的方式)

我所做的是 - 在生成 apk 后重命名它。 这不会给出任何错误,但有什么真正的方法可以让我对设置进行任何更改以获得提示。

注意:

在生成 apk android studio 时提示我选择位置(仅限)

【问题讨论】:

  • 1.change build varient to release 2.select build->generate signed apk 从菜单栏。这样我就生成了签名的apk
  • 这里的所有答案都不正确..使用其中任何一个仍然会出现此问题...问题是工作室缓存了apk工件的名称,并继续使用缓存的名称而不是使用新生成的!

标签: android android-studio


【解决方案1】:

是的,我们可以改变这一点,但需要更多关注

现在将其添加到您项目的 build.gradle 中,同时确保您已检查项目的 build variant,例如 release or Debug 所以在这里我将我的构建变体设置为release,但您也可以选择调试。

    buildTypes {
            release {
                minifyEnabled false
                proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
                signingConfig getSigningConfig()
                applicationVariants.all { variant ->
                    variant.outputs.each { output ->
                        def date = new Date();
                        def formattedDate = date.format('yyyyMMddHHmmss')
                        output.outputFile = new File(output.outputFile.parent,
                                output.outputFile.name.replace("-release", "-" + formattedDate)
    //for Debug use output.outputFile = new File(output.outputFile.parent,
   //                             output.outputFile.name.replace("-debug", "-" + formattedDate)
                        )
                    }
                }
            }
        }

你可以用不同的方法来做这件事

 defaultConfig {
        applicationId "com.myapp.status"
        minSdkVersion 16
        targetSdkVersion 23
        versionCode 1
        versionName "1.0"
        setProperty("archivesBaseName", "COMU-$versionName")
    }

在 build.gradle 中使用 Set 属性方法 并且不要忘记在运行项目之前同步 gradle 希望它能解决你的问题:)

谷歌更新最近添加了一种新的方法来处理这个问题 您现在可以根据风格或变体输出重命名您的构建 //Below source is from developer android documentation 有关更多详细信息,请点击上述文档链接
新插件破坏了使用 Variant API 操作变体输出的问题。它仍然适用于简单的任务,例如在构建期间更改 APK 名称,如下所示:

// If you use each() to iterate through the variant objects,
// you need to start using all(). That's because each() iterates
// through only the objects that already exist during configuration time—
// but those object don't exist at configuration time with the new model.
// However, all() adapts to the new model by picking up object as they are
// added during execution.
android.applicationVariants.all { variant ->
    variant.outputs.all {
        outputFileName = "${variant.name}-${variant.versionName}.apk"
    }
}

重命名 .aab 包 这很好answered by David Medenjak

tasks.whenTaskAdded { task ->
    if (task.name.startsWith("bundle")) {
        def renameTaskName = "rename${task.name.capitalize()}Aab"
        def flavor = task.name.substring("bundle".length()).uncapitalize()
        tasks.create(renameTaskName, Copy) {
            def path = "${buildDir}/outputs/bundle/${flavor}/"
            from(path)
            include "app.aab"
            destinationDir file("${buildDir}/outputs/renamedBundle/")
            rename "app.aab", "${flavor}.aab"
        }

        task.finalizedBy(renameTaskName)
    }
//@credit to David Medenjak for this block of code
}

是否需要以上代码

我在最新版本的android studio 3.3.1中观察到的情况

.aab bundle 的重命名由前面的代码完成,根本不需要任何任务重命名。

希望对大家有所帮助。 :)

【讨论】:

  • 所以使用类似“Abhishek Chaubey”的字符串代替formattedDate
  • 是否可以以某种方式添加versionName?
  • @AbhishekChaubey 在更改 apk 名称后,我无法再通过 Android Studio 运行代码,知道吗?请帮忙...它显示The APK file /Users/.../outputs/apk/NewName-debug-20161004172815.apk does not exist on disk.
  • @BeeingJk 重建项目或关闭 android studio 并从 build 目录中删除输出文件夹然后重建项目或通过清理尝试它。希望它可以帮助你
  • 从 Android Studio 3.0 开始 output.outputFile 是只读的。 @johnny-doe 的 answer 是新的解决方案。
【解决方案2】:

您可能会在使用最新的 android gradle 插件 (3.0) 时遇到错误:

无法设置只读属性“outputFile”的值

根据the migration guide,我们现在应该使用以下方法:

applicationVariants.all { variant ->
    variant.outputs.all {
        outputFileName = "${applicationName}_${variant.buildType.name}_${defaultConfig.versionName}.apk"
    }
}

请注意此处的 2 个主要变化:

  1. 现在使用 all 而不是 each 来迭代变体输出。
  2. 使用outputFileName 属性而不是改变文件引用。

【讨论】:

  • 现在这是 2017 年 10 月 Android Studio 3.0 Beta 7 的正确答案。谢谢。
  • 在我的情况下,${applicationName} 解析为 BuildType_Decorated{name=applicationName, debuggable=false, testCoverageEnabled=false, jniDebuggable=false, pseudoLocalesEnabled=false, renderscript...(为清楚起见而缩短)。这导致包装失败。对我来说${applicationId} 或${archivesBaseName} 是更好的选择。 ${defaultConfig.versionName} 对我来说也是空的。所以${applicationId}_${variant.name}-${variant.versionName} 是我最终得到的。
  • @KGCybeX 通常此代码用于与defaultConfig{} 相同级别的android{} 部分。虽然,您可以使用 android.applicationVariants.all { } 语法在 android{} 之外使用它
  • 你是个救命恩人 ;)
  • 在 Gradle 5.1.1 中工作
【解决方案3】:

(经过编辑以使用 Android Studio 3.0 和 Gradle 4)

我一直在寻找更复杂的 apk 文件名重命名选项,我编写了这个解决方案,用以下数据重命名 apk:

  • 风味
  • 构建类型
  • 版本
  • 日期

你会得到一个这样的 apk:myProject_dev_debug_1.3.6_131016_1047.apk。

You can find the whole answer here。希望对您有所帮助!

在 build.gradle 中:

android {

    ...

    buildTypes {
        release {
            minifyEnabled true
            ...
        }
        debug {
            minifyEnabled false
        }
    }

    productFlavors {
        prod {
            applicationId "com.feraguiba.myproject"
            versionCode 3
            versionName "1.2.0"
        }
        dev {
            applicationId "com.feraguiba.myproject.dev"
            versionCode 15
            versionName "1.3.6"
        }
    }

    applicationVariants.all { variant ->
        variant.outputs.all { output ->
            def project = "myProject"
            def SEP = "_"
            def flavor = variant.productFlavors[0].name
            def buildType = variant.variantData.variantConfiguration.buildType.name
            def version = variant.versionName
            def date = new Date();
            def formattedDate = date.format('ddMMyy_HHmm')

            def newApkName = project + SEP + flavor + SEP + buildType + SEP + version + SEP + formattedDate + ".apk"

            outputFileName = new File(newApkName)
        }
    }
}

【讨论】:

  • 太棒了。唯一需要改进的是某些风格或 buildType (flavor=="dev" || buildType="debug") 的常量文件名(没有版本或日期)
  • 这里的“all”而不是“each”似乎很重要。
  • 给出错误> groovy.lang.MissingPropertyException: No such property: variantConfiguration for class: com.android.build.gradle.internal.variant.ApplicationVariantData。为什么不直接改成buildType = variant.buildType.name?
  • 上面写着"file.apk" is not writeable
  • 你知道这条线的正确之处是“variant.productFlavors[0]”吗?您永远不会获得实际构建的产品风味,而是出现在您的 gradle 文件中的第一个风味。
【解决方案4】:

这是一个更短的方法:

defaultConfig {
    ...
    applicationId "com.blahblah.example"
    versionCode 1
    versionName "1.0"
    setProperty("archivesBaseName", applicationId + "-v" + versionCode + "(" + versionName + ")")
    //or so
    archivesBaseName = "$applicationId-v$versionCode($versionName)"
}

它为您提供名称 com.blahblah.example-v1(1.0)-debug.apk(在调试模式下)

Android Studio 默认通过构建类型名称添加 versionNameSuffix,如果您想覆盖它,请执行以下操作:

buildTypes {
    debug {
        ...
        versionNameSuffix "-MyNiceDebugModeName"
    }
    release {
        ...
    }
}

调试模式下的输出:com.blahblah.example-v1(1.0)-MyNiceDebugModeName.apk

【讨论】:

  • 谢谢。这是最快的选择!
  • 旁注,您可以将 archiveBaseName 添加到本地 gradle.properties 文件中。
  • 确实看起来更清楚了。为什么这不是首选的解决方案?
  • 知道如何摆脱-debugtail 吗?
  • 呃,这会影响应用的版本名而不是文件名:stackoverflow.com/a/41665729/1866373
【解决方案5】:

我修改了@Abhishek Chaubey 的答案以更改整个文件名:

buildTypes {
    release {
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        applicationVariants.all { variant ->
            variant.outputs.each { output ->
                project.ext { appName = 'MyAppName' }
                def formattedDate = new Date().format('yyyyMMddHHmmss')
                def newName = output.outputFile.name
                newName = newName.replace("app-", "$project.ext.appName-") //"MyAppName" -> I set my app variables in the root project
                newName = newName.replace("-release", "-release" + formattedDate)
                //noinspection GroovyAssignabilityCheck
                output.outputFile = new File(output.outputFile.parent, newName)
            }
        }
    }
    debug {
    }
}

这会产生一个类似的文件名:MyAppName-release20150519121617.apk

【讨论】:

  • 如何在 Gradle 中添加变量
  • 为了添加自定义的“appName”属性,将这样的代码添加到您的根项目中:project.ext { appName = 'MyApplicatioName' }
  • @ranma2913 更改 apk 名称后,我无法再通过 Android Studio 运行代码,知道吗?请帮助...它显示 APK 文件 /Users/.../outputs/apk/NewName-debug-20161004172815.apk 在磁盘上不存在。
  • 而不是手动设置 MyAppName,rootProject.name 会给你像在 eclipse 中一样的项目名称。
  • 从 Android Studio 3.0 开始,output.outputFile 是只读的。 @johnny-doe 的 answer 是新的解决方案。
【解决方案6】:

我根据@Fer 的回答写了更通用的解决方案。

它还应该适用于基于风格和构建类型的配置applicationId、versionName、versionCode。

在 build.gradle 中:

android {
    ...
    applicationVariants.all { variant ->
        variant.outputs.each { output ->
            def appId = variant.applicationId
            def versionName = variant.versionName
            def versionCode = variant.versionCode
            def flavorName = variant.flavorName // e. g. free
            def buildType = variant.buildType // e. g. debug
            def variantName = variant.name // e. g. freeDebug

            def apkName = appId + '_' + variantName + '_' + versionName + '_' + versionCode + '.apk';
            output.outputFile = new File(output.outputFile.parentFile, apkName)
        }
    }
}

示例 apk 名称:com.example.app_freeDebug_1.0_1.apk

有关variant 变量的更多信息,请参阅ApkVariant 和BaseVariant 接口定义。

【讨论】:

    【解决方案7】:

    在您的应用级别 gradle 中添加android.applicationVariants.all 块,如下所示

    buildTypes {
            release {
                minifyEnabled false
                proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
                lintOptions {
                    disable 'MissingTranslation'
                }
                signingConfig signingConfigs.release
                android.applicationVariants.all { variant ->
                    variant.outputs.all {
                        outputFileName = "${applicationId}_${versionCode}_${variant.flavorName}_${variant.buildType.name}.apk"
                    }
                }
            }
            debug {
                applicationIdSuffix '.debug'
                versionNameSuffix '_debug'
            }
        }
    

    2019 年 3 月 25 日上市

    【讨论】:

      【解决方案8】:

      不重命名它,但也许一开始就正确生成名称会有所帮助? Change apk name with Gradle

      【讨论】:

        【解决方案9】:

        flavors and split APK 这就是 APK 文件的工作方式,而不是 Bundle / AAB files

        android {
            ....
        
            productFlavors {
                aFlavor {
                    applicationId "com.a"
                
                    versionCode 5
                    versionName "1.0.5"
        
                    signingConfig signingConfigs.signingA
                }
                bFlavor {
                    applicationId "com.b"
        
                    versionCode 5
                    versionName "1.0.5"
        
                    signingConfig signingConfigs.signingB
                }
                cFlavor {
                    applicationId "com.c"
        
                    versionCode 3
                    versionName "1.0.3"
        
                    signingConfig signingConfigs.signingC
                }
            }
        
            splits {
                abi {
                    enable true
                    reset()
                    include 'arm64-v8a', 'x86', 'x86_64'
                    universalApk false
                }
            }
        
            android.applicationVariants.all { variant ->
                variant.outputs.all { output ->
                    // New one or Updated one
                    output.outputFileName = "${variant.getFlavorName()}-${variant.buildType.name}-v${versionCode}_${versionName}-${new Date().format('ddMMMyyyy_HH-mm')}-${output.getFilter(com.android.build.OutputFile.ABI)}.apk"
                    // Old one
                    // output.outputFileName = "${variant.buildType.name}-v${versionCode}_${versionName}-${new Date().format('ddMMMyyyy_HH-mm')}.apk"
                }
            }
        }
        

        ?结果?

        调味

        • 发布

          aFlavor-release-v5_1.0.5-16Jan2020_21-26-arm64-v8a.apk

          aFlavor-release-v5_1.0.5-16Jan2020_21-26-x86_64.apk

          aFlavor-release-v5_1.0.5-16Jan2020_21-26-x86.apk

        • 调试

          aFlavor-debug-v5_1.0.5-16Jan2020_21-26-arm64-v8a.apk

          aFlavor-debug-v5_1.0.5-16Jan2020_21-26-x86_64.apk

          aFlavor-debug-v5_1.0.5-16Jan2020_21-26-x86.apk

        对于bFlavor

        与上面类似的名称只是将前缀 aFlavor 更改为 bFlavor 喜欢

        • bFlavor-release-v5_1.0.5-16Jan2020_21-26-arm64-v8a.apk

        cFlavor

        与上面类似的名称只需将前缀 aFlavor 更改为 cFlavor 并且,versionCode 和 versionName 受到尊重

        • cFlavor-release-v3_1.0.3-16Jan2020_21-26-arm64-v8a.apk

        有关更多详细信息,请查看此 Que-Ans 线程

        【讨论】:

          【解决方案10】:

          首先将您的模块从 app 重命名为 SurveyApp

          第二次将此添加到您的项目顶级(根项目)gradle。它适用于 Gradle 3.0

          //rename apk for all sub projects
          subprojects {
              afterEvaluate { project ->
                  if (project.hasProperty("android")) {
                      android.applicationVariants.all { variant ->
                          variant.outputs.all {
                              outputFileName = "${project.name}-${variant.name}-${variant.versionName}.apk"
                          }
                      }
                  }
              }
          }
          

          【讨论】:

            【解决方案11】:

            在 build.gradle(Module:app) 中添加如下代码

            android {
                ......
                ......
                ......
                buildTypes {
                    release {
                        ......
                        ......
                        ......
                        /*The is the code fot the template of release name*/
                        applicationVariants.all { variant ->
                            variant.outputs.each { output ->
                                def formattedDate = new Date().format('yyyy-MM-dd HH-mm')
                                def newName = "Your App Name " + formattedDate
                                output.outputFile = new File(output.outputFile.parent, newName)
                            }
                        }
                    }
                }
            }
            

            并且发布版本名称将是Your App Name 2018-03-31 12-34

            【讨论】:

              【解决方案12】:

              对于较新的 android studio Gradle

              AppName 是您想要的应用名称,因此请替换它
              variantName 将是默认选择的变体或风味
              日期将是今天的日期,所以需要做任何更改只需粘贴它

              applicationVariants.all { variant ->
                  variant.outputs.all {
                      def variantName = variant.name
                      def versionName = variant.versionName
                      def formattedDate = new Date().format('dd-MM-YYYY')
                      outputFileName = "AppName_${variantName}_D_${formattedDate}_V_${versionName}.apk"
                  }
              }
              

              输出:

              AppName_release_D_26-04-2021_V_1.2.apk

              【讨论】:

                【解决方案13】:

                我已经意识到很多答案并不适合不同的 buildType,这就是我的处理方式。

                applicationVariants.all { variant ->
                   variant.outputs.all {                                       
                      def appVersionName = "${applicationId}v${versionCode}#${versionName}"
                      
                      switch (buildType.name) {
                          case "debug": {  
                              outputFileName = "${appVersionName}-staging.apk"                                            
                              break
                          }
                         case "release": {
                              outputFileName = "${appVersionName}.apk"
                              break
                          }
                      }
                   }
                }
                

                applicationId、versionCode 和 versionName 等属性已在您的 defaultConfig 中定义。每当您生成 APK 时,您都可以轻松地将其格式化为赋予其更有意义和上下文命名的内容。

                这就是它的生产方式。

                com.delacrixmorgan-v1.0.0#1.apk
                com.delacrixmorgan-v1.0.0#1-staging.apk
                

                除此之外,如果你们想了解有关 Gradle 的更多信息。我已经在这篇 Medium 文章中详细介绍了。 Supercharging your Android Gradle

                【讨论】:

                • Unrotunately case 对我不起作用,所以我让它变得更容易:def name = "${applicationId}-${versionName}-${versionCode}"; def suffix = buildType.name == 'debug' ? '-debug' : ''; outputFileName = "${name}${suffix}.apk";
                【解决方案14】:

                我的解决方案也可能对某人有所帮助。

                使用 Gradle 4.4

                在 IntelliJ 2017.3.2 上测试并运行

                场景:

                我的应用程序中有 2 种风格,因此我希望根据每种风格适当地命名每个版本。

                以下代码将被放入您的模块 gradle 构建文件中:

                {app-root}/app/build.gradle

                要添加到 android{ } 块的 Gradle 代码:

                android {
                    // ...
                
                    defaultConfig {
                        versionCode 10
                        versionName "1.2.3_build5"
                    }
                
                    buildTypes {
                        // ...
                
                        release {
                            // ...
                
                            applicationVariants.all { 
                                variant.outputs.each { output ->
                                    output.outputFile = new File(output.outputFile.parent, output.outputFile.name.replace(output.outputFile.name, variant.flavorName + "-" + defaultConfig.versionName + "_v" + defaultConfig.versionCode + ".apk"))
                                }
                            }
                
                        }
                    }
                
                    productFlavors {
                        myspicyflavor {
                            applicationIdSuffix ".MySpicyFlavor"
                            signingConfig signingConfigs.debug
                        }
                
                        mystandardflavor {
                            applicationIdSuffix ".MyStandardFlavor"
                            signingConfig signingConfigs.config
                        }
                    }
                }
                

                以上提供了在{app-root}/app/中找到的以下APK:

                myspicyflavor-release-1.2.3_build5_v10.apk
                mystandardflavor-release-1.2.3_build5_v10.apk
                

                希望它对某人有用。

                有关更多信息,请参阅问题中提到的其他答案

                【讨论】:

                  【解决方案15】:

                  安卓工作室 4.1.1

                  applicationVariants.all { variant ->
                    variant.outputs.all { output ->
                      def reversion = "118"
                      def date = new java.text.SimpleDateFormat("yyyyMMdd").format(new Date())
                      def versionName = defaultConfig.versionName
                      outputFileName = "MyApp_${versionName}_${date}_${reversion}.apk"
                    }
                  }
                  

                  【讨论】:

                    【解决方案16】:

                    我认为这会有所帮助。

                    buildTypes {
                        release {
                            shrinkResources true
                            minifyEnabled true
                            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
                            applicationVariants.all { variant ->
                                variant.outputs.each { output ->
                                    project.ext { appName = 'MyAppName' }
                                    def formattedDate = new Date().format('yyyyMMddHHmmss')
                                    def newName = output.outputFile.name
                                    newName = newName.replace("app-", "$project.ext.appName-")
                                    newName = newName.replace("-release", "-release" + formattedDate)
                                    output.outputFile = new File(output.outputFile.parent, newName)
                                }
                            }
                        }
                    }
                    productFlavors {
                        flavor1 {
                        }
                        flavor2 {
                            proguardFile 'flavor2-rules.pro'
                        }
                    }
                    

                    【讨论】:

                      【解决方案17】:

                      将此代码放入 build.gradle(app)

                       android {
                      
                            .......
                           applicationVariants.all { variant ->
                                  variant.outputs.all {
                                      outputFileName = "Name_of_App.apk"
                                  }}
                               }
                      

                      【讨论】:

                        【解决方案18】:

                        最简单的方法 - 在 build.gradle(app) 中:

                        android {
                            compileSdk 31
                            project.archivesBaseName = "Scanner"
                        
                            defaultConfig {
                        

                        而且 - 您将收到:Scanner-release.apk

                        【讨论】:

                          猜你喜欢
                          • 2020-01-03
                          • 1970-01-01
                          • 1970-01-01
                          • 2015-03-12
                          • 1970-01-01
                          • 2017-03-23
                          • 2016-06-08
                          • 1970-01-01
                          • 1970-01-01
                          相关资源
                          最近更新 更多