产品风味:找到重复的类

时间:2016-05-25 13:45:46

标签: android android-gradle kotlin android-productflavors

我有一个非常愚蠢的问题,但我已经在我的应用程序前面坐了几个小时,但我无法理解问题所在。

我有一个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

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

任何提示?

3 个答案:

答案 0 :(得分:42)

The documentation for variants州(强调我的):

  

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

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

答案 1 :(得分:14)

正如miensol所说,你不能把你的文件放到main并调整特定的文件夹,并期望gradle以与android资源系统相同的方式工作。但我找到了一种方法,可以在没有代码重复的情况下执行此操作,因此您无需将Bar.kt复制到您拥有的每个flavor文件夹中。

因此,假设您有三种口味 dev prod mock 。您希望模拟中的特殊模拟Bar.kt,但 dev prod 风格中的正常实现。您将模拟文件放到模拟特定于风险的文件夹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')
        }
    }

}

答案 2 :(得分:4)

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

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

然后,您需要进行如下更改,将ShoppingCartActivity置于所有三种样式(也包括B)中,并从main删除,并将文件声明为除main manifest之外的所有清单文件

有关更多详细信息,请检查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)**