web-dev-qa-db-fra.com

Gradient savors pour Android avec des sources personnalisées - à quoi devraient ressembler les fichiers Gradle?

J'ai un vieux projet Eclipse dans lequel j'ai emménagé dans Android studio et j'ai été configuré pour utiliser les saveurs. Cela semblait bien fonctionner jusqu'à ce que je commence à essayer d'utiliser différents fichiers Java entre mes différentes versions.

Ma configuration de projet est la suivante:

ProjectRoot
+- acitonbarsherlock
+- facebook
+- myLib1
+- myProject
   +- src
      +- commonFiles
         +- flavor1
         +- flavor2
   +- res
      +- flavor1
      +- flavor2

L'intérieur de la fermeture du fichier de graduation myProject Android ressemble à ceci:

Android {
compileSdkVersion 17
buildToolsVersion "18.0.1"

signingConfigs {
     ...
}

productFlavors {
    flavor2 {
    }
    flavor1 {
    }
}

sourceSets{
    main {
        manifest.srcFile 'AndroidManifest.xml'
        Java.srcDirs = ['src/commonFiles/Java']
        resources.srcDirs = ['src/commonFiles/Java']
        aidl.srcDirs = ['src/commonFiles/Java']
        renderscript.srcDirs = ['src/commonFiles/Java']
        res.srcDirs = ['res']
        assets.srcDirs = ['assets']
    }

    flavor2 {
        manifest.srcFile 'AndroidManifest-flavor2.xml'
        res.srcDirs = ['res-flavor2', 'res']
        Java.srcDirs = ['src/flavor2/Java','src/commonFiles/Java']
        resources.srcDirs = ['src/flavor2/Java','src/commonFiles/Java']
        aidl.srcDirs = ['src/flavor2/Java','src/commonFiles/Java']
        renderscript.srcDirs = ['src/flavor2/Java','src/commonFiles/Java']
    }

    flavor1 {
        manifest.srcFile 'AndroidManifest.xml'
        Java.srcDirs = ['src/flavor1/Java','src/commonFiles/Java']
        resources.srcDirs = ['src/flavor1/Java','src/commonFiles/Java']
        aidl.srcDirs = ['src/flavor1/Java','src/commonFiles/Java']
        renderscript.srcDirs = ['src/flavor1/Java','src/commonFiles/Java']
        res.srcDirs = ['res-flavor1','res']
        assets.srcDirs = ['assets']
    }

    // Move the tests to tests/Java, tests/res, etc...
    instrumentTest.setRoot('tests')

    // Move the build types to build-types/<type>
    // For instance, build-types/debug/Java, build-types/debug/AndroidManifest.xml, ...
    // This moves them out of them default location under src/<type>/... which would
    // conflict with src/ being used by the main source set.
    // Adding new build types or product flavors should be accompanied
    // by a similar customization.
    debug.setRoot('build-types/debug')
    release.setRoot('build-types/release')

}

buildTypes {
    release {
        signingConfig signingConfigs.release
    }
}

}

Avec cette configuration, Gradle se plaint de ne pas pouvoir trouver les classes que j'essaie d'hériter de commonFiles dans flavour1 ou flavour2.

Parmi les divers sujets que j'ai examinés ici, je vois que d'autres ne définissent même pas les ensembles de sources, et j'ai l'impression que ce que je fais dans ces cas est peut-être trop.

Quelqu'un a-t-il déjà expérimenté cela et sait-il comment le configurer correctement?

48
AdamWardVGP

Je pense que vous feriez mieux de ne pas définir sourceSets personnalisé, mais d'utiliser la configuration par défaut du dégradé. Je faisais des sources personnalisées jusqu'à ce que je réalise que les conventions sont bien pratiques.

Vous voudrez quelque chose comme ça: 

+ src
    + main // this is your common code
        + Java 
        + res
    + flavor1
        + Java
        + res
    + flavor2
        + Java
        + res

Ensuite, vous pouvez simplement aller de l'avant et supprimer la fermeture des sourcesets de votre build.gradle

