产品风味:发现重复的类

Posted

技术标签:

【中文标题】产品风味:发现重复的类【英文标题】: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模块 Android gradle buildTypes: Duplicate class的可能重复 你可以看看我的回答:***.com/questions/28563632/… 【参考方案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 我想你可以创建一个单独的模块来跨风格共享代码。 或者为此添加另一个风味维度。

以上是关于产品风味:发现重复的类的主要内容,如果未能解决你的问题,请参考以下文章

添加产品风味以响应本机 android 项目

如何自定义产品风味的 APK 文件名?

如何在产品风味中使用不同的启动器活动?

在 Gradle 产品风味上调试签名配置

Android Studio 产品风味

在处理 Proguard、MultiDex、测试和产品风味时,啥是好的策略?