【问题标题】:Product Flavor: Duplicate class found产品风味:发现重复的类
【发布时间】:2016-09-23 04:12:00
【问题描述】:

我有一个问题,但几个小时以来我一直坐在我的应用程序前,但我不明白问题出在哪里。

我有一个 android 应用程序(用 kotlin 编写),我想制作两种产品风格并覆盖产品风格中的类/文件:

所以我的 gradle 脚本是这样的:

apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'


android {
  ...
  productFlavors {
    foo {
      applicationId "com.foo"
    }
  }
}

我的文件结构如下:

 - src
    - androidTest
    - foo
      - java
        - com
          - example
            - Bar.kt
    - main
      - java
        - com
          - example
            - Bar.kt
    - test

所以基本上我想在foo 产品风味中覆盖Bar.kt 文件,但不知何故它不起作用:它说类 Bar 是重复的。

有什么提示吗?

【问题讨论】:

  • 不应该只在您定义的风味中存在特定风味的来源(即不在主中)?因此,您至少要定义两种风格,并且这些风格的源集中只有 Bar.kt。
  • 嗯,也许你是对的......实际上我正在尝试覆盖一个匕首模块......所以Bar.kt实际上是一个匕首2模块
  • 你可以看看我的回答:stackoverflow.com/questions/28563632/…

标签: android android-gradle-plugin kotlin android-productflavors


【解决方案1】:

如果您有多种口味,例如 A、B 和 C

您的主代码包含所有活动,对于 A 和 C 风格,您希望更改某些活动的某些功能,例如 ShoppingCartActivity

然后您需要进行如下更改,将 ShoppingCartActivity 放入所有三种风格(包括 B 也是)并从 main 中删除并将文件声明到除 main manifest 之外的所有清单文件中 p>

更多详情请查看Build with source sets

- A
  - java
    - com
      - example
        - ShoppingCartActivity.kt(some changes)

- B
  - java
    - com
      - example
        - ShoppingCartActivity.kt

- C
  - java
    - com
      - example
        - ShoppingCartActivity.kt(new changes added)

- main
  - java
    - com
      - example
        **(remove from here)**

【讨论】:

  • 有什么方法可以在 main 上使用 ShoppingCartActivity 的基础,以防万一我在其他风味中还有另一个,所以我改用风味?
【解决方案2】:

正如 miensol 所说,您不能将文件放到 main 和风味特定文件夹中,并期望 gradle 以与 android 资源系统相同的方式工作。但我找到了一种无需重复代码即可做到这一点的方法,因此您不必将 Bar.kt 复制到您拥有的每个风味文件夹中。

假设您有 devprodmock 三种风格。您希望在 mock 中特别模拟 Bar.kt,但在 devprod 风格中正常实现。您将模拟文件放入 mock 风味特定文件夹 mock/java/com/something/ 并将“默认”实现放入具有随机名称的新文件夹,例如 non-mock/java/com/something/ 将其命名为“common”之类的名称也会使感觉。现在你必须告诉 gradle 这些风味应该在哪里寻找它们的 Bar.kt 类。

把这个放到你的build.gradle:

android {
    ...
    sourceSets {
        prod {
            java.srcDirs('src/non-mock/java')
        }
        dev {
            java.srcDirs('src/non-mock/java')
        }
    }

}

【讨论】:

  • 完美运行,使用 AS 3.4.2。谢谢!
【解决方案3】:

The documentation for variants 状态(强调我的):

注意:对于给定的构建变体,Gradle 会抛出构建错误,如果它 遇到两个或多个定义了 相同的 Java 类。例如,在构建调试 APK 时,您不能 定义 src/debug/Utility.java 和 src/main/Utility.java。这是 因为 Gradle 在构建期间会查看这两个目录 处理并引发“重复类”错误。如果你想要不同 不同构建类型的 Utility.java 版本,您可以拥有每个 构建类型定义它自己的文件版本并且不包含它 主/源集

因此解决方案是为每个变体拥有自己的Bar.kt 版本,并将其从主要源集中排除。

【讨论】:

  • 如果我说 4-5 种风格,其中 3 种使用相同的类并且集合使用特定代码,我需要在任何地方复制它还是 sourceSets 可以做到?无法处理源集
  • @AkhilDad 我想你可以创建一个单独的模块来跨风格共享代码。
  • 或者为此添加另一个风味维度。
猜你喜欢
  • 1970-01-01
  • 2020-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-29
  • 2013-06-07
  • 2021-03-07
相关资源
最近更新 更多