Cómo establecer el nombre de la salida AAR de Gradle

4 minutos de lectura

avatar de usuario
Afian

Tengo un proyecto con varios módulos, uno de los cuales es una biblioteca de Android llamada (mal) como sdk. Cuando construyo el proyecto, genera un AAR llamado sdk.aar.

No he podido encontrar nada en la documentación de Android o Gradle que me permita cambiar el nombre de la salida AAR. Me gustaría que tuviera un nombre base + número de versión como lo tienen las tareas Jar, pero no puedo averiguar cómo hacer lo mismo para el AAR porque toda la configuración parece estar oculta en el complemento android.library.

Cambiar el nombre del módulo no es una opción en esta etapa y eso aún no agregaría el número de versión al AAR final.

¿Cómo puedo cambiar el nombre del AAR generado por com.android.library en Gradle?

solución Gradle

defaultConfig {
    minSdkVersion 9
    targetSdkVersion 19
    versionCode 4
    versionName '1.3'
    testFunctionalTest true
    project.archivesBaseName = "Project name"
    project.version = android.defaultConfig.versionName
}

avatar de usuario
qix

Como se menciona en los comentarios a continuación y otra respuesta, la respuesta original aquí no funciona con Gradle 3+. por el documentosalgo como lo siguiente debería funcionar:

El uso de la API de variantes para manipular las salidas de variantes se interrumpe con el nuevo complemento. Todavía funciona para tareas simples, como cambiar el nombre de 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"
    }
}

RESPUESTA ANTIGUA:

No puedo hacer que archivesBaseName & version funcione para mí con Estudio Android 0.8.13 / Gradle 2.1. Si bien puedo configurar archivesBaseName y la versión en mi configuración predeterminada, no parece afectar el nombre de salida. Al final, agregando lo siguiente libraryVariants block to my android {} scope finalmente funcionó para mí:

libraryVariants.all { variant ->
    variant.outputs.each { output ->
        def outputFile = output.outputFile
        if (outputFile != null && outputFile.name.endsWith('.aar')) {
            def fileName = "${archivesBaseName}-${version}.aar"
            output.outputFile = new File(outputFile.parent, fileName)
        }
    }
}

  • No funciona para mí, porque dice que no existe una propiedad como libraryVariants

    – Helmisek

    08/09/2016 a las 20:52

  • @Helmisek prueba con android.libraryVariants en cambio

    – Jorge Arimany

    14 de junio de 2017 a las 12:02

  • Ya no es válido con Gradle 4.1: desarrollador.android.com/studio/build/…

    – Keab42

    2 de noviembre de 2017 a las 14:22

avatar de usuario
devz

Para Estudio Android 3 con Gradle 4 y el complemento de Android para Gradle 3.0.0, debe cambiar la respuesta de qix a la siguiente:

android {
...    

    libraryVariants.all { variant ->
        variant.outputs.all { output ->
            if (outputFile != null && outputFileName.endsWith('.aar')) {
                outputFileName = "${archivesBaseName}-${version}.aar"
            }
        }
    }
}

  • ¿Dónde ponemos esto?

    – WKS

    29 de enero de 2018 a las 11:15

  • En tu app/build.gradle dentro de Android {}. O puede ponerlo al final en su aplicación/build.gradle, pero luego debe llamarlo android.libraryVariants.all {}

    – devz

    29 de enero de 2018 a las 11:26

  • Funciona bien con Android Studio 3.1, Gradle 4.4, Gradle plugin 3.1.0

    – norbDEV

    29 de marzo de 2018 a las 8:22

En mi caso, ${version} da como resultado “sin especificar”, finalmente encontré que ${defaultConfig.versionName} funciona.

android {
    ...
    libraryVariants.all { variant ->
        variant.outputs.all {
            outputFileName = "${variant.name}-${defaultConfig.versionName}.aar"
        }
    }
}

  • el archivo de salida es “release-1.0.0.aar”

    – John Chen

    30 de agosto de 2020 a las 9:17

avatar de usuario
liga

con el complemento de compilación 1.5.0, ahora es posible usar archivesBaseName en la configuración predeterminada

avatar de usuario
Spettacolo83

Para la última versión de Gradle 5+, esta es la mejor respuesta después de la respuesta de @frouo:

defaultConfig {
    ...
    versionName "some-version-name-or-number"
    setProperty("archivesBaseName", "${archivesBaseName}-$versionName")
    ...
}

La extensión AAR se agregará automáticamente.

  • agradable. Funciona bien en AS 4.1.2 Gradle 6.8.3

    – hannes ach

    28 de febrero de 2021 a las 6:16

  • Esto no evita que se añada la variante “debug” o “release” (u otra variante).

    – Juan

    2 de septiembre de 2021 a las 14:13

avatar de usuario
Martín Pfeffer

ademas de qix responde aqui la info que puedes agregar varios rutas de salida por este método por una cadena regular también:

libraryVariants.all { variant ->
        variant.outputs.each { output ->
            def outputFile = output.outputFile
            if (outputFile != null && outputFile.name.endsWith('.aar')) {
                def fileName = "${archivesBaseName}-${version}.aar"
                output.outputFile = new File(outputFile.parent, fileName)
                output.outputFile = new File("/home/pepperonas/IdeaProjects/Libraries/Base/testapp/libs", fileName)
            }
        }
    }

(Los votos a favor pertenecen a qix; acabo de escribir esto como respuesta debido a la legibilidad).

  • agradable. Funciona bien en AS 4.1.2 Gradle 6.8.3

    – hannes ach

    28 de febrero de 2021 a las 6:16

  • Esto no evita que se añada la variante “debug” o “release” (u otra variante).

    – Juan

    2 de septiembre de 2021 a las 14:13

avatar de usuario
will.quast

Usando Gradle 6+ y AGP 4+, una respuesta alternativa que permite el control total del nombre es:

afterEvaluate {
    android.libraryVariants.all { variant ->
        variant.variantData.outputFactory.apkDataList.each { apkData ->
            if (apkData.outputFileName.endsWith('.aar')) {
                apkData.outputFileName = "${project.name}-${buildType.name}-anything-you-want.aar"
            }
        }
    }
}

¿Ha sido útil esta solución?