"App-release.apk" cómo cambiar este nombre de apk generado por defecto

155

Cada vez que genero un apk firmado en Android Studio, de forma predeterminada, se le da el nombre de app-release.apk ...

¿Podemos hacer cualquier configuración para que se solicite y me pregunte el nombre que debe asignarse a la apk (como lo hace en eclipse)

Lo que hago es cambiar el nombre de la apk después de que se generó. Esto no da ningún error, pero ¿hay alguna forma genuina para que pueda hacer cualquier cambio en la configuración para obtener un mensaje?

Nota::

mientras genero apk android studio me da un mensaje para seleccionar la ubicación (solo)ingrese la descripción de la imagen aquí

Prabs
fuente
1.cambie la variante de compilación para liberar 2. seleccione compilar-> generar apk firmado desde la barra de menú De esta manera estoy generando apk firmado
Prabs
Todas las respuestas aquí no son correctas. Este problema aún ocurrirá usando cualquiera de ellos ... ¡El problema es el almacenamiento en caché del nombre del artefacto apk y seguir usando el nombre en caché en lugar de usar el nuevo generado!
TacB0sS

Respuestas:

142

Sí, podemos cambiar eso, pero con un poco más de atención.

Mira esto

Ahora agregue esto en su build.gradle en su proyecto mientras se asegura de haber verificado la variante de compilación de su proyecto, release or Debug así que aquí he configurado mi variante de compilación como releasepero también puede seleccionar 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)
                        )
                    }
                }
            }
        }

Puedes hacerlo con un enfoque diferente como este

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

Usando el método Set property en build.gradle y No olvides sincronizar el gradle antes de ejecutar los proyectos Espero que resuelva tu problema :)

Un nuevo enfoque para manejar esto sumado recientemente por actualización de Google Ahora puede cambiar el nombre de su construcción de acuerdo con el sabor o la salida de variante // A continuación fuente es de desarrollador de documentación androide Para más detalles siguen el anterior enlace de documentación
Uso de la API variante de manipular salidas variante es roto con el nuevo complemento. Todavía funciona para tareas simples, como cambiar el nombre del APK durante el tiempo de compilación, como se muestra a continuación:

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

Cambiar el nombre del paquete .aab Esto es muy bien respondido por 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
}

¿Hay necesidad del código anterior?

Lo que he observado en la última versión de Android Studio 3.3.1

El cambio de nombre del paquete .aab se realiza mediante el código anterior, no requiere ninguna tarea para cambiar el nombre de un todo.

Espero que les ayude, muchachos. :)

Abhishek Chaubey
fuente
así que use la cadena allí en el "Abhishek Chaubey" similar a la fecha formateada
Abhishek Chaubey
¿Es posible agregar de versionNamealguna manera?
zygimantus
@AbhishekChaubey Ya no puedo ejecutar el código a través de Android Studio después de cambiar el nombre del apk, ¿alguna idea? por favor ayuda ... se notaThe APK file /Users/.../outputs/apk/NewName-debug-20161004172815.apk does not exist on disk.
Beeing Jk
@BeeingJk reconstruye el proyecto o una vez que cierra el estudio de Android y elimina la carpeta de salida del directorio de compilación y luego reconstruye el proyecto o lo intentas limpiando. Espero que pueda ayudarte
Abhishek Chaubey
44
A partir de Android Studio 3.0 output.outputFile es de solo lectura. La respuesta de @ johnny-doe es la nueva solución.
Krishh
79

Es posible que obtenga el error con el último complemento de Android Gradle ( 3.0 ):

No se puede establecer el valor de la propiedad de solo lectura 'outputFile'

De acuerdo con la guía de migración , debemos usar el siguiente enfoque ahora:

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

Nota 2 cambios principales aquí:

  1. allahora se usa en lugar de eachiterar sobre las salidas variantes.
  2. outputFileName Se utiliza la propiedad en lugar de mutar una referencia de archivo.
Johnny Doe
fuente
1
Ahora esta es la respuesta correcta de octubre de 2017 para Android Studio 3.0 Beta 7. Gracias.
krishh
3
En mi caso ${applicationName}resolvió BuildType_Decorated{name=applicationName, debuggable=false, testCoverageEnabled=false, jniDebuggable=false, pseudoLocalesEnabled=false, renderscript...(acortado para mayor claridad). Esto hizo que el empaque fallara. Para mi ${applicationId}o ${archivesBaseName}eran mejores opciones. También ${defaultConfig.versionName}para mí es nulo. Entonces ${applicationId}_${variant.name}-${variant.versionName}es con lo que terminé.
pcdev
1
@KGCybeX Por lo general, este código se usa en la android{}sección en el mismo nivel que defaultConfig{}. Sin embargo, puede usarlo sin android{}usar la android.applicationVariants.all { }sintaxis
Johnny Doe
1
Eres un salvavidas;)
Rik van Velzen
1
Trabajo en Gradle 5.1.1
Williaan Lopes
53

