产品口味:找到重复类

我有一个非常愚蠢的问题,但是我几个小时以前坐在我的应用程序前面,但是我不明白问题在哪里。

我有一个Android应用程序(用kotlin编写),我想制作两种产品风味,并覆盖产品风格中的类/文件:

所以我的gradle脚本是这样的:

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

我的文件结构如下:

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

所以基本上我想重写Bar.kt文件中的foo产品的味道,但不知何故它不工作:它说类Bar是重复的。

任何提示?

变体状态的文档 (重点是我的):

注意:对于给定的构建变体,如果Gradle遇到两个或更多定义了相同Java类的源集合目录,则会引发构建错误。 例如,在构建调试APK时,不能同时定义src / debug / Utility.java和src / main / Utility.java。 这是因为Gradle在构建过程中会查看这两个目录,并引发“重复类”错误 。 如果你想为不同的构建类型使用不同版本的Utility.java,你可以让每个构建类型定义它自己的文件版本, 而不是把它包含在主/源集合中

所以解决方法是每个变种都有自己的Bar.kt版本, Bar.kt其从主源集中排除。

正如miensol所说的,你不能把你的文件放在main和flavor的特定文件夹中,希望gradle能像android资源系统一样工作。 但是我找到了一种不用代码复制的方法,所以您不必将Bar.kt复制到您拥有的每个flavor文件夹中。

所以我们假设你有三种开发方式prodmock 。 你希望你的特别嘲弄Bar.kt 模拟,但正常实施devprod口味。 你把你的模拟文件放到模拟特定的文件夹mock/java/com/something/然后把你的“默认”实现放到一个新的文件夹中,像non-mock/java/com/something/共同“也是有道理的。 现在你必须告诉gradle这些口味在哪里寻找Bar.kt类。

把这个放到你的build.gradle

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