Sabor del producto: class duplicada encontrada

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

Tengo una aplicación de Android (escrita en kotlin) y quiero hacer dos sabores de producto y anular una class / file en el sabor del producto:

Entonces mi script de gradle es eso:

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

Mis files están estructurados de la siguiente manera:

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

Así que, básicamente, me gustaría sobrescribir el file Bar.kt en el sabor del producto foo , pero de alguna manera no funciona: dice que la barra de class está duplicada.

¿Alguna pista?

La documentation para variantes de estados (énfasis mío):

Nota: Para una variante de compilation dada, Gradle arroja un error de compilation si encuentra dos o más directorys de sets de origen que han definido la misma class de Java. Por ejemplo, al build una debugging APK, no puede definir tanto src / debug / Utility.java como src / main / Utility.java. Esto se debe a que Gradle examina ambos directorys durante el process de compilation y arroja un error de "class duplicada" . Si desea diferentes versiones de Utility.java para diferentes types de compilation, puede hacer que cada tipo de compilation defina su propia versión del file y no lo incluya en el set principal / fuente .

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

Como dice miensol, no puedes poner tu file en carpetas main y de sabor específico y esperar que funcione de la misma manera que funciona el sistema de resources de Android. Pero encontré una forma de hacerlo sin duplicación de código, por lo que no tienes que copyr tu Bar.kt en cada carpeta de sabor que tengas.

Entonces digamos que tienes tres sabores dev , prod y burla . Desea que se Bar.kt su especial Bar.kt pero la implementación normal en los sabores dev y prod . Pones tu file simulado en la carpeta de simulacro de sabor específico, mock/java/com/something/ y pones tu implementación "pnetworkingeterminada" en una nueva carpeta con algún nombre aleatorio como non-mock/java/com/something/ nombrándolo algo así como " común "también tendría sentido. Ahora tienes que decirle a Gradle dónde deberían esos sabores search su class Bar.kt

Pon esto en tu build.gradle :

 android { ... sourceSets { prod { java.srcDirs('src/non-mock/java') } dev { java.srcDirs('src/non-mock/java') } } } 
  • ¿Alternativas al campo de las strings de boxeo o extendiendo TODAS las strings en Kotlin?
  • Kotlin: function abstracta con tipo de retorno genérico
  • Retrofit-Vertx con RxJava2 en Kotlin IllegalStateException message == null
  • Operador as y ClassCastException
  • Kotlin, networkinguce el código duplicado
  • ¿Por qué algunos files de Kotlin muestran el ícono de candado?
  • No se puede importar un package generado swig
  • Método de ejecución en el object kotlin
  • Jackson's @JsonAppend con valor pnetworkingeterminado
  • Obtener reference de class de la function de nivel superior en kotlin
  • ¿Cómo adjunto fonts para Kotlin en Android Studio?