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

时间:2015-07-30 21:00:07

标签: java android android-studio gradle android-build

我有一个有2种口味的Android应用程序: -flavor1 -flavor2

我的目录树是:

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

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

但是,如果我在flavor2中添加一个java类来覆盖" main"中的另一个(例如,在flavor2中需要不同的活动),它不会替换它并且它说我的项目中有一个重复的类。我只是通过删除" main"中的类来实现这一点。目录并将其添加到所有flavor文件夹。

有没有办法像资源文件一样覆盖java类?为什么会这样?

1 个答案:

答案 0 :(得分:30)

  

有没有办法像资源文件一样覆盖java类?

没有。 Android工具团队的Xavier Ducrohet对此进行了简要的讨论here

有很多方法可以实现你想要的东西 - 更多的是在一秒钟内完成。

  

为什么会这样?

您的Java代码需要编译。假设您从Foo源集中的其他类引用了一个类main,那么Foo类必须具有相同的公共API,无论正在编译什么样的风格。如果您能够使用特定于风格的Foo完全替换主Foo,则可能不适用。这当然不是用工具解决的一个不可能解决的问题,但目前的构建工具的解决方案就是不让你这么做。

当然,对于像图像这样的资源,这是完全不同的 - 只要存在某个版本的资源,Android就可以正常使用它。

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