" APP-release.apk"如何更改此默认生成的apk名称

时间:2015-01-31 06:46:08

标签: android android-studio

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

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

我所做的是 - 在生成后重命名apk。 这并没有给出任何错误,但有任何真实的方法,以便我可以在设置中进行任何更改以获得提示。

请注意:

生成apk安卓工作室时,我提示选择位置(仅限)enter image description here

15 个答案:

答案 0 :(得分:119)

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

SeeThis

现在将其添加到项目的 build.gradle 中,同时确保已检查项目的构建变体,例如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包的重命名由前面的代码完成,不需要任何任务重命名全部。

希望它会帮助你们。 :)

答案 1 :(得分:54)

您可能会使用最新的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. 使用
  3. outputFileName属性而不是改变文件引用。

答案 2 :(得分:52)

我修改了@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

答案 3 :(得分:33)

(已编辑以使用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)
        }
    }
}

答案 4 :(得分:18)

这是一个更短的方式:

defaultConfig {
    ...
    applicationId "com.blahblah.example"
    versionCode 1
    versionName "1.0"
    setProperty("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

答案 5 :(得分:3)

不重命名,但可能首先正确生成名称会有帮助吗? Change apk name with Gradle

答案 6 :(得分:3)

我基于@Fer回答编写了更多通用解决方案。

它也应该适用于基于flavor和基于构建类型的applicationIdversionNameversionCode配置。

在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变量的详细信息,请参阅ApkVariantBaseVariant接口定义。

答案 7 :(得分:1)

首先将模块从应用重命名为 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"
                }
            }
        }
    }
}

答案 8 :(得分:1)

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

使用 Gradle 4.4 IntelliJ 2017.3.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

希望它对某人有用。

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

答案 9 :(得分:1)

在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)
                }
            }
        }
    }
}

发布版本名称将为您的应用名称2018-03-31 12-34

答案 10 :(得分:1)

在您的应用级别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/03/25可用

答案 11 :(得分:0)

我认为这会有所帮助。

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'
    }
}

答案 12 :(得分:0)

android studio 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"
  }
}

答案 13 :(得分:0)

对于较新的 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

答案 14 :(得分:0)

我意识到很多答案都没有迎合不同的构建类型,这就是我的处理方式。

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