Creación de Android Gradle con subproyectos

Actualmente estoy en el proceso de convertir uno de nuestros proyectos a Gradle de maven. La estructura de carpetas es la siguiente:

gitRoot settings.gradle build.gradle ProjectA build.gradle src/main/java Libraries SomeLib (git submodule) ProjectBRoot (git submodule) settings.gradle build.gradle ProjectB build.gradle src/main/java Libraries FacebookSDK/facebook build.gradle src 

Así que ya parece complicado. Pero la idea es que ProjectB es un proyecto de biblioteca y debe ser capaz de ser construido y embalado por separado, por lo que tiene su propia settings.gradle y por lo que puedo decir que parece estar funcionando bien, lo tengo edificio Y su facebook de encontrar muy bien.

El ProjectB / build.gradle contiene esta línea

 compile project(':libraries:facebook-android-sdk:facebook') 

El ProjectBRoot / settings.gradle contiene esta línea

 include ':ProjectB', ':libraries:facebook-android-sdk:facebook' 

El gitRoot / settings.gradle contiene esta línea

 include ':ProjectA', ':Libraries:ProjectBRoot:ProjectB' 

El ProjectA / build.gradle contiene esta línea

 compile project(':Libraries:ProjectBRoot:ProjectB') 

Cuando corro la construcción consigo este error

 The TaskContainer.add() method has been deprecated and is scheduled to be removed in Gradle 2.0. Please use the create() method instead. FAILURE: Build failed with an exception. * Where: Build file '/gitRoot/Libraries/ProjectBRoot/ProjectB/build.gradle' line: 17 * What went wrong: A problem occurred evaluating project ':Libraries:ProjectBRoot:ProjectB'. > Project with path ':libraries:facebook-android-sdk:facebook' could not be found in project ':Libraries:ProjectBRoot:ProjectB'. * Try: Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. BUILD FAILED Total time: 4.652 secs 

Así que mi conjetura en cuanto a lo que está mal es que facebook no está en una subcarpeta directa de ProjectB … pero eso no importa al construir dentro de ProjectBRoot. Esto es probablemente debido a la cara que estoy referenciando ProjectB directamente y no a través de ProjectBRoot / gradle.build, pero lo intenté y también no funcionó. ¿Puede alguien por favor me ayude, he mirado a través de la documentación y no habla de múltiples proyectos que tienen sus propios archivos settings.gradle y creo que eso es lo que me está estropeando.

Actualizar:

Así que seguí la respuesta de Xav y ahora soy capaz de construir con la línea de comandos sin embargo no puedo importar / construir con android studio. Sé que el problema todavía está con el proyecto de Facebook. El error que consigo es que no podría configurar ProjectB.

  Gradle: A problem occurred configuring project ':ProjectA'. > Failed to notify project evaluation listener. > A problem occurred configuring project ':Libraries:ProjectBRoot:ProjectB'. > Failed to notify project evaluation listener. > Configuration with name 'default' not found. 

El error es causado por la línea

  compile project(':facebook-sdk') 

Dentro del ProjectB / build.gradle

Settings.gradle debe definir todos los módulos. No se cargarán otros settings.gradle encontrados en el árbol para cargar más módulos.

Tendrás que

  1. Definir un módulo para el SDK de Facebook en el nivel superior settings.gradle. Sí, es redundante con los otros settings.gradle.

  2. Publicar Project B de alguna manera (así como sus dependencias, en este caso la biblioteca de Facebook SDK), en algún lugar (un repositorio de artefactos corporativos por ejemplo) y acceder desde el Proyecto A.

Aunque # 1 es mejor, hace que la dependencia de ProjectB -> Facebook sea complicada ya que la ruta será diferente dependiendo de la configuración .gradle utilizada. Una forma de solucionar esto es dividir el nombre / ruta del módulo de su ubicación real en el disco. Esto se hace dentro del archivo settings.gradle.

En el archivo settings.gradle de nivel superior, haga

 include 'facebook-sdk' project(':facebook-sdk').projectDir = new File('Libraries/ProjectBRoot/Libraries/FacebookSDK/facebook') 

En el archivo setting.gradle dentro de su Proyecto B, haga lo mismo con la ruta relativa diferente:

 include 'facebook-sdk' project(':facebook-sdk').projectDir = new File('Libraries/FacebookSDK/facebook') 

Esto hace que tanto la configuración del proyecto defina el mismo módulo 'facebook-sdk' ubicado en la misma ubicación absoluta en el disco.

Todos los proyectos dependiendo de este módulo deberían declarar la dependencia como

 compile project(':facebook-sdk') 

Esta no es la respuesta que buscas, pero …

Pasé unos 4 días intentando migrar mi estructura de proyecto compleja (como la suya en realidad), en gradle. Al final, abandoné todo el concepto de subproyecto (ya que en mi caso, simplemente no funcionó), y opté por usar el enfoque del repositorio local de maven, tal como se describe en este artículo: http: //www.flexlabs .org / 2013/06 / using-local-aar-android-library-packages-en-gradle-builds

Por lo tanto, en mis proyectos de Biblioteca que tenían subproyectos, básicamente creé proyectos de biblioteca completos para cada uno de ellos, y luego utilicé el enlace anterior para publicarlos en el repositorio local de maven. A continuación, en el proyecto padre, he eliminado las referencias a subproyectos, y en las dependencias, acabo de hacer referencia a las bibliotecas publicadas. Y luego en mi proyecto principal, eliminé todas las referencias a los subproyectos, y hice referencia a las versiones locales publicadas de maven de mis bibliotecas.

