proyecto - como cambiar el nivel de api android studio
¿Cómo establecer versionName en el nombre del archivo APK usando gradle? (13)
Gradle 4
La sintaxis 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)
}
}
}
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)
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"))
}
}
}
}
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"
}
}
}
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
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"))
}
}
}
}
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 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 según el tipo de compilació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.
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 question ):
android {
applicationVariants.all { variant ->
variant.outputs.each { output ->
output.outputFile = new File(
output.outputFile.parent,
output.outputFile.name.replace(".apk", "-${variant.versionName}.apk"))
}
}
}
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
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.
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 compilación. pero como tengo el único, funciona perfectamente para mí.
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)
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 compilació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 programado 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"
}
}
applicationVariants.all { variant ->
variant.outputs.all { output ->
output.outputFileName = output.outputFileName.replace(".apk", "-${variant.versionName}.apk")
}
}