descargar - Sabores Gradle para Android con juegos de fuentes personalizados: ¿cómo deberían ser los archivos gradle?
gradle version android studio (4)
Así es como se ve mi Gradle:
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'']
}
Y así es como mi estructura de Directorio es:
MyApplication
- res
- libs
- jni
- src
-com/akshat/
- src_qa
- com/akshat/util/FlavorConst.java
- src_normal
- com/akshat/util/FlavorConst.java
Tengo un proyecto de eclipse antiguo. Me mudé al estudio android y configuré para usar sabores. Parecía estar funcionando bien hasta que comencé a tratar de usar diferentes archivos Java entre mis sabores.
La configuración de mi proyecto es esta:
ProjectRoot
+- acitonbarsherlock
+- facebook
+- myLib1
+- myProject
+- src
+- commonFiles
+- flavor1
+- flavor2
+- res
+- flavor1
+- flavor2
Las entrañas del cierre de android del archivo gradle myProject se ven así:
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
}
}
}
Con mi configuración como este gradle se queja de no poder encontrar las clases que intento heredar de commonFiles en flavor1 o flavor2.
De los otros temas que he visto aquí, veo que otros ni siquiera definen conjuntos de fuentes, y siento que lo que estoy haciendo en ellos es quizás demasiado.
¿Alguien ha experimentado esto antes y sabe cómo debería configurarse correctamente?
Creo que sería mejor no definir sourceSets
personalizados, sino usar la configuración de gradle predeterminada. Solía hacer fuentes de creación personalizadas hasta que me di cuenta de que las convenciones son, bueno, convenientes.
Querrás algo como esto:
+ src
+ main // this is your common code
+ java
+ res
+ flavor1
+ java
+ res
+ flavor2
+ java
+ res
Luego, puede continuar y eliminar el cierre de build.gradle
su build.gradle
NOTA: Para la configuración gradle
, los recursos se fusionan o se reemplazan, mientras que todos los códigos java
se colocan en la misma ruta de clase. Por ejemplo, los archivos AndroidManifest.xml
para cada sabor solo necesitan las diferencias del archivo de manifiesto main
. Tener un activo, por ejemplo, ic_launcher
en un sabor anula el ic_launcher
de main si dicho archivo existe. Sin embargo, no es posible tener un archivo HomeActivity.java
en main
y en flavor, y dará un error de archivo duplicado.
Le invitamos a utilizar los conjuntos de sourceSets
y flavours
(o buildTypes
) si lo desea.
Como ejemplo, puede configurarlos en su archivo Gradle de la siguiente manera:
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'']
...
}
}
Puedes codificar como el siguiente ejemplo que tomo
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'']
....
}
}