¿Cómo comparto dependencias entre módulos de Android?

6 minutos de lectura

avatar de usuario
Andrés

Tengo un módulo de aplicación de Android (aplicación) y un módulo de biblioteca de Android (biblioteca). Tanto la aplicación como la biblioteca contienen estas mismas dependencias:

dependencies {
    compile 'com.squareup.okhttp:okhttp:2.4.0'
    compile 'com.squareup.retrofit:retrofit:1.9.0'
    compile 'io.reactivex:rxjava:1.0.13'
    compile 'io.reactivex:rxandroid:0.25.0'
}

Sin embargo, cuando trato de agregar ese bloque al proyecto build.gradle, se queja de no conocer el DSL de “compilación”.

EDITAR: estoy preguntando acerca de poner este bloque de dependencias en el PROYECTO build.gradle, para evitar repetir en cada módulo build.gradle.

  • posible duplicado de android – gradle multiproject incluye y excluye bibliotecas

    – Jared Burrows

    5 de agosto de 2015 a las 20:21

  • No, estoy preguntando sobre compartir dependencias entre módulos para evitar tener que repetirlas en cada módulo.

    – Andrés

    5 de agosto de 2015 a las 20:38

avatar de usuario
Julio

A partir de la versión del complemento de Gradle 3.0.0 hay una mejor manera de hacer esto. Podemos controlar si cada dependencia está disponible solo para el módulo actual, o para el módulo actual Y cualquier módulo que dependa de él. Esto nos permitirá compartir fácilmente dependencias entre módulos dentro de un proyecto.

Así es como solíamos declarar las dependencias:

  • compilar ‘ejemplo.dependencia:1.0.0’

Aquí están las nuevas configuraciones que deberían reemplazar a compile:

  • implementación ‘example.dependency:1.0.0’ –> esta dependencia solo se usa dentro de este módulo
  • API ‘example.dependency:1.0.0’ –> esta dependencia también estará disponible en cualquier compilación que dependa de este módulo

A continuación, le mostramos cómo hacerlo con la arquitectura que mencionó en la pregunta. Suponiendo que tenemos un módulo llamado ‘biblioteca’ que es consumido por el ‘aplicación’ módulo, podemos usar el API configuración para declarar que la dependencia debe compartirse con cualquier módulo que dependa de ella.

módulo de biblioteca build.gradle

dependencies {

    // dependencies marked 'implementation' will only be available to the current module
    implementation 'com.squareup.okhttp:okhttp:2.4.0'

    // any dependencies marked 'api' will also be available to app module
    api 'com.squareup.retrofit:retrofit:1.9.0'
    api 'io.reactivex:rxjava:1.0.13'
    api 'io.reactivex:rxandroid:0.25.0'
}

módulo de aplicación build.gradle:

dependencies {

    // declare dependency on library module
    implementation project(':library')

    // only need to declare dependencies unique to app 
    implementation 'example.dependency:1.0.0'
}

Por favor mira esta guía para más información y diagramas.

  • No pude hacerlo funcionar. Hice exactamente lo mismo y también estoy usando la actualización en la biblioteca, pero aún así. Cuando importo mi módulo de biblioteca como .aar, después de que la compilación se realiza correctamente, se bloquea en el dispositivo con la excepción classnotfound. ¿Algun consejo?

    – Día de Burak

    21 de marzo de 2018 a las 10:53

  • Hola @Jules … ¿podría responder a mi pregunta? stackoverflow.com/questions/51694352/…

    – Abdulmalek Dery

    6 de agosto de 2018 a las 9:54


  • ¿Qué hay de Kapt?

    – Mi k

    22 de noviembre de 2019 a las 0:22

El bloque de dependencias (cierre) necesita DependencyHandler como delegado

Debe pasar DependencyHandler de cada proyecto a las dependencias compartidas en proyecto gradle.build.

proyecto construir.gradle

ext.sharedGroup = {dependencyHandler->
    delegate = dependencyHandler

    compile 'com.squareup.okhttp:okhttp:2.4.0'
    compile 'com.squareup.retrofit:retrofit:1.9.0'
    compile 'io.reactivex:rxjava:1.0.13'
    compile 'io.reactivex:rxandroid:0.25.0'
}

aplicación construir.gradle

dependencies {
    sharedGroup dependencies
}

árbitro. https://github.com/b1uec0in/DependencyVersionResolver

(consulte 2. Uso del grupo de dependencia predeterminado. Este ejemplo explica muchos otros consejos para compartir la versión de la biblioteca, las versiones SDK… para proyectos grandes que tienen muchos módulos).

Puede definir dependencias gradle compartidas en el módulo de la biblioteca, y si el módulo de la aplicación tiene la biblioteca como dependencia, no necesitará especificar todo dos veces. Llevando esto más lejos, podría crear un módulo ‘común’ que requiera las dependencias gradle compartidas, y hacer que tanto el módulo de la aplicación como el de la biblioteca requieran el módulo común.

