如何以灵活的方式用Android风格覆盖Java/Kotlin类?
我正在做一个Android项目,它使用如何以灵活的方式用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中进行修改。这将导致维修地狱,我不想那样做
口味
。目前在我的项目中有4种口味,但很快就会有6-7种口味。
假设我有4种口味,f1、f2、f3和f4
我非常熟悉main/中的Android资源被flavors中的资源覆盖,但类不是(cf“duplicate classes”编译错误)。因此,如果我在main/中有MyClass
,并且我只想在f3中更改此类,我知道有几种解决方案:
- 从main/中删除MyClass,并将其放入所有样式中,然后在f3/MyClass中进行修改。这将导致维修地狱,我不想那样做
- 在main/a
中具有与MyClass相同的内容,在f1、f2、f4中使用空MyClass继承它,在f3中继承它并进行修改。同样,我不喜欢这个解决方案,因为它使类数量增长非常快,这破坏了项目的可读性。事实上,我目前正在处理的项目使用这个解决方案,这是一个噩梦,因为项目很大AbstractMyClass
我该怎么办?这里有一个只需要三个源集的解决方案: 将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')
}
}
此解决方案还可以覆盖活动类