¿Cómo construir Android gradle proyecto que contiene módulos con diferentes compileSdkVersion, targetSdkVersion y minSdkVersion?

Mi proyecto de biblioteca de Android se compone de cuatro módulos:

  • proyecto
    • base
    • fábrica
    • V14
    • V18

Aquí hay una captura de pantalla de esta configuración de IntelliJ:

Módulos

Mis módulos utilizan ajustes de nivel SDK de Android muy específicos:

  • base
    • compileSdkVersion 19
    • minSdkVersion 14
    • targetSdkVersion 19
  • fábrica
    • compileSdkVersion 19
    • minSdkVersion 14
    • targetSdkVersion 19
  • V14
    • compileSdkVersion 17
    • minSdkVersion 14
    • targetSdkVersion 17
  • V18
    • compileSdkVersion 18
    • minSdkVersion 18
    • targetSdkVersion 18

A medida que se lanzan nuevas versiones de Android, los módulos de base y de fábrica pueden tener sus niveles compileSdkVersion y targetSdkVersion . Sin embargo, v14 y v18 ambos absolutamente no pueden seguir el juego con esto.

Mis módulos dependen unos de otros de maneras muy específicas:

  • base
    • No depende de ningún otro módulo
  • fábrica
    • Depende de la base, v14 y v18
  • V14
    • Depende de la base
  • V18
    • Depende de la base

Así que cuando voy a construir mi proyecto, recibo este error:

 Error:Gradle: Execution failed for task ':v14:processReleaseManifest'. > Manifest merging failed. See console for more info. 

Cuando construyo vía el terminal usando ./gradlew build --stacktrace , consigo un poco más información:

 :v14:processReleaseManifest [/blahblah/project/v14/build/exploded-aar/blahblah/base/unspecified/AndroidManifest.xml:2] Main manifest has <uses-sdk android:targetSdkVersion='17'> but library uses targetSdkVersion='19' :v14:processReleaseManifest FAILED 

Y aquí está mi archivo v14 AndroidManifest.xml :

 <?xml version="1.0" encoding="utf-8"?> <manifest package="com.example.v14"> <application /> </manifest> 

(Mi archivo base AndroidManifest.xml es casi exactamente idéntico)

 <?xml version="1.0" encoding="utf-8"?> <manifest package="com.example"> <application /> </manifest> 

Este error no tiene mucho sentido para mí. En primer lugar, no especifico los niveles de versión en ninguno de mis cuatro archivos diferentes de AndroidManifest.xml (y en su lugar, dejo que esos valores se hereden a través de mis cuatro archivos build.gradle diferentes).

En segundo lugar, no tengo un "manifiesto principal". El módulo base es probablemente lo más parecido que tengo a eso, y así exactamente cómo terminó el módulo v14 como el "manifiesto principal" que encuentro bastante confuso.

Por último, si este proyecto de configuración no es posible, entonces estoy sorprendido. Esta configuración de módulo es absolutamente trivial para configurar en un proyecto de estilo Eclipse. Es como he estado construyendo la biblioteca por meses.

Por cierto, mi meta final es que todo esto se compile en un único archivo .jar , que mi proyecto actual de Eclipse puede hacer. Es sólo que estoy tratando de migrar por completo a gradle y no quedar atrás en un barco que se hunde …

¿Algunas ideas? Si es necesario, puedo publicar mis varios archivos build.gradle ( build.gradle , settings.gradle …). Sólo tratando de evitar sobrecargar completamente este post.

Editar (27 de mayo de 2014)

Se ha añadido una captura de pantalla de la configuración de mi módulo al principio de esta publicación.

Si está utilizando sabores según la guía del usuario del complemento Gradle :

defaultConfig proporciona la configuración base para todos los sabores y cada sabor puede anular cualquier valor.

Por ejemplo, puede tener la siguiente configuración en su archivo build.gradle:

  android { ... defaultConfig { ... compileSdkVersion 19 minSdkVersion 14 targetSdkVersion 19 } productFlavors { base { compileSdkVersion 19 minSdkVersion 14 targetSdkVersion 19 } factory { compileSdkVersion 19 minSdkVersion 14 targetSdkVersion 19 } v14 { compileSdkVersion 17 minSdkVersion 14 targetSdkVersion 17 } v18 { compileSdkVersion 18 minSdkVersion 18 targetSdkVersion 18 } } } 

Además, tampoco es necesario establecer el nombre del paquete en el manifiesto. Puede configurarlas como las siguientes:

 android { ... productFlavors { base { packageName "com.example" ... } v14 { packageName "com.example.v14" ... } ... } } 
  • Cómo limpiar dependencias de Gradle en Android Studio?
  • Analiza el proyecto Android Studio (Gradle) con Sonarqube
  • Cómo establecer severityOverrides en lintOptions?
  • "La configuración de firma se debe especificar en los scripts de compilación de Gradle" ... lo hice
  • Gradle: añadir dependencia para un sabor específico de la biblioteca
  • Construye una biblioteca de código cerrado de Android basada en Gradle
  • Eliminar los servicios de Google Play de la aplicación en Android Studio
  • No encontró la clase "android.support.multidex.MultiDexApplication" en la ruta: DexPathList
  • Dependencias de Maven con Android Studio / Gradle
  • Cómo incluir el archivo versionado * .so en apk usando Gradle?
  • Android Studio: ¿Cómo crear un archivo build.gradle para usarlo en Jenkins?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.