Modifiqué la respuesta de @Abhishek Chaubey para cambiar el nombre completo del archivo:

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

Esto produce un nombre de archivo como: MyAppName-release20150519121617.apk

ranma2913
fuente
3
¿Cómo se agrega una variable en Gradle
Mehdiway
1
Para agregar una propiedad personalizada 'appName', agregue código como este a su proyecto raíz: project.ext { appName = 'MyApplicatioName' }
miha
2
@ ranma2913 Ya no puedo ejecutar el código a través de Android Studio después de cambiar el nombre del apk, ¿alguna idea? por favor ayuda ... muestra que el archivo APK /Users/.../outputs/apk/NewName-debug-20161004172815.apk no existe en el disco.
Beeing Jk
1
En lugar de configurar manualmente MyAppName, rootProject.namele dará el nombre del proyecto como en eclipse.
Hiren Dabhi
3
A partir de Android Studio 3.0 output.outputFilees de solo lectura. La respuesta de @ johnny-doe es la nueva solución.
Krishh
50

(EDITADO para trabajar con Android Studio 3.0 y Gradle 4)

Estaba buscando una opción de cambio de nombre de archivo apk más compleja y escribí esta solución que cambia el nombre del apk con los siguientes datos:

  • sabor
  • tipo de construcción
  • versión
  • fecha

Obtendría un apk como este: myProject_dev_debug_1.3.6_131016_1047.apk .

Puedes encontrar la respuesta completa aquí . ¡Espero eso ayude!

En el 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
fuente
2
Excelente. La única mejora que se debe hacer es un nombre de archivo constante (sin versión o fecha) para algunos sabores o buildType (flavour == "dev" || buildType = "debug")
Tony BenBrahim
el "todos" en lugar de "cada" parece importante aquí.
Xan-Kun Clark-Davis
Da error > groovy.lang.MissingPropertyException: No such property: variantConfiguration for class: com.android.build.gradle.internal.variant.ApplicationVariantData. ¿Por qué no simplemente cambiar a buildType = variant.buildType.name?
soshial
dice"file.apk" is not writeable
Hosein Haqiqian
38

Aquí hay una forma mucho más corta:

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

Te da el nombre com.blahblah.example-v1 (1.0) -debug.apk (en modo de depuración)

Android Studio agrega versionNameSuffix por nombre de tipo de compilación de forma predeterminada, si desea anular esto, haga lo siguiente:

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

Salida en modo de depuración: com.blahblah.example-v1 (1.0) -MyNiceDebugModeName.apk

Anrimiano
fuente
3
Gracias. ¡Esta es la opción más rápida!
John
1
Nota al margen: puede agregar archiveBaseName a su archivo local gradle.properties.
Ge3ng
Realmente parece más claro. ¿Por qué esta no es la solución preferida?
Xan-Kun Clark-Davis
6

Escribí una solución más universal basada en @Fer respuesta.

También debe trabajar con sabor y tipo de generación de configuración basada applicationId, versionName, versionCode.

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

Nombre de apk de ejemplo: com.example.app_freeDebug_1.0_1.apk

Para obtener más información sobre las variantvariables, consulte la definición de las interfaces ApkVariant y BaseVariant .

KursoR
fuente
4

agregar android.applicationVariants.allbloque como a continuación en su nivel de aplicación 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'
        }
    }

disponible el 25/03/2019

Loyea
fuente
2

Primero cambie el nombre de su módulo de la aplicación a ie SurveyApp

En segundo lugar, agregue esto a su proyecto de nivel superior (proyecto raíz) gradle. Está trabajando con 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"
                }
            }
        }
    }
}
Qamar
fuente
2

Agregue el siguiente código en build.gradle (Módulo: aplicación)

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

Y el nombre de compilación de la versión será Su nombre de aplicación 2018-03-31 12-34

Vinil Chandran
fuente
1

Mi solución también puede ser de ayuda para alguien.

Probado y funciona en IntelliJ 2017.3.2 con Gradle 4.4

Guión:

Tengo 2 sabores en mi aplicación, por lo que quería que cada versión se nombrara adecuadamente de acuerdo con cada sabor.

El código siguiente se colocará en el archivo de compilación de gradle de su módulo que se encuentra en:

{app-root}/app/build.gradle

Código de Gradle que se agregará al android{ }bloque:

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

Lo anterior proporciona los siguientes APK encontrados en {app-root}/app/:

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

Espero que pueda ser de utilidad para alguien.

Para obtener más información, vea otras respuestas mencionadas en la pregunta

CybeX
fuente
0

Creo que esto será útil.

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