产品风味:找到重复的类

soc*_*qwe 34 android kotlin android-gradle-plugin android-productflavors

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

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

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

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


android {
  ...
  productFlavors {
    foo {
      applicationId "com.foo"
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

我的文件结构如下:

 - src
    - androidTest
    - foo
      - java
        - com
          - example
            - Bar.kt
    - main
      - java
        - com
          - example
            - Bar.kt
    - test
Run Code Online (Sandbox Code Playgroud)

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

任何提示?

mie*_*sol 50

变体的文档说明(强调我的):

注意:对于给定的构建变体,如果Gradle遇到两个或多个定义了相同Java类的源集目录,则会抛出构建错误.例如,在构建调试APK时,您无法同时定义src/debug/Utility.java和src/main/Utility.java.这是因为Gradle在构建过程中查看这两个目录并抛出"重复类"错误.如果您希望不同版本的Utility.java用于不同的构建类型,则可以让每个构建类型定义其自己的文件版本,而不是将其包含在主/源集中.

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

  • 如果我说4-5种口味,其中3种使用相同的类,并且使用特定代码,我是否需要在任何地方复制它或者sourceSets可以做到这一点?无法使用源集 (10认同)
  • @AkhilDad我想你可以创建一个单独的模块来分享各种风格的代码. (3认同)

Sem*_*cer 17

正如miensol所说,你不能把你的文件放到main特定的文件夹中,并且期望gradle以与android资源系统相同的方式工作.但我找到了一种方法来做到这一点,没有代码重复,所以你不必将你复制Bar.kt到你拥有的每个flavor文件夹.

所以,假设你有三种开发,生产模拟.你希望你的特殊模拟Bar.kt模拟,但在开发prod风格的正常实现.你把你的模拟文件放到mock flavor特定的文件夹中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')
        }
    }

}
Run Code Online (Sandbox Code Playgroud)


Viv*_*nde 6

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

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

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

有关更多详细信息,请参见使用源集构建

- 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)**
Run Code Online (Sandbox Code Playgroud)