我有一个有2种口味的Android应用程序: -flavor1 -flavor2
我的目录树是:
/src/main
/src/flavor1
/src/flavor2
main具有默认的源设置。 flavor1和flavor2目录有自己的源集,gradle自动获取。如果我将一个资源文件添加到flavor目录中,它会从main覆盖它,并且工作正常。
但是,如果我在flavor2中添加一个java类来覆盖" main"中的另一个(例如,在flavor2中需要不同的活动),它不会替换它并且它说我的项目中有一个重复的类。我只是通过删除" main"中的类来实现这一点。目录并将其添加到所有flavor文件夹。
有没有办法像资源文件一样覆盖java类?为什么会这样?
答案 0 :(得分:30)
有没有办法像资源文件一样覆盖java类?
没有。 Android工具团队的Xavier Ducrohet对此进行了简要的讨论here。
有很多方法可以实现你想要的东西 - 更多的是在一秒钟内完成。
为什么会这样?
您的Java代码需要编译。假设您从Foo
源集中的其他类引用了一个类main
,那么Foo
类必须具有相同的公共API,无论正在编译什么样的风格。如果您能够使用特定于风格的Foo
完全替换主Foo
,则可能不适用。这当然不是用工具解决的一个不可能解决的问题,但目前的构建工具的解决方案就是不让你这么做。
当然,对于像图像这样的资源,这是完全不同的 - 只要存在某个版本的资源,Android就可以正常使用它。
但是,您可以创建要在main
源集中使用的类的特定于风格的实现。最简单的方法是在每种风格中只添加Foo
,而不在Foo
来源集中提供main
。对于奖励积分,请在main
源集中为这些实现创建一个接口,以确保特定于flavor的实现符合相同的接口,并且不会导致构建错误。