3

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

我非常熟悉 main/ 中的 Android 资源被风格中的资源覆盖,但类不是(参见“重复类”编译错误)。因此,如果我MyClass在 main/ 中,并且只想在f3中更改此类,我知道有一些解决方案:

  • 从 main/ 中删除 MyClass 并将其放入所有口味中,然后在 f3/MyClass 中进行修改。这将导致维护地狱,我不想那样做。
  • 在 main/aAbstractMyClass中拥有与 MyClass 相同的内容,在 f1、f2、f4 中用空的 MyClass 继承它并在 f3 中继承它并进行修改。同样,我不喜欢这个解决方案,因为它使班级人数增长得非常快,这破坏了项目的可读性。实际上,我目前使用的项目使用了这个解决方案,因为项目很大,所以这是一场噩梦。

我通过这篇漂亮的帖子找到了另一个解决方案:https ://stackoverflow.com/a/30548238/8096984 。

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

这个解决方案似乎是 3 个中最好的,但要覆盖 1 个。如果现在我有一个 MyClass2 我只希望在 f2 中有所不同怎么办?如果我将 MyClass2 放在额外的 sourceSet 中,那么我将不得不将 f3 链接到 sourceSet 并因此中断我因为重复类错误而执行的第一个覆盖。

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

我应该怎么办?

4

1 回答 1

0

这是一个只需要三个 sourceSet 的解决方案:

将您的风格 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')
    }
}

此解决方案也适用于覆盖活动类。

于 2021-02-12T11:01:55.060 回答