如何以灵活的方式用Android风格覆盖Java/Kotlin类?

如何以灵活的方式用Android风格覆盖Java/Kotlin类?,android,android-gradle-plugin,android-productflavors,android-build-flavors,Android,Android Gradle Plugin,Android Productflavors,Android Build Flavors,我正在做一个Android项目,它使用口味。目前在我的项目中有4种口味,但很快就会有6-7种口味。 假设我有4种口味,f1、f2、f3和f4 我非常熟悉main/中的Android资源被flavors中的资源覆盖,但类不是(cf“duplicate classes”编译错误)。因此,如果我在main/中有MyClass,并且我只想在f3中更改此类,我知道有几种解决方案: 从main/中删除MyClass,并将其放入所有样式中,然后在f3/MyClass中进行修改。这将导致维修地狱,我不想那样做

我正在做一个Android项目,它使用
口味
。目前在我的项目中有4种口味,但很快就会有6-7种口味。 假设我有4种口味,f1、f2、f3和f4

我非常熟悉main/中的Android资源被flavors中的资源覆盖,但类不是(cf“duplicate classes”编译错误)。因此,如果我在main/中有
MyClass
,并且我只想在f3中更改此类,我知道有几种解决方案:

  • 从main/中删除MyClass,并将其放入所有样式中,然后在f3/MyClass中进行修改。这将导致维修地狱,我不想那样做
  • 在main/a
    AbstractMyClass
    中具有与MyClass相同的内容,在f1、f2、f4中使用空MyClass继承它,在f3中继承它并进行修改。同样,我不喜欢这个解决方案,因为它使类数量增长非常快,这破坏了项目的可读性。事实上,我目前正在处理的项目使用这个解决方案,这是一个噩梦,因为项目很大
我通过这篇漂亮的帖子找到了另一个解决方案:

这篇文章描述了f1、f2和f4将有一个指向包含MyClass的公共附加源集的链接(这样MyClass将不再位于main/more中),而f3将没有该链接。因此,它可以自由地定义自己的MyClass实现,而不会出现重复类错误

此解决方案似乎是3个方案中的最佳方案,但以1为准。 如果现在我有一个MyClass2,我只想在f2中有所不同,那该怎么办?如果我将MyClass2放在附加的源集中,那么我必须将f3链接到源集中,因此,由于重复类错误,我必须中断第一次重写

我必须创建另一个源集吗?如果我这样做了,那么我真的不喜欢这个解决方案,因为你可以想象,在一个使用6-7种风格的大型项目中,我必须创建的源集的数量


我该怎么办?

这里有一个只需要三个源集的解决方案:

将f1、f2、f3和f4的通用代码文件移动到以下文件夹中:

src/common/java
然后将f1、f2和f4风格代码复制到通用src目录中:

src/generic/java
src/common/java
中删除这些文件

然后,将特定f4风格文件的副本创建到特定的src目录中,例如

src/specific/java
然后,您的
build.gradle
脚本应更新如下:

android {
    ...
    productFlavors {
        f1 {
            ...
        }
        f2 {
            ...
        }
        f3 {
            ...
        }
        f4 {
            ...
        }
    }
    sourceSets {
        f1.java.srcDirs('src/generic/java', 'src/common/java')
        f2.java.srcDirs('src/generic/java', 'src/common/java')
        f4.java.srcDirs('src/generic/java', 'src/common/java')

        f3.java.srcDirs('src/specific/java', 'src/common/java')
    }
}
此解决方案还可以覆盖活动类