Вкус продукта: найден дубликат класса

У меня очень глупый вопрос, но я сижу здесь перед моим приложением с часами, но я не понимаю, в чем проблема.

У меня есть приложение для Android (написано в kotlin), и я хочу сделать два аромата продукта и переопределить класс/файл в продукте:

Поэтому мой сценарий градиента таков:

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 в Bar.kt foo, но почему-то это не работает: он говорит, что класс Bar дублируется.

Любой намек?

Ответ 1

Документация для вариантов состояний (акцент мой):

Примечание. Для данного варианта сборки Gradle выдает ошибку сборки, если он сталкивается с двумя или более каталогами исходных наборов, которые определили один и тот же Java-класс. Например, при создании отладочной APK вы не можете определить как src/debug/Utility.java, так и src/main/Utility.java. Это связано с тем, что Gradle просматривает оба этих каталога во время процесса сборки и выдает ошибку "duplicate class". Если вам нужны разные версии Utility.java для разных типов сборки, вы можете указать, что каждый тип сборки определяет собственную версию файла и не включает его в основной/исходный набор.

Поэтому решение состоит в том, чтобы иметь собственную версию Bar.kt каждого варианта и исключить ее из основного источника.

Ответ 2

Как указано в miensol, вы не можете поместить свой файл в main и специфичные для вас патчи и ожидать, что gradle будет работать так же, как работает ресурсная система Android. Но я нашел способ сделать это без дублирования кода, поэтому вам не нужно копировать свой Bar.kt в каждую папку с ароматом, которую у вас есть.

Итак, скажем, у вас есть три аромата dev, prod и mock. Вы хотите, чтобы ваш специальный Bar.kt в макете, но обычная реализация в dev и prod- аксессуарах. Вы помещаете свой издеваемый файл в папку с mock/java/com/something/ определенную в стиле fock mock/java/com/something/ и вы помещаете свою реализацию по умолчанию в новую папку с некоторым случайным именем, например non-mock/java/com/something/ именовав его чем-то вроде " общий "также имеет смысл. Теперь вам нужно рассказать о граде, где эти ароматы будут искать свой класс Bar.kt

Поместите это в свой build.gradle:

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

}

Ответ 3

Если у вас есть несколько вкусов, как A, B и C

и ваш основной код содержит все действия, и для вкуса A и C вы хотите изменить некоторые функции некоторых действий ex- ShoppingCartActivity

затем вам нужно внести некоторые изменения, как показано ниже, поместить ShoppingCartActivity во все три разновидности (включая B), удалить из основного и объявить файл во всех файлах манифеста, кроме основного манифеста

для более подробной информации проверьте Build с исходными наборами

- 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)**