tutorial studio productflavors now must flavors flavordimensions flavor configurar belong all android android-gradle kotlin android-productflavors

studio - productflavors android



Sabor del producto: clase duplicada encontrada (3)

Como lo indica miensol, no puede colocar su archivo en las carpetas main y específicas del sabor y esperar que Gradle funcione de la misma manera que funciona el sistema de recursos de Android. Pero encontré una manera de hacer esto sin duplicar el código para que no tenga que copiar su Bar.kt en cada carpeta de sabor que tenga.

Así que digamos que tienes tres sabores: dev , prod y simulacro . Desea que su Bar.kt especial de Bar.kt simulada, pero la implementación normal en dev y prod . Pones tu archivo simulado en la carpeta específica de mock/java/com/something/ y pones tu implementación "predeterminada" en una nueva carpeta con algún nombre aleatorio como non-mock/java/com/something/ nombrándolo como " común "también tendría sentido. Ahora tienes que decirle a Gradle dónde deben buscar esos sabores su clase Bar.kt

Ponga esto en su build.gradle :

android { ... sourceSets { prod { java.srcDirs(''src/non-mock/java'') } dev { java.srcDirs(''src/non-mock/java'') } } }

Tengo una pregunta muy estúpida, pero estoy sentado aquí frente a mi aplicación desde horas pero no puedo entender cuál es el problema.

Tengo una aplicación para Android (escrita en kotlin) y quiero hacer dos versiones de producto y anular una clase / archivo en la versión de producto:

Así que mi script de gradle es que:

apply plugin: ''com.android.application'' apply plugin: ''kotlin-android'' android { ... productFlavors { foo { applicationId "com.foo" } } }

Mis archivos están estructurados de la siguiente manera:

- src - androidTest - foo - java - com - example - Bar.kt - main - java - com - example - Bar.kt - test

Básicamente, me gustaría anular el archivo Bar.kt en foo product flavour, pero de alguna manera no funciona: dice que la barra de clases está duplicada.

¿Alguna pista?


Si tienes múltiples sabores, como A, B y C

y su código principal contiene todas las actividades, y para los sabores A y C, desea cambiar alguna funcionalidad de alguna actividad, ex- ShoppingCartActivity

luego debe hacer algunos cambios como se indica a continuación, colocar ShoppingCartActivity en los tres sabores (incluido B también) y eliminar de main y declarar el archivo en todos los archivos de manifiesto que no sean manifiestos principales

para más detalles verifique Construir con conjuntos de fuentes

- A - java - com - example - ShoppingCartActivity.kt(some changes) - B - java - com - example - ShoppingCartActivity.kt - C - java - com - example - ShoppingCartActivity.kt(new changes added) - main - java - com - example (remove from here)


La documentación para los estados de variantes (énfasis mío):

Nota: para una variante de construcción dada, Gradle lanza un error de construcción si encuentra dos o más directorios de conjuntos de fuentes que han definido la misma clase de Java. Por ejemplo, al crear un APK de depuración, no puede definir src / debug / Utility.java y src / main / Utility.java. Esto se debe a que Gradle examina ambos directorios durante el proceso de construcción y lanza un error de "clase duplicada" . Si desea diferentes versiones de Utility.java para diferentes tipos de compilación, puede hacer que cada tipo de compilación defina su propia versión del archivo y no la incluya en el conjunto principal / fuente .

Entonces, la solución es tener su propia versión de Bar.kt por variante y excluirla del conjunto de fuente principal.