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?
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.
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']
...
}
}
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
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"
}
}
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']
....
}
}