Cambiar el nombre apk con Gradle

Tengo un proyecto de Android que usa Gradle para el proceso de comstackción. Ahora quiero agregar dos etapas de comstackción y producción, así que mi build.gradle contiene:

android { buildTypes { release { runProguard false proguardFile getDefaultProguardFile('proguard-android.txt') } staging { signingConfig signingConfigs.staging applicationVariants.all { variant -> appendVersionNameVersionCode(variant, defaultConfig) } } production { signingConfig signingConfigs.production } } } 

y mi appndVersionNameVersionCode se ve así:

 def appendVersionNameVersionCode(variant, defaultConfig) { if(variant.zipAlign) { def file = variant.outputFile def fileName = file.name.replace(".apk", "-" + defaultConfig.versionName + "-" + defaultConfig.versionCode + ".apk") variant.outputFile = new File(file.parent, fileName) } def file = variant.packageApplication.outputFile def fileName = file.name.replace(".apk", "-" + defaultConfig.versionName + "-" + defaultConfig.versionCode + ".apk") variant.packageApplication.outputFile = new File(file.parent, fileName) } 

Si ejecuto task assembleStaging , obtengo el nombre correcto de mi apk, pero cuando ejecuto assembleProduction , obtengo los nombres cambiados de mi apk (como en el caso de ensayo). Por ejemplo:

 MyApp-defaultFlavor-production-9.9.9-999.apk MyApp-defaultFlavor-production-9.9.9-999.apk 

Parece que en el tipo de comstackción de producción se ejecuta appendVersionNameVersionCode . ¿Cómo puedo evitarlo?

Como CommonsWare escribió en su comentario, debe llamar a appendVersionNameVersionCode solo para variantes de etapas. Puede hacerlo fácilmente, simplemente modifique ligeramente su método appendVersionNameVersionCode , por ejemplo:

 def appendVersionNameVersionCode(variant, defaultConfig) { //check if staging variant if(variant.name == android.buildTypes.staging.name){ if(variant.zipAlign) { def file = variant.outputFile def fileName = file.name.replace(".apk", "-" + defaultConfig.versionName + "-" + defaultConfig.versionCode + ".apk") variant.outputFile = new File(file.parent, fileName) } def file = variant.packageApplication.outputFile def fileName = file.name.replace(".apk", "-" + defaultConfig.versionName + "-" + defaultConfig.versionCode + ".apk") variant.packageApplication.outputFile = new File(file.parent, fileName) } } 

La solución de Lecho no funciona para Android Gradle Plugin 0.14.3+ debido a la eliminación de APIS en desuso: http://tools.android.com/tech-docs/new-build-system

Casi 1.0: eliminado las propiedades / métodos obsoletos

  • Variant.packageApplication / zipAlign / createZipAlignTask / outputFile / processResources / processManifest (use la salida de variante)

Lo siguiente funciona para mí:

 def appendVersionNameVersionCode(variant, defaultConfig) { variant.outputs.each { output -> if (output.zipAlign) { def file = output.outputFile def fileName = file.name.replace(".apk", "-" + defaultConfig.versionName + "-" + defaultConfig.versionCode + ".apk") output.outputFile = new File(file.parent, fileName) } def file = output.packageApplication.outputFile def fileName = file.name.replace(".apk", "-" + defaultConfig.versionName + "-" + defaultConfig.versionCode + ".apk") output.packageApplication.outputFile = new File(file.parent, fileName) } } 

He usado una pequeña versión genérica de ella. construir e instalar bien. por ejemplo, su projectName es “Salad”, luego, para organizar el nombre apk será “Salad-staging-dd-MM-YY”, también puede cambiar para depurar y lanzar apk. Espero que mi solución sea mejor.
Cambio en projectName/app/build.gradle

 buildTypes { debug{ } staging{ debuggable true signingConfig signingConfigs.debug applicationVariants.all { variant -> variant.outputs.each { output -> def date = new Date(); def formattedDate = date.format('dd-MM-yyyy') def appName = getProjectDir().getParentFile().name output.outputFile = new File(output.outputFile.parent, output.outputFile.name.replace(getProjectDir().name +"-staging", "$appName-staging-" + formattedDate) //for Debug use output.outputFile = new File(output.outputFile.parent, // output.outputFile.name.replace("-debug", "-" + formattedDate) ) } } } release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } 

para cambiar el nombre de la aplicación de Android ref

Esto es lo que hice:

  def appName if (project.hasProperty("applicationName")) { appName = applicationName } else { appName = parent.name } applicationVariants.all { variant -> variant.outputs.each { output -> output.outputFile = new File(output.outputFile.parent, output.outputFile.name.replace("app-release.apk", appName + "_V" + versionCode + ".apk")) } }