Cómo definir propiedades comunes de Android para todos los módulos usando gradle

5 minutos de lectura

avatar de usuario
CalienteHieloCrema

Creo un proyecto simple en AndroidStudio con algunos módulos. El script gradle de cada módulo contiene el siguiente código:

android {
    compileSdkVersion 18
    buildToolsVersion "18.1.1"

    defaultConfig {
        minSdkVersion 7
        targetSdkVersion 18
    }
}

¿Cómo puedo mover este código al script principal build.gradle (script del proyecto)? Este código es común para todos los submódulos.

  • ¿Has mirado usando el ext { } block en su archivo gradle de nivel superior?

    – Igor Ganapolski

    21/10/2016 a las 20:20

avatar de usuario
Javier Ducrohet

Podrías crear un build.gradle en la raíz de su proyecto (es decir, la carpeta que contiene todos sus módulos), y utilícelo para configurar su rootProject.

Por ejemplo, si tienes:

MyApp
  - Module1/
      - build.gradle
  - Module2/
      - build.gradle
  - settings.gradle

Puede agregar un build.gradle junto a settings.gradle.

En el ejemplo anterior, en realidad tienes 3 proyectos Gradle: Módulo 1, Módulo2 y el rootProject.

Así que dentro de esto build.gradlePodrías hacerlo:

// use the ext object to add any properties to the project
project.ext {
   compileSdkVersion = 18
}

Luego, en sus módulos, puede hacer:

android {
    // here we reference the root project with the "rootProject" object.
    compileSdkVersion rootProject.ext.compileSdkVersion
}

  • esto no funciona con gradle plugin 0.12.2 y gradle 1.1 Could not find method compileSdkVersion() for arguments [20] on root project 'android'.

    – romano

    15 de octubre de 2014 a las 8:52


  • Cambio compileSdkVersion 18 a compileSdkVersion = 18

    – Vendedor de veneno

    22/10/2014 a las 22:29

Definir esto en el build.gradle más alto parece funcionar

subprojects {
    afterEvaluate {project ->
        if (project.hasProperty("android")) {
            android {
                compileSdkVersion 22
                buildToolsVersion '22.0.1'
            }
        }
    }
}

  • Usé este práctico enfoque junto con esto: stackoverflow.com/questions/20827885/…

    – Informal

    25 de junio de 2015 a las 0:06

  • Por lo demás, esto funciona bien, pero de esta manera ningún subproyecto puede anular el valor predeterminado. Debe verificar la existencia de compileSdkVersion y buildToolsVersion antes de establecer los valores.

    – Kung Fu

    30 de marzo de 2016 a las 12:05

  • funciona bien, esta configuración anulará todos los subproyectos.

    – androidmalin

    10 de abril de 2018 a las 9:11

  • ¡Excelente! Lo usé para parchear solo un valor en un submódulo de git: project(':submoduleName') { afterEvaluate { project -> android { defaultConfig { minSdkVersion 19 }}}}

    – Giszmo

    16 de septiembre de 2020 a las 15:52

Esto me funciona en Android Studio 0.8.9. utilizando el envoltorio gradle predeterminado 1.12-all.

La aplicación es una biblioteca utilizada por Lite y Pro, donde Lite/Pro son dos sabores diferentes de la aplicación que estoy creando. Quería compartir la configuración entre todos los módulos. La configuración global se encuentra en el archivo raíz gradle.build y todos los subproyectos/módulos pueden leer estas propiedades.

La estructura de mi proyecto es:

Project/
 gradle.build
 settings.gradle
 App/
  gradle.build
 Lite/
  gradle.build
 Pro/
  gradle.build

En Project/gradle.build, agregué una configuración de subproyectos:

subprojects {
    ext.global_compileSdkVersion = 19
    ext.global_buildToolsVersion = "20.0.0"
    ...
}

ext.[var name] añade variables que se pueden leer en los subproyectos. Agregué el prefijo “global_” para que sea más fácil ver mis propiedades. (También tenga en cuenta que estoy usando un signo igual para asignar el valor a la variable)

En cada subproyecto/módulo, el archivo gradle se ve así:

android {
    compileSdkVersion global_compileSdkVersion
    buildToolsVersion global_buildToolsVersion
    ...
}

¡Nota!

El IDE de Android Studio no parece saber acerca de “ext” en los subproyectos, pero gradle sí. Por lo tanto, aparece como una advertencia al ver los archivos gradle, pero las compilaciones seguirán funcionando. Debido a que no conoce “ext”, tampoco parece conocer las variables que agrega, por lo que también se subrayarán en el IDE como advertencias. Pero funciona 🙂

Hmm, es interesante que no encontré una solución que funcione como esperaba en Android Studio. Pero solo esta solución que presento aquí funciona, por lo que no hay ninguna advertencia en el editor de Android Studio y funciona.

define en root build.gradle como todo el mundo lo hace:

buildscript {
    ext {
        projectAppCompatVersion = 'com.android.support:appcompat-v7:23.3.0'
        projectSupportVersion = 'com.android.support:support-v4:23.3.0'
        projectCompileSdkVersion = 23
        projectMinSdkVersion = 22      // 15 android 4.0.3 for release
        projectTargetSdkVersion = 23   //23 requires permission requests , 22 for release
        projectBuildToolsVersion = "24.0.0rc2"
    }
 }

y para acceder sin avisos:

compileSdkVersion project.properties.projectCompileSdkVersion
buildToolsVersion project.properties.projectBuildToolsVersion

pero la finalización del código y la resolución de variables no funcionan como esperaría para Android Studio.

En build.gradle del proyecto principal, debe escribir algo como lo siguiente:

project.extensions.add("buildToolsVersion", "19.0.3")

En el subproyecto puedes usar estas extensiones:

buildToolsVersion rootProject.buildToolsVersion

Más información que puedes encontrar aquí

  • Esto no funciona del todo: no se pudieron determinar las dependencias de la tarea ‘:myproject:mysubproject:compileDebugJava’. > ¡Android.buildToolsVersion no está! Como puede ver, falta el cierre de Android

    – Markw

    7 mayo 2014 a las 16:30

Cree una propiedad personalizada para su proyecto. Para establecer un uso de propiedad única:

project.ext.compileSdkVersion = 21

para establecer múltiples propiedades use:

project.ext {
    compileSdkVersion = 21
    buildToolsVersion = "21.0.1"
    targetSdkVersion = 21
}

  • Esto no funciona del todo: no se pudieron determinar las dependencias de la tarea ‘:myproject:mysubproject:compileDebugJava’. > ¡Android.buildToolsVersion no está! Como puede ver, falta el cierre de Android

    – Markw

    7 mayo 2014 a las 16:30

Simplemente hacer referencia al cierre de ‘android’ desde la compilación de nivel superior no funciona si la compilación de nivel superior no es una compilación de Android. El método ‘android’ no está disponible hasta después de evaluar. Originalmente, tenía una solución funcional basada en establecer la configuración después de Evaluar, pero ya no funciona (Android Studio 0.6.0):

Las tareas de Android ya se han creado. Esto sucede al llamar a android.applicationVariants, android.libraryVariants o android.testVariants. Una vez que se llama a estos métodos, no es posible continuar configurando el modelo.

¿Ha sido útil esta solución?