Cómo establecer versionName en APK filename usando gradle?

Estoy tratando de establecer un número de versión específica en el gradle auto-generado APK nombre de archivo.

Ahora gradle genera myapp-release.apk pero quiero que parezca algo como myapp-release-1.0.apk .

He intentado renombrar opciones que parecen desordenadas. ¿Hay una manera simple de hacer esto?

 buildTypes { release { signingConfig signingConfigs.release applicationVariants.each { variant -> def file = variant.outputFile variant.outputFile = new File(file.parent, file.name.replace(".apk", "-" + defaultConfig.versionName + ".apk")) } } 

He intentado el código anterior sin suerte. ¿Alguna sugerencia? (Usando gradle 1.6)

Esto solucionó mi problema: using applicationVariants.all lugar de applicationVariants.each

 buildTypes { release { signingConfig signingConfigs.release applicationVariants.all { variant -> def file = variant.outputFile variant.outputFile = new File(file.parent, file.name.replace(".apk", "-" + defaultConfig.versionName + ".apk")) } } } 

Actualizar:

Por lo que parece que esto no funciona con las versiones de 0.14 + de plugin androide gradle estudio.

Esto hace el truco (Referencia de esta pregunta ):

 android { applicationVariants.all { variant -> variant.outputs.each { output -> output.outputFile = new File( output.outputFile.parent, output.outputFile.name.replace(".apk", "-${variant.versionName}.apk")) } } } 

Sólo tengo que cambiar el nombre de la versión en un solo lugar. El código es simple también.

Los siguientes ejemplos crearán archivos apk denominados MyCompany-MyAppName-1.4.8-debug.apk o MyCompany-MyAppName-1.4.8-release.apk dependiendo de la variante de construcción seleccionada.

Vea también: Cómo cambiar el nombre del archivo de mapeado proguard en gradle para el proyecto de Android

Solución para el complemento reciente de Gradle

 android { compileSdkVersion 22 buildToolsVersion "22.0.1" defaultConfig { applicationId "com.company.app" minSdkVersion 13 targetSdkVersion 21 versionCode 14 // increment with every release versionName '1.4.8' // change with every release setProperty("archivesBaseName", "MyCompany-MyAppName-$versionName") } } 

La solución anterior se ha probado con las siguientes versiones de complementos de Android Gradle:

  • 2.3.2 (mayo de 2017)
  • 2.3.1 (abril de 2017)
  • 2.3.0 (febrero de 2017)
  • 2.2.3 (diciembre de 2016)
  • 2.2.2
  • 2.2.0 (septiembre de 2016)
  • 2.1.3 (agosto de 2016)
  • 2.1.2
  • 2.0.0 (abril de 2016)
  • 1.5.0 (2015/11/12)
  • 1.4.0-beta6 (2015/10/05)
  • 1.3.1 (2015/08/11)

Actualizaré este post cuando salgan nuevas versiones.

Solución probada Sólo en las versiones 1.1.3-1.3.0

La siguiente solución ha sido probada con las siguientes versiones de complementos de Android Gradle:

  • 1.3.0 (2015/07/30) – No funciona, error programado para ser corregido en 1.3.1
  • 1.2.3 (2015/07/21)
  • 1.2.2 (2015/04/28)
  • 1.2.1 (2015/04/27)
  • 1.2.0 (2015/04/26)
  • 1.2.0-beta1 (2015/03/25)
  • 1.1.3 (2015/03/06)

Archivo gradle de la aplicación:

 apply plugin: 'com.android.application' android { compileSdkVersion 21 buildToolsVersion "21.1.2" defaultConfig { applicationId "com.company.app" minSdkVersion 13 targetSdkVersion 21 versionCode 14 // increment with every release versionName '1.4.8' // change with every release archivesBaseName = "MyCompany-MyAppName-$versionName" } } 

Buscaba una opción más compleja del renombrado del nombre de archivo de apk y escribí éste en la esperanza que es provechoso para cualquier persona. Cambia el nombre del apk con los siguientes datos:

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

Me tomó un poco de investigación en las clases de gradle y un poco de copiar / pegar de otras respuestas. Estoy usando gradle 2.1.3 (no probado en otras versiones).

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.each { 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" output.outputFile = new File(output.outputFile.parent, newApkName) } } } 

Si compila hoy (13-10-2016) a las 10:47, obtendrá los siguientes nombres de archivo dependiendo del tipo de sabor y construcción que haya elegido:

  • Dev debug : myProject_ dev_debug_1.3.6 _131016_1047.apk
  • Dev release : myProject_ dev_release_1.3.6 _131016_1047.apk
  • Prod depuración : myProject_ prod_debug_1.2.0 _131016_1047.apk
  • Lanzamiento de prod : myProject_ prod_release_1.2.0 _131016_1047.apk

Nota: el nombre apk de la versión no alineada sigue siendo el predeterminado.

Si no especifica versionName en el bloque defaultConfig, entonces defaultConfig.versionName resultará en null

Para obtener versionName de manifiesto, puede escribir el siguiente código en build.gradle:

 import com.android.builder.DefaultManifestParser def manifestParser = new DefaultManifestParser() println manifestParser.getVersionName(android.sourceSets.main.manifest.srcFile) 

Para resumir, para los que no saben cómo importar el paquete en build.gradle (como yo), utilice los siguientes buildTypes ,

 buildTypes { release { signingConfig signingConfigs.release applicationVariants.all { variant -> def file = variant.outputFile def manifestParser = new com.android.builder.core.DefaultManifestParser() variant.outputFile = new File(file.parent, file.name.replace(".apk", "-" + manifestParser.getVersionName(android.sourceSets.main.manifest.srcFile) + ".apk")) } } } 

===== EDIT =====

Si establece su versionCode y versionName en su archivo build.gradle así:

 defaultConfig { minSdkVersion 15 targetSdkVersion 19 versionCode 1 versionName "1.0.0" } 

Debe establecerlo de esta manera:

 buildTypes { release { signingConfig signingConfigs.releaseConfig applicationVariants.all { variant -> def file = variant.outputFile variant.outputFile = new File(file.parent, file.name.replace(".apk", "-" + defaultConfig.versionName + ".apk")) } } } 

====== EDIT con Android Studio 1.0 ======

Si está utilizando Android Studio 1.0, obtendrá un error como este:

 Error:(78, 0) Could not find property 'outputFile' on com.android.build.gradle.internal.api.ApplicationVariantImpl_Decorated@67e7625f. 

Debe cambiar la parte build.Types a esto:

 buildTypes { release { signingConfig signingConfigs.releaseConfig applicationVariants.all { variant -> variant.outputs.each { output -> output.outputFile = new File(output.outputFile.parent, output.outputFile.name.replace(".apk", "-" + defaultConfig.versionName + ".apk")) } } } } 

Otra alternativa es utilizar lo siguiente:

 String APK_NAME = "appname" int VERSION_CODE = 1 String VERSION_NAME = "1.0.0" project.archivesBaseName = APK_NAME + "-" + VERSION_NAME; android { compileSdkVersion 21 buildToolsVersion "21.1.1" defaultConfig { applicationId "com.myapp" minSdkVersion 15 targetSdkVersion 21 versionCode VERSION_CODE versionName VERSION_NAME } .... // Rest of your config } 

Esto establecerá "appname-1.0.0" en todas sus salidas de apk.

Hay muchas respuestas que son correctas ya sea en su totalidad o después de algunas modificaciones. Pero voy a añadir el mío de todos modos ya que estaba teniendo el problema con todos ellos porque estaba utilizando scripts para generar VersionName y VersionCode dinámicamente enganchar en la tarea preBuild .

Si está utilizando algún enfoque similar, este es el código que funcionará:

 project.android.applicationVariants.all { variant -> variant.preBuild.doLast { variant.outputs.each { output -> output.outputFile = new File( output.outputFile.parent, output.outputFile.name.replace(".apk", "-${variant.versionName}@${variant.versionCode}.apk")) } } } 

Para explicar: Ya que estoy reemplazando el código de versión y el nombre en la primera acción de preBuild tengo que agregar el archivo de cambio de nombre al final de esta tarea. Entonces, qué grado hará en este caso es:

Inyectar código / nombre de versión-> hacer acciones preBuild -> reemplazar nombre para apk

En mi caso resuelvo este error de esta manera

Agregando un SUFFIX a la versión de depuración, en este caso añadiendo el texto "-DEBUG" a mi Debug implementar

  buildTypes { release { signingConfig signingConfigs.release minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } debug { defaultConfig { debuggable true versionNameSuffix "-DEBUG" } } } 

Para las versiones de gradles más recientes, puede utilizar el siguiente fragmento:

Configure primero la ubicación del manifiesto de la aplicación

  sourceSets { main { manifest.srcFile 'src/main/AndroidManifest.xml' { } 

Y más adelante en build.gradle

 import com.android.builder.core.DefaultManifestParser def getVersionName(manifestFile) { def manifestParser = new DefaultManifestParser(); return manifestParser.getVersionName(manifestFile); } def manifestFile = file(android.sourceSets.main.manifest.srcFile); def version = getVersionName(manifestFile) buildTypes { release { signingConfig signingConfigs.release applicationVariants.each { variant -> def file = variant.outputFile variant.outputFile = new File(file.parent, file.name.replace(".apk", "-" + versionName + ".apk")) } } 

Ajuste si tiene diferentes manifiestos por tipo de construcción. Pero ya que tengo el único – funciona perfectamente para mí.

A partir de Android Studio 1.1.0, encontré esta combinación funcionó en el cuerpo de android del archivo build.gradle . Esto es si no puede averiguar cómo importar los datos del archivo xml de manifiesto. Ojalá fuera más compatible con Android Studio, pero sólo jugar con los valores hasta que obtenga el nombre deseado apk salida:

 defaultConfig { applicationId "com.package.name" minSdkVersion 14 targetSdkVersion 21 versionCode 6 versionName "2" } signingConfigs { release { keyAlias = "your key name" } } buildTypes { release { minifyEnabled true proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' signingConfig signingConfigs.release applicationVariants.all { variant -> variant.outputs.each { output -> output.outputFile = new File(output.outputFile.parent, output.outputFile.name.replace("app-release.apk", "appName_" + versionName + ".apk")) } } } } 

En mi caso, sólo quería encontrar una forma de automatizar la generación de diferentes nombres de apk para las variantes de release y debug . Me las arreglé para hacerlo fácilmente poniendo este fragmento como un niño de android :

 applicationVariants.all { variant -> variant.outputs.each { output -> def appName = "My_nice_name_" def buildType = variant.variantData.variantConfiguration.buildType.name def newName if (buildType == 'debug'){ newName = "${appName}${defaultConfig.versionName}_dbg.apk" } else { newName = "${appName}${defaultConfig.versionName}_prd.apk" } output.outputFile = new File(output.outputFile.parent, newName) } } 

Esto produce algo así como: My_nice_name_3.2.31_dbg.apk

  • Android gradle build y la biblioteca de soporte
  • No se pudo actualizar el proyecto Gradle (AS 0.8.2, Mac)
  • Telegram API release.keystore ERROR
  • "Gradle Version 2.10 es necesario." Error
  • Android Gradle produce una excepción TransformException: java.util.zip.ZipException: error en abrir archivo zip durante transformClassesWithDexForRelease
  • Cobertura del código Gradle de Android
  • Error de instalación de Android Studio APK: "ruta de acceso local no existe"
  • Problemas al intentar crear gradle build
  • Android Studio 0.8.6 cambiar la variante de construcción predeterminada
  • Gradle se cuelga en tareas de ejecución: [: android: generateDebugSources
  • Android Gradle build resultante apk contiene clases ofuscadas y no ofuscadas
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.