Вкус продукта: найден дубликат класса
У меня очень глупый вопрос, но я сижу здесь перед моим приложением с часами, но я не понимаю, в чем проблема.
У меня есть приложение для 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)**