web-dev-qa-db-fra.com

Gradle: ajoutez de la dépendance pour une saveur spécifique de la bibliothèque

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

40
amarkovits

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 !

54
galex

Pour définir une dépendance spécifique pour chaque saveur, vous pouvez utiliser "nameOfTheFlavorCompile" au lieu de "compiler"

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

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:

  • Les versions de produit ne sont pas prises en charge pour le plug-in de bibliothèque.
  • Les seuls types de build pris en charge semblent être le débogage et la publication.

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).

2
Hessan Feghhi