为什么 gradle 不会在不同的 Android 风格中覆盖 Java 类?

Why won't gradle override Java classes in different Android flavors?

我有一个 android 应用有两种风格: -味道1 -风味2

我的目录树是:

/src/main
/src/flavor1
/src/flavor2

main 设置了默认源。 flavor1 和 flavor2 目录有自己的源集,gradle 会自动获取。如果我将资源文件添加到 flavor 目录中,它会从 main 覆盖它,并且工作正常。

但是,如果我将 java class 添加到 flavor2 中以覆盖 "main" 中的另一个 java,(例如 activity 需要在 flavor2 中有所不同),它不会替换它,它说我的项目中有一个重复的 class。我只是通过从 "main" 目录中删除 class 并将其添加到所有 flavors 文件夹中来使其工作。

有什么方法可以像资源文件一样覆盖 java classes 吗?为什么会这样?

Is there a way I can override java classes just like resource files ?

没有。 Android 工具团队的 Xavier Ducrohet 简要讨论了其中的一些内容 here

尽管有很多方法可以实现您想要的 - 稍后会详细介绍。

why does this happen?

您的 Java 代码需要编译。假设您从 main 源集中的其他 class 引用 class Foo,那么 Foo class 必须具有相同的 public API 不管编译的是什么风格。如果您能够用特定风味的 Foo 完全替换主要 Foo,这可能不成立。这当然不是工具无法解决的问题,但当前构建工具的解决方案就是不让你那样做。

当然对于图像等资源,这是完全不同的——只要存在某个版本的资源,Android 就可以很好地使用它。

但是,您可以创建 class 的特定风格实现以在 main 源集中使用。最简单的方法是在每种风格中只放一个 Foo,而不是在 main 源集中提供 Foo。为了加分,请在您的 main 源集中为这些实现创建一个接口,以确保特定风格的实现符合相同的接口并且不会导致构建错误。