REMARQUE: Pour la configuration gradle, les ressources sont fusionnées ou remplacées, alors que tout le code Java est placé dans le même chemin de classe. Par exemple, les fichiers AndroidManifest.xml de chaque type doivent uniquement présenter les différences par rapport au fichier manifeste de main. Le fait d'avoir un actif, par exemple, ic_launcher dans une variante, remplace le ic_launcher de main si ce fichier existe. Cependant, avoir un fichier HomeActivity.Java à la fois dans main et la variante n'est pas possible et donnera une erreur de fichier en double.

52
Saad Farooq

Vous pouvez utiliser les options personnalisées sourceSets et flavours (ou buildTypes) si vous le souhaitez.

Par exemple, vous pouvez les définir dans votre fichier Gradle comme suit: -

productFlavors {
    flavor2 {
    }
    flavor1 {
    }
}

sourceSets{
    main {
        manifest.srcFile 'AndroidManifest.xml'
        Java.srcDirs = ['src/commonFiles/Java']
        resources.srcDirs = ['src/commonFiles/Java']
        aidl.srcDirs = ['src/commonFiles/Java']
        renderscript.srcDirs = ['src/commonFiles/Java']
        res.srcDirs = ['res']
        assets.srcDirs = ['assets']
    }
  flavor1 {
       Java.srcDirs = ['src-flavor1'] 
       res.srcDirs = ['res-flavor1']
       ...
    }

}
37
Ryan

Voici à quoi ressemble mon diplôme: 

   productFlavors {
    // Still keeping the productFlavors closure in case we decide to add flavors later
    normal {
        applicationId 'com.akshat'
    }
    qa {
        applicationId 'com.akshat.qa'
    }
}

 sourceSets {
    main {
        manifest.srcFile 'AndroidManifest.xml'
        Java.srcDirs = ['src']
        resources.srcDirs = ['src']
        aidl.srcDirs = ['src']
        renderscript.srcDirs = ['src']
        res.srcDirs = ['res']
        assets.srcDirs = ['assets']
        jni.srcDirs = [] // Set empty since we use our own ndkBuild task
        jniLibs.srcDirs = ['libs']
    }

    normal {
        Java.srcDirs = ['src_normal']
    }
    qa{
        Java.srcDirs = ['src_qa']
    }

Et voici comment ma structure de répertoire est:

MyApplication
    - res
    - libs
    - jni 
    - src
         -com/akshat/
    - src_qa
         - com/akshat/util/FlavorConst.Java
    - src_normal
         - com/akshat/util/FlavorConst.Java
5
Akshat

Cette façon fonctionne pour moi. Prendre plaisir

sourceSets {
        main {
            manifest.srcFile 'src/AndroidManifest.xml'
            Java.srcDirs = ['src/Java']
            resources.srcDirs = ['srs/others']
            res.srcDirs = ['src/res']
            assets.srcDirs = ['src/assets']
            jniLibs.srcDirs = ['jniLibs']
        }
        development{
            res.srcDirs += ['development/src/res']
        }
        standford{
            res.srcDirs += ['standford/src/res']
        }

        commercial{
            res.srcDirs += ['commercial/src/res']
        }

    }
    productFlavors {
        development{
            flavorDimensions "default"
        }
        standford{
            flavorDimensions "default"
        }
        commercial{
            flavorDimensions "default"
        }
    }
1
Qamar

Vous pouvez coder comme dans l'exemple ci-dessous que je prends

sourceSets {
    main {
        manifest.srcFile 'AndroidManifest.xml'
        res.srcDirs = ['res']
        Java.srcDirs = ['src', '../3party/Alohalytics/src/Android/Java', 'ttsearch/jni/out']
        assets.srcDirs = ['assets', 'flavors/mwm-ttf-assets']
        jniLibs.srcDirs = ['libs', 'jniLibs', 'ttsearch/libs']
    }
    flavor {
        manifest.srcFile 'flavor'
        assets.srcDirs = ['flavor/assets']
        res.srcDirs = ['flavor/res']
        res.srcDirs = ['flavor/res']
        ....
    }
}
0
Benchur Wong