Podrías hacer algo como esto donde el proyecto build.gradle especificará las dependencias necesarias como nombres de variables y luego en el aplicación build.gradle solo necesita incluir los nombres de las variables. ¡Esto es muy útil cuando tiene muchos módulos y no quiere editar todos cuando cambia el número de versión!

proyecto construir.gradle

buildscript {
    ext {
        googlePlayServicesVersion = '7.5.0'
        supportLibVersion = '22.2.0'
    }
... (the rest of your repositories/dependency info here) ...
}

ext {
    minSdkVersion=16
    targetSdkVersion=21
    buildToolsVersion='22.0.1'
    compileSdkVersion=21

    //Android Dependencies
    supportV4 = 'com.android.support:support-v4:' + supportLibVersion
    supportAnnotations="com.android.support:support-annotations:" + supportLibVersion
    recyclerView = 'com.android.support:recyclerview-v7:' + supportLibVersion
    cardView = 'com.android.support:cardview-v7:' + supportLibVersion
    palette="com.android.support:palette-v7:" + supportLibVersion
    appCompat="com.android.support:appcompat-v7:" + supportLibVersion
    multidex = 'com.android.support:multidex:1.0.1'
    appCompat="com.android.support:appcompat-v7:" + supportLibVersion
    supportDesign = 'com.android.support:design:' + supportLibVersion
    playServicesAnalytics="com.google.android.gms:play-services-analytics:" + googlePlayServicesVersion
}

aplicación archivo build.gradle

dependencies {
   compile rootProject.ext.supportV4
    compile rootProject.ext.appCompat
    compile rootProject.ext.supportAnnotations
    compile rootProject.ext.recyclerView
    compile rootProject.ext.cardView
    compile rootProject.ext.palette
    compile rootProject.ext.appCompat
    compile rootProject.ext.multidex
    compile rootProject.ext.supportDesign
    compile rootProject.ext.playServicesAnalytics

}

¡Espero que esto ayude!

Comparta bibliotecas usando el bloque ext en el módulo del proyecto raíz

Esta es una manera fácil de usar la biblioteca en todos los módulos en el proyecto de Android

Siga estos pasos:

  1. Agregar bloque ext (se usa para definir propiedades adicionales para el proyecto) en el archivo gradle del proyecto raíz
  2. Agregue bibliotecas comunes con el nombre de la variable en el bloque ext, por ejemplo, nombre = [
    libraries without implementation keyword
    ]
  3. Usé este bloque ext en el nivel del módulo usando la implementación y el nombre de la variable, por ejemplo, implementación variable_name

Vea el código a continuación para una implementación completa

construir.gradle: proyecto

buildscript {
... (the rest of your repositories here) ...
}

ext { **// ext block start here**




appModuleLibraries = [
            commonLibraries,
            /*Projects*/
            project(':hco-cutout'),
            project(':utils')

    ]

commonLibraries = [
        /*Android Libs*/
        'androidx.core:core-ktx:1.7.0',
        'androidx.appcompat:appcompat:1.4.1',
        'com.google.android.material:material:1.5.0',
        'androidx.constraintlayout:constraintlayout:2.1.3',
        /*Gesture viw for image zooming */
        'com.alexvasilkov:gesture-views:2.5.2',


]
cutoutModulleLibraries = [
        commonLibraries,
        project(':utils'),
        // Selfie segmentation
        'com.google.mlkit:segmentation-selfie:16.0.0-beta4',

        /*checker board drawable*/
        'com.github.duanhong169:checkerboarddrawable:1.0.2',
]
} **// ext block end here**

construir.gradle: aplicación

      dependencies {
    
      /*App Module Libraries in root project gradle*/

        implementation appModuleLibraries
    }

build.gradle: recorte

 dependencies {
    /*cutout Module Libraries in root project gradle*/

    implementation cutoutModulleLibraries

    implementation project(':utils')

}

¡Espero que esto ayude!

avatar de usuario
Antonio

Basado en la respuesta de @SMKS, preferiría esta solución para la capacidad y simplicidad de la opción transitiva

proyecto build.gradle

buildscript {
... (the rest of your repositories/dependency info here) ...
}

ext {
        googlePlayServicesVersion = '7.5.0'
        supportLibVersion = '22.2.0'
}

archivo build.gradle de la aplicación

dependencies {
    compile 'com.android.support:support-v4:' + supportLibVersion
    compile ' com.android.support:support-annotations:' + supportLibVersion
    compile="com.android.support:recyclerview-v7:" + supportLibVersion {
        transitive = true // do not know if this make sens/interest just for example
    }
   ...
}

¿Ha sido útil esta solución?