J'ai un projet de bibliothèque et une application. J'aimerais avoir 2 versions de produit (store, dev) pour la bibliothèque et l'application. Lorsque je crée la saveur store pour l'application, je veux utiliser la saveur store de la bibliothèque. De plus, lorsque je crée la saveur dev pour l'application, je veux utiliser la saveur dev de la bibliothèque. J'ai essayé de définir les mêmes saveurs de produit pour la bibliothèque et l'application, mais cela ne fonctionne pas.
Voici ma configuration:
Bibliothèque
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'])
}
et j'ai ces fichiers: src/main/res/values / strings.xml et src/store/res/values / strings.xml
Application
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')
}
Dans cette situation, j'obtiens cette erreur: Erreur: (12, 23) Aucune ressource trouvée correspondant au nom donné (dans 'text' avec la valeur '@ string/app_name'). app_name est défini dans string.xml dans la bibliothèque (dans les deux principal et magasin répertoire)
Si je supprime les productFlavors de la bibliothèque qu'il construit mais utilise toujours le values.xml du répertoire main
Dans votre bibliothèque, vous devez dire à gradle de construire à chaque fois chaque variante:
Android {
publishNonDefault true
}
Ensuite, dans votre application, depuis récemment, je suppose, vous pouvez le faire:
dependencies {
(...)
devCompile project(path: ':lib', configuration: 'devDebug') // or 'devRelease'
storeCompile project(path: ':lib', configuration: 'storeRelease') // or 'storeDebug'
}
Trouvé dans la documentation officielle sous Publication de la bibliothèque .
Éditer:
Depuis la version .14.3 (2014/11/18) , vous pouvez désormais également avoir la directive Flavor-buildType-Compile:
Dans votre build.gradle avant la portée Android {}, ajoutez ce qui suit:
configurations {
devDebugCompile
devReleaseCompile
storeDebugCompile
storeReleaseCompile
}
Ensuite, vous pouvez déclarer et utiliser différentes versions de votre bibliothèque par 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')
}
Éditer:
La gestion des dépendances entre les modules a changé depuis Android Gradle Plugin 3.0.0 . Il essaie automatiquement de faire correspondre les saveurs entre votre application et les bibliothèques/modules dont elle dépend.
Voir le documentation pour toute l'explication !
Pour définir une dépendance spécifique pour chaque saveur, vous pouvez utiliser "nameOfTheFlavorCompile" au lieu de "compiler"
dependencies {
storeCompile project(':lib')
}
J'ai eu un problème similaire il y a quelque temps, ce qui se passe est que le compilateur ignore les saveurs de produit pour le projet de bibliothèque. De plus, même lorsque vous ajoutez d'autres types de build, il continue de rechercher et de compiler les sources de version/débogage.
La raison est simple:
Le compilateur jamais recherchera tout ce que vous mettez dans le répertoire de stockage de votre projet de bibliothèque. Donc, vous devez trouver un moyen de contourner ce problème.
Une solution consiste à inclure les deux implémentations avec un niveau d'abstraction dans votre bibliothèque (via des interfaces, plusieurs constructeurs, etc.), puis à laisser votre projet d'application décider de la partie de la bibliothèque à exécuter. Si vous utilisez proguard, il se débarrassera automatiquement du code inutile, s'il est suffisamment découplé (et peut-être même si ce n'est pas le cas).