with ultima studio replaced para has descargar configurar compile been and android gradle android-gradle android-library aar

ultima - Configuración de Gradle con biblioteca de Android de varios módulos



ultima version de gradle (1)

Historia anterior

Tengo esta biblioteca de aar que los desarrolladores pueden usar normalmente con

compile ''com.companyname.sdk:android-sdk:2.x''

y ahora estamos reescribiendo la biblioteca desde cero para crear V3.

En esta reorganización, logramos dividir la lib en módulos. Así que uno podría decir que en V3 tendríamos los siguientes artefactos

compile ''com.companyname.sdk:core:3.x'' compile ''com.companyname.sdk:extra_1:3.x'' compile ''com.companyname.sdk:extra_2:3.x'' compile ''com.companyname.sdk:extra_ ....

y esto daría a la estructura gradle los siguientes módulos:

root: |- test_app (apk just for testing, not deployed anywhere) |- sdk (aka: core) |- extra_1 |- extra_2 |- extra_ ... etc

para cada módulo extra en su build.gradle hay un provided ('':sdk'') para que pueda usar todo desde el módulo sdk , pero en realidad no compilarlo dentro de sí mismos.

pero también me gustaría proporcionar una ruta de migración sencilla para las aplicaciones de host existentes. Es decir, me gustaría que en V3 también tenga el siguiente artefacto que combina core y extra_1 (que básicamente es lo que está actualmente en V2).

compile ''com.companyname.sdk:android-sdk:3.0.0''

Todo eso suena muy bien en teoría, pero me está resultando muy difícil descifrar una estructura de gradle que me permita exportar fácilmente todo eso.

Lo que quiero lograr

Así que me gustaría poder generar durante una compilación los siguientes artefactos:

  • android-sdk que incluye tanto core como extra_1
  • core
  • extra_1
  • ... todos los demás extras

¿Qué he intentado?

  • agregue un módulo adicional llamado legacy , aplique com.android.library sin ningún código y agregue el compile project para los otros dos módulos. Genera un aar vacío

  • agregue buildTypes core / legacy con los sourceSets de ambos módulos. Nunca generó 2 aar

  • agregue productFlavours core / legacy con los sourceSets de ambos módulos. No se compila porque no puede encontrar las importaciones de sdk declaradas en extra_1 (algunas de las cuales se generan durante el procesador de anotación, o lombok)

  • agregue compile project(''extra_1'') core / legacy con el compile project(''extra_1'') . No compila porque hay una dependencia cíclica entre sdk y extra_1.

Responder

Basado en la respuesta de Gabrielle terminé cavando más y descubrí que la opción de crear un módulo adicional con las dependencias es la correcta. Generará un AAR con manifiesto vacío y clases vacías. Pero la parte importante es el archivo POM que generará que incluirá las dependencias correctas.

Una advertencia sobre el enfoque está en la configuración del plugin maven-publish . Normalmente necesita un objeto de publications con publications y un nodo pom.withXml . el mío era como seguir:

pom.withXml { def root = asNode() def license = root.appendNode(''licenses'').appendNode(''license'') license.appendNode(''name'', ''The Apache Software License, Version 2.0'') license.appendNode(''url'', ''http://www.apache.org/licenses/LICENSE-2.0.txt'') license.appendNode(''distribution'', ''repo'') def dependenciesNode = asNode().appendNode(''dependencies'') configurations.compile.allDependencies.each { dependency -> def dependencyNode = dependenciesNode.appendNode(''dependency'') dependencyNode.appendNode(''groupId'', dependency.group) dependencyNode.appendNode(''artifactId'', dependency.name) dependencyNode.appendNode(''version'', dependency.version) } }

El problema con ese enfoque es que dependency.version (al final) no se especifica, y como tal genera un archivo POM con <version>unspecified</version> .

La solución es simple, reemplace el retraso con alguna variable que tenga en el guión con el número de versión correcto. El mío se veía así:

dependencyNode.appendNode(''version'', "${rootProject.ext.SDK_VERSION}")


Deberías hacer algo como esto:

root: |- test_app (apk just for testing, not deployed anywhere) |- core |- extra_1 |- extra_2 |- extra_ ... etc |- android-sdk

En core/build.gradle :

apply plugin: ''com.android.library'' //...

En extra1/build.gradle :

apply plugin: ''com.android.library'' //... dependencies { compile project('':core'') }

En android-sdk/build.gradle :

apply plugin: ''com.android.library'' //... dependencies { compile project('':core'') compile project('':extra'') }