support studio para librerias library last diseño dependencias create crear agregar android gradle library-project android-productflavors

android - studio - Gradle: agrega dependencia para un sabor específico de la biblioteca



create library android studio (3)

Tengo un proyecto de biblioteca y una aplicación. Me gustaría tener 2 sabores de producto ( store , dev ) tanto para la biblioteca como para la aplicación. Cuando construyo el sabor de la tienda para la aplicación, quiero usar el sabor de la tienda de la biblioteca. También cuando construyo el sabor dev para la aplicación, quiero usar el sabor dev de la biblioteca. Intenté establecer los mismos sabores de producto para la biblioteca y la aplicación, pero no funciona.

Aquí está mi configuración:

Biblioteca

apply plugin: ''android-library'' android { compileSdkVersion 19 buildToolsVersion "19.1.0" defaultConfig { applicationId "ro.amarkovits.graddletest.lib" minSdkVersion 14 targetSdkVersion 19 versionCode 1 versionName "1.0" } buildTypes { release { runProguard false proguardFiles getDefaultProguardFile(''proguard-android.txt''), ''proguard-rules.pro'' } } productFlavors{ store{ } dev{ } } } dependencies { compile fileTree(dir: ''libs'', include: [''*.jar'']) }

y tengo estos archivos: src / main / res / values ​​/ strings.xml y src / store / res / values ​​/ strings.xml

Solicitud

apply plugin: ''android'' android { compileSdkVersion 19 buildToolsVersion ''19.1.0'' defaultConfig { applicationId ''ro.amarkovits.mymodule.app'' minSdkVersion 14 targetSdkVersion 19 versionCode 1 versionName ''1.0'' } buildTypes { release { runProguard false proguardFiles getDefaultProguardFile(''proguard-android.txt''), ''proguard-rules.pro'' } } productFlavors{ store{ } dev{ } } } dependencies { compile fileTree(dir: ''libs'', include: [''*.jar'']) compile project('':lib'') }

En esta situación, aparece este error: Error: (12, 23) No se encontró ningún recurso que coincida con el nombre de pila (en ''texto'' con el valor ''@ cadena / nombre_aplicación''). El nombre_aplic se define en string.xml en la biblioteca (tanto en el directorio principal como en el de la tienda )

Si elimino los productFlavors de la biblioteca, compila, pero siempre use values.xml del directorio principal


En tu biblioteca necesitas decirle a Gradle que construya cada vez que haga una variante:

android { publishNonDefault true }

Luego, en su aplicación, como hace poco supongo, puede hacer esto:

dependencies { (...) devCompile project(path: '':lib'', configuration: ''devDebug'') // or ''devRelease'' storeCompile project(path: '':lib'', configuration: ''storeRelease'') // or ''storeDebug'' }

Se encuentra en la documentación oficial en Publicación de la Biblioteca .

Editar:

Desde la versión 0.14.3 (2014/11/18) , ahora también puede tener la directiva Flavor-buildType-Compile:

En su build.gradle antes del {} scope de Android, agregue lo siguiente:

configurations { devDebugCompile devReleaseCompile storeDebugCompile storeReleaseCompile }

Luego puede declarar y usar diferentes versiones de su biblioteca por Flavor-BuildType:

dependencies { (...) devDebugCompile project(path: '':lib'', configuration: ''devDebug'') devReleaseCompile project(path: '':lib'', configuration: ''devRelease'') storeDebugCompile project(path: '':lib'', configuration: ''storeDebug'') storeReleaseCompile project(path: '':lib'', configuration: ''storeRelease'') }

Editar:

La administración de dependencias entre los módulos ha cambiado desde Android Gradle Plugin 3.0.0 . Intenta automáticamente combinar los sabores entre su aplicación y las bibliotecas / módulos de los que depende.

¡Vea la documentación para la explicación completa !


Hace un tiempo tuve un problema similar, lo que sucede es que el compilador ignora los sabores de los productos para el proyecto de la biblioteca. Además, incluso cuando agrega más tipos de compilación, sigue buscando y compilando fuentes de liberación / depuración.

La razón es simple:

  • Los sabores del producto no son compatibles con el complemento de la biblioteca.
  • Los únicos tipos de compilación compatibles parecen ser de depuración y lanzamiento.

El compilador nunca buscará nada que ponga en el directorio de la tienda de su proyecto de biblioteca. Entonces, necesitas encontrar una forma de evitarlo.

Una forma de evitarlo sería incluir ambas implementaciones con un nivel de abstracción en su biblioteca (a través de interfaces, múltiples constructores, etc.), y luego permita que su proyecto de aplicación decida qué parte de la biblioteca ejecutar. Si usa proguard, automáticamente eliminará el código innecesario, si está desacoplado lo suficientemente bien (y posiblemente incluso si no lo está).


Para definir la dependencia específica para cada sabor, puede usar "nameOfTheFlavorCompile" en lugar de "compilar"

dependencies { storeCompile project('':lib'') }