Al final, todo funciona muy bien, pero tomó algún tiempo para convertir todo. Tenía alrededor de 6 proyectos de biblioteca con subproyectos, que subproyectos, etc, y ahora todo funciona bien.

Lo que no me gusta de sistemas como Gradle y Maven es que realmente esperan que cambie "cómo" estructura su código / proyectos. Por lo tanto, si está migrando a Gradle vs comenzar con Gradle, entonces el proceso puede ser muy frustrante. Una vez que lo averigüe, la próxima vez es mucho más fácil;)

Sólo tendría la aplicación con las bibliotecas todas al mismo nivel. Todavía puede crear y empaquetar cada biblioteca basada en el archivo build.gradle. Puedo estar perdiendo algo, pero la estructura no es tan importante como lo que está en los archivos build.gradle. Todavía podría tener projectB depender de Facebook, incluso si están en el mismo nivel de carpeta.

Finalmente he conseguido construir el proyecto (sin errores gradle). Respuesta de Xavier fue muy útil.

Paso casi 3 días tratando de configurar mi proyecto, sé que estoy muy cerca de ser finsihed pero tengo EXCEPCIÓN DE NIVEL SUPERIOR INESPERADO en el último paso del proceso de generación de gradles (dexDebug).

Mi proyecto de configuración es muy similar a Stoyan sin embargo tengo varios proyectos de la biblioteca de android que están haciendo referencia a las bibliotecas de soporte de android. Sugiero que si tiene problemas con la compilación de su proyecto de raíz superior (error diciendo que el soporte de Android ya está agregado) de lo que necesita para mover el tarro en separado proyecto de la biblioteca de Android (descomponer / separar en una instancia autónoma).

Ejemplo

 --| ProjectARoot --| ProjectA (where main/java etc are) --| build.gradle --| settings.gradle --| libraries --| ProjectBRoot --| settings.gradle --| ProjectB --| libraries --| android-supports (android lib project) --| libs --| android-support-v4.jar --| android-support-v13.jar --| build.gradle --| libA --| build.gradle (referencing android-supports)' 

Ejemplo de script de creación para la referencia de libA android apoya proyectos

 buildscript { repositories { maven { url 'http://repo1.maven.org/maven2' } } dependencies { classpath 'com.android.tools.build:gradle:0.4' } } apply plugin: 'android-library' dependencies { compile project(':android-support') } android { compileSdkVersion 17 buildToolsVersion "17.0.0" defaultConfig { minSdkVersion 7 targetSdkVersion 17 } } 

// configuración raíz superior.gradle

 include 'ProjectB', 'android-support', ':ProjectA' (notice Project B is first than android-support and lastly Project A) project(':android-support').projectDir = new File('libraries/ProjectBRoot/libraries/android-support') project(':ProjectB').projectDir = new File('libraries/ProjectBRoot/ProjectB') 

Actualmente, cuando ejecuto gradle construir consigo este error

 :ProjectA:dexDebug UNEXPECTED TOP-LEVEL EXCEPTION: java.lang.IllegalArgumentException: already added: Landroid/support/v4/accessibilityservice/AccessibilityServiceInfoCompat; at com.android.dx.dex.file.ClassDefsSection.add(ClassDefsSection.java:123) at com.android.dx.dex.file.DexFile.add(DexFile.java:163) at com.android.dx.command.dexer.Main.processClass(Main.java:490) at com.android.dx.command.dexer.Main.processFileBytes(Main.java:459) at com.android.dx.command.dexer.Main.access$400(Main.java:67) at com.android.dx.command.dexer.Main$1.processFileBytes(Main.java:398) at com.android.dx.cf.direct.ClassPathOpener.processArchive(ClassPathOpener.java:245) at com.android.dx.cf.direct.ClassPathOpener.processOne(ClassPathOpener.java:131) at com.android.dx.cf.direct.ClassPathOpener.process(ClassPathOpener.java:109) at com.android.dx.command.dexer.Main.processOne(Main.java:422) at com.android.dx.command.dexer.Main.processAllFiles(Main.java:333) at com.android.dx.command.dexer.Main.run(Main.java:209) at com.android.dx.command.dexer.Main.main(Main.java:174) at com.android.dx.command.Main.main(Main.java:91) 1 error; aborting :ProjectA:dexDebug FAILED 

Tenía el mismo problema, en mi caso, me olvidé de añadir el proyecto en settings.gradle . Después de eso, funcionó

  • Compile varios módulos en la dependencia de Gradle de Android
  • ¿Por qué no puedo usar la tarea gradle connectedDebugAndroidTest en mi script de compilación?
  • ¿Cómo agregar Android Support Repository a Android Studio?
  • Gradle: No se ha encontrado ningún identificador de recurso para el atributo cuando se usan sabores y packageName
  • Cómo incluir dependencias de maven remoto en una biblioteca de Android
  • Error de generación con Android Studio 3.0 Canary 4
  • No se pudo resolver la dependencia androide activa en Gradle cuando Active Android se incluye en la biblioteca
  • Android - La ejecución falló para la tarea ': app: compileDebugJavaWithJavac'
  • Android Gradle: renombrar / deshabilitar tipo de compilación predeterminado
  • Error de Android RecyclerView
  • Android Gradle Adición de biblioteca estática
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.