¿Cómo establecer versionName en el nombre del archivo APK usando gradle?

Estoy tratando de establecer un número de versión específico en el nombre de archivo de APK autogenerado de Gradle.

Ahora gradle genera myapp-release.apk pero quiero que se parezca a myapp-release-1.0.apk .

He intentado cambiar el nombre de las 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)

Solo 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 llamados MyCompany-MyAppName-1.4.8-debug.apk o MyCompany-MyAppName-1.4.8-release.apk según la variante de comstackción seleccionada.

Consulte también: Cómo cambiar el nombre del archivo de mapeo proguard en gradle para Android project

Solución para el reciente complemento 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 Android Gradle Plugin:

  • 3.1.0 (marzo de 2018)
  • 3.0.1 (noviembre de 2017)
  • 3.0.0 (octubre de 2017)
  • 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 (10/10/2015)
  • 1.3.1 (08/08/2015)

Actualizaré esta publicación a medida que aparezcan nuevas versiones.

Solución probada solo en las versiones 1.1.3-1.3.0

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

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

archivo app gradle:

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

Esto resolvió mi problema: usar 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:

Así que parece que esto no funciona con las versiones 0.14+ de Android Studio Gradle.

Este es 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")) } } } 

(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 con la esperanza de que sea útil para cualquier otra persona. Cambia el nombre de la aplicación con la siguiente información:

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

Me llevó un poco de investigación en clases de gradle y un poco de copiar / pegar de otras respuestas. Estoy usando gradle 3.1.3 .

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

Si comstack hoy (13-10-2016) a las 10:47, obtendrá los siguientes nombres de archivo según el tipo de comstackción y sabor que haya elegido:

  • depuración dev : myProject_ dev_debug_1.3.6 _131016_1047.apk
  • versión dev : myProject_ dev_release_1.3.6 _131016_1047.apk
  • prod debug : myProject_ prod_debug_1.2.0 _131016_1047.apk
  • Lanzamiento del producto : 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.versionName , defaultConfig.versionName dará como resultado null

para obtener el nombre de la versión del 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) 

En resumen, para aquellos que no saben cómo importar paquetes en build.gradle (como yo), use 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")) } } } 

===== EDITAR =====

Si configura su versionCode y versionName en su archivo build.gradle como este:

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

Debes configurarlo así:

 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. 

Deberías cambiar la build.Types Los build.Types parte de 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")) } } } } 

En mi caso, solo quería encontrar una forma de automatizar la generación de diferentes nombres apk para release de release y debug . Me las arreglé para hacer esto fácilmente al poner este fragmento como un hijo 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) } } 

Para el nuevo Android gradle plugin 3.0.0 puedes hacer algo como eso:

  applicationVariants.all { variant -> variant.outputs.all { 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" } outputFileName = newName } } 

Esto produce algo como: My_nice_name_3.2.31_dbg.apk

Otra alternativa es usar 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 configurará “appname-1.0.0” para todas sus salidas de apk.

Gradle 4

La syntax ha cambiado un poco en Gradle 4 (Android Studio 3+) (desde output.outputFile a output.outputFile , la idea de esta respuesta es ahora:

 android { applicationVariants.all { variant -> variant.outputs.each { output -> def newName = outputFileName newName.replace(".apk", "-${variant.versionName}.apk") outputFileName = new File(newName) } } } 

Hay muchas respuestas correctas, ya sea completas o después de algunas modificaciones. Pero voy a agregar el mío de todos modos ya que estaba teniendo el problema con todos ellos porque estaba usando scripts para generar VersionName y VersionCode de forma dinámica enganchando en la tarea preBuild .

Si está utilizando un 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: dado que estoy anulando el código y el nombre de la versión en la primera acción de preBuild , tengo que agregar el cambio de nombre del archivo al final de esta tarea. Entonces, ¿qué hará Gradle en este caso?

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

En mi caso, resuelvo este error de esta manera

agregando un SUFIJO a la versión de depuración, en este caso agrego el texto “-DEBUG” a mi despliegue de depuración

  buildTypes { release { signingConfig signingConfigs.release minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } debug { defaultConfig { debuggable true versionNameSuffix "-DEBUG" } } } 
  applicationVariants.all { variant -> variant.outputs.all { output -> output.outputFileName = output.outputFileName.replace(".apk", "-${variant.versionName}.apk") } } 

Para las últimas versiones de gradle, puede usar el siguiente fragmento:

Establezca 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 comstackción. pero como tengo el único, funciona perfectamente para mí.

A partir de Android Studio 1.1.0, encontré que esta combinación funcionaba en el cuerpo 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 solo juegue con los valores hasta que obtenga el nombre de salida deseado:

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

La forma correcta de cambiar el nombre de apk, según @Jon respuesta

 defaultConfig { applicationId "com.irisvision.patientapp" minSdkVersion 24 targetSdkVersion 22 versionCode 2 // increment with every release versionName "0.2" // change with every release testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" //add this line archivesBaseName = "AppName-${versionName}-${new Date().format('yyMMdd')}" } 

O de otra forma puedes lograr los mismos resultados con

 android { ... compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } applicationVariants.all { variant -> variant.outputs.all { output -> def formattedDate = new Date().format('yyMMdd') outputFileName = "${outputFileName.replace(".apk","")}-v${defaultConfig.versionCode}-${formattedDate}.apk" } } }