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

" app-release.apk" how to change this default generated apk name

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

我们可以做一些设置,让它应该提示并询问我需要分配给 apk 的名称(在 eclipse 中的做法)

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

注意::

在生成 apk 时 android studio 提示我 select 位置(仅)

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

是的,我们可以改变它,但需要多加注意

现在将此添加到项目的 build.gradle 中,同时确保已检查项目的 build variant喜欢 release or Debug 所以在这里我将构建变体设置为 release 但您也可以将 select 设置为 Debug。

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

You may Do it With different Approach Like this

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

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

A New approach to handle this added recently by google update You may now rename your build according to flavor or Variant output //Below source is from developer android documentation For more details follow the above documentation link
Using the Variant API to manipulate variant outputs is broken with the new plugin. It still works for simple tasks, such as changing the APK name during build time, as shown below:

// 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"
    }
}

Renaming .aab bundle This is nicely

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
}

Is there need of above code

我在最新版本的android studio 3.3.1

中观察到的

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

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

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

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

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

它还应该与 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 变量的更多信息,请参阅 ApkVariant and BaseVariant 接口定义。

我认为这会有所帮助。

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

使用最新的 android gradle 插件 (3.0) 可能会出现错误:

Cannot set the value of read-only property 'outputFile'

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

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

注2这里的主要变化:

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

这是一个更短的方法:

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

首先将您的模块从 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"
                }
            }
        }
    }
}

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

测试并适用于 IntelliJ 2017.3.2Gradle 4.4

场景:

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

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

{app-root}/app/build.gradle

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

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

希望对大家有用。

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

在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

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

android 工作室 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"
  }
}

较新的 android 工作室 Gradle

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

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

我意识到很多答案并不适合不同的 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

对于 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 like

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

对于 cFlavor

与上面类似的名称只需将前缀aFlavor更改为cFlavor 并且,versionCodeversionName

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

有关详细信息,请查看此 线程

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

 android {

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

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

android {
    compileSdk 31
    project.archivesBaseName = "Scanner"

    defaultConfig {

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