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


155

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

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

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

注意::

生成APK Android Studio时提示我选择位置(仅)在此处输入图片说明


1.更改构建变量以发布2.从菜单栏中选择“构建”->“生成签名的apk”。通过这种方式,我生成了签名的apk
Prabs

这里所有的答案都是不正确的。使用这些方法中的任何一个,仍然会发生此问题。
TacB0sS

Answers:


142

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

看到这个

现在,将其添加到项目的build.gradle中,同时确保已检查了项目的build变体release or Debug 因此在这里我将build变体设置为,release但是您也可以选择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)
                        )
                    }
                }
            }
        }

你可以这样用不同的方法

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

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

google update最近添加的一种新方法来处理此问题。 您现在可以根据风味或Variant输出来重命名构建 // //来源来自开发人员android文档 有关更多详细信息,请按照上述文档链接
使用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包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捆绑包的重命名是由之前的代码完成的,不需要任何任务即可全部重命名。

希望对您有帮助。:)


所以使用字符串出现在像“阿希克·肖贝” instaed formattedDate的
阿希克·肖贝

是否可以添加versionName某种方式?
zygimantus

@AbhishekChaubey更改apk名称后,我无法再通过Android Studio运行代码,知道吗?请帮助...它显示The APK file /Users/.../outputs/apk/NewName-debug-20161004172815.apk does not exist on disk.
Beeing Jk

@BeeingJk重建项目,或者一旦关闭android studio并从构建目录中删除输出文件夹,然后重建项目或通过清理。尝试它可能会帮助您
Abhishek Chaubey 16/10/5

4
从Android Studio 3.0开始,output.outputFile为只读。@ johnny-doe的答案是新的解决方案。
克里希

79

您可能会使用最新的android gradle插件(3.0)收到错误消息:

无法设置只读属性'outputFile'的值

根据迁移指南,我们现在应该使用以下方法:

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

注意2主要更改:

  1. all现在使用而不是each迭代变体输出。
  2. outputFileName 属性用于代替对文件引用进行变异。

1
现在,这是2017年10月针对Android Studio 3.0 Beta 7的正确答案。谢谢。
克里希

3
就我而言,${applicationName}解决为BuildType_Decorated{name=applicationName, debuggable=false, testCoverageEnabled=false, jniDebuggable=false, pseudoLocalesEnabled=false, renderscript...(为清楚起见,缩短了)。这导致包装失败。对我来说${applicationId}还是${archivesBaseName}更好的选择。还${defaultConfig.versionName}对我来说是零。那么${applicationId}_${variant.name}-${variant.versionName}是什么我结束了。
pcdev

1
@KGCybeX通常,此代码android{}在和级别相同的部分中使用defaultConfig{}。虽然,您可以在android{}使用android.applicationVariants.all { }语法之外使用它
Johnny Doe

1
您是救生员;)
Rik van Velzen

1
在Gradle 5.1.1中工作
Williaan Lopes

53

我修改了@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
如何在摇篮中加一个变量
Mehdiway

1
为了添加自定义的'appName'属性,请向您的根项目中添加以下代码: project.ext { appName = 'MyApplicatioName' }
miha

2
@ ranma2913更改apk名称后,我无法再通过Android Studio运行代码,知道吗?请帮助...它显示APK文件/Users/.../outputs/apk/NewName-debug-20161004172815.apk在磁盘上不存在。
Beeing Jk

1
与其手动设置MyAppName,rootProject.name不如使用eclipse中的项目名称。
希伦·达比

3
从Android Studio 3.0开始output.outputFile为只读。@ johnny-doe的答案是新的解决方案。
克里希

50

(已编辑,可与Android Studio 3.0和Gradle 4一起使用)

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

  • 味道
  • 构建类型
  • 日期

您将获得这样的apk:myProject_dev_debug_1.3.6_131016_1047.apk

您可以在此处找到整个答案。希望能帮助到你!

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

2
大。唯一需要改进的地方是某些样式或buildType(flavor ==“ dev” || buildType =“ debug”)的常量文件名(无版本或日期)
Tony BenBrahim

在这里,“全部”而不是“每个”似乎很重要。
Xan-Kun Clark-Davis

给出错误> groovy.lang.MissingPropertyException: No such property: variantConfiguration for class: com.android.build.gradle.internal.variant.ApplicationVariantData。为什么不简单地更改为buildType = variant.buildType.name
soshial

它说"file.apk" is not writeable
Hosein Haqiqian

38

这是一个简短得多的方法:

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


3
谢谢。这是最快的选择!
约翰

1
旁注,您可以将archiveBaseName添加到本地gradle.properties文件。
Ge3ng

看起来确实更清楚。为什么这不是首选的解决方案?
Xan-Kun Clark-Davis

6

我基于@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变量的更多信息,请参见ApkVariantBaseVariant接口定义。


4

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

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可用



2

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

2

在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


1

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

使用Gradle 4.4IntelliJ 2017.3.2上测试并工作

场景:

我的应用程序中有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
        }
    }
}

上面提供了以下可找到的APK {app-root}/app/

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

希望它对某人有用。

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


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'
    }
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.