我有一个非常愚蠢的问题,但我已经在我的应用程序前面坐了几个小时,但我无法理解问题所在。
我有一个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是重复的。
任何提示?
答案 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)**