【问题标题】:Why won't gradle override Java classes in different Android flavors?为什么 gradle 不会覆盖不同 Android 风格的 Java 类?
【发布时间】:2015-10-22 09:51:27
【问题描述】:

我有一个具有 2 种风格的 android 应用程序: -风味1 -风味2

我的目录树是:

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

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

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

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

【问题讨论】:

  • "有没有办法像资源文件一样覆盖 java 类?" - AFAIK,不。 “为什么会这样?” -- AFAIK,这是 Java 代码的标准 Gradle 源集行为。

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


【解决方案1】:

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

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

虽然有很多方法可以实现您想要的,但稍后会详细介绍。

为什么会这样?

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

当然对于图片之类的资源,这完全不同——只要存在某个版本的资源,Android就可以正常使用。

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

【讨论】:

  • 如果我要创建 Foo 的特定风味实现(在我的情况下,它是一个活动)而不在我的 main 源集中提供它,这意味着 @ 的包名称每种口味的 987654334@ 课程都会有所不同。这是否意味着我必须动态获取Foo 的包名称(因此容易出错),以防我打算从main 源集启动Foo
  • 回答我自己上面的评论 - 这里的关键是将Foo 放在通用包名称中(在每种口味中),而不是放在完整包中。
猜你喜欢
  • 1970-01-01
  • 2011-02-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-28
  • 2019-07-13
  • 2013-07-05
相关资源
最近更